반응형


OpenCV에서 제공하는 Erosion, Dilation, Opening, Closing 연산하는 함수들을 다룹니다.

보통 바이너리 이미지(Binary Image)에서 흰색으로 표현된 오브젝트의 형태를 개선하기 위해 사용됩니다.



마지막 업데이트 - 2018. 10. 14




다음 OpenCV Python 튜토리얼을 참고하여 강좌를 비정기적로 포스팅하고 있습니다.


https://docs.opencv.org/3.4.3/d6/d00/tutorial_py_root.html






   1. Erosion


   2. Dilation


   3. Opening


   4. Closing




1. Erosion

바이너리 이미지에서 흰색 오브젝트의 외곽 픽셀을 0(검은색)으로 만듭니다.

노이즈(작은 흰색 물체)를 제거하거나 붙어 있는 오브젝트들을 분리하는데 사용할 수 있습니다.


kernel = np.ones((5, 5), np.uint8)
result = cv2.erode(img, kernel, iterations = 1)




사용한 커널의 크기에 따라  오브젝트 외곽에서 0이 되는 픽셀의 정도가 달라집니다.


kernel = np.ones((5, 5), np.uint8)



커널의 크기를 특정 크기(3, 3)으로 고정하고  Erosion 반복 횟수를 증가시켜서도 오브젝트 외곽에서 0이 되는 픽셀의 정도를 조절할 수 있습니다.


kernel = np.ones((3, 3), np.uint8)
result = cv2.erode(img, kernel, iterations = 1)





테스트에 사용한 원본 이미지와 코드입니다.




import cv2
import numpy as np


img = cv2.imread('j.png',0)

kernel = np.ones((5, 5), np.uint8)
result = cv2.erode(img, kernel, iterations = 1)

cv2.imshow("Source", img)
cv2.imshow("Result", result)

cv2.waitKey(0)
cv2.destroyAllWindows()




2. Dilation

Erosion과 반대로 동작합니다. 바이너리 이미지에서 흰색 오브젝트의 외곽 픽셀 주변에 1(흰색)으로 추가합니다.  

노이즈(작은 흰색 오브젝트)를 없애기 위해 사용한 Erosion에 의해서 작아졌던 오브젝트를 원래대로 돌리거나 인접해 있는 오브젝트들을 하나로 만드는데 사용할 수 있습니다.


kernel = np.ones((5, 5), np.uint8)
result = cv2.dilate(img, kernel, iterations = 1)



사용한 커널의 크기에 따라  오브젝트 외곽에서 1이 되는 픽셀의 정도가 달라집니다.


kernel = np.ones((5, 5), np.uint8)




커널의 크기를 특정 크기(3, 3)으로 고정하고  Dilation 반복 횟수를 증가시켜서도 오브젝트 외곽에서 1이 되는 픽셀의 정도를 조절할 수 있습니다.


kernel = np.ones((3, 3), np.uint8)
result = cv2.dilate(img, kernel, iterations = 1)





테스트에 사용한 원본 이미지와 코드입니다.



import cv2
import numpy as np


img = cv2.imread('j.png',0)

kernel = np.ones((5, 5), np.uint8)
result = cv2.dilate(img, kernel, iterations = 1)

cv2.imshow("Source", img)
cv2.imshow("Result", result)

cv2.waitKey(0)
cv2.destroyAllWindows()



3. Opening

Erosion 연산 다음에 Dilation 연산을 적용합니다.  이미지 상의 노이즈(작은 흰색 물체)를 제거하는데 사용합니다.

노이즈(작은 흰색 오브젝트)를 없애기 위해 사용한 Erosion에 의해서 작아졌던 오브젝트에 Dilation 를 적용하면  오브젝트가 원래 크기로 돌아오게 됩니다.


kernel = np.ones((5, 5), np.uint8)
result = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)





테스트에 사용한 원본 이미지와 코드입니다.



import cv2
import numpy as np


img = cv2.imread('j-noise.png',0)

kernel = np.ones((5, 5), np.uint8)
result = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

cv2.imshow("Source", img)
cv2.imshow("Result", result)

cv2.waitKey(0)
cv2.destroyAllWindows()




4. Closing

Opening과 반대로 Dilation 연산을 먼저 적용한 후,  Erosion 연산을 적용합니다.

희색 오브젝트에 있는 작은 검은색 구멍들을 메우는데 사용합니다.


kernel = np.ones((11, 11), np.uint8)
result = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)




커널 크기를 조절하면 검은 구멍을 메우는 정도가 달라집니다.



테스트에 사용한 원본 이미지와 코드입니다.



import cv2
import numpy as np


img = cv2.imread('test.png',0)

kernel = np.ones((11, 11), np.uint8)
result = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

cv2.imshow("Source", img)
cv2.imshow("Result", result)

cv2.waitKey(0)
cv2.destroyAllWindows()





반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts