반응형


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()





반응형

진행해본 결과물을 기록 및 공유하는 공간입니다.
잘못된 부분이나 개선점을 알려주시면 반영하겠습니다.


소스코드 복사시 하단에 있는 앵커 광고의 왼쪽 위를 클릭하여 닫은 후 해야 합니다.


문제가 생기면 포스트와 바뀐 환경이 있나 먼저 확인해보세요.
질문을 남겨주면 가능한 빨리 답변드립니다.


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

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

TistoryWhaleSkin3.4">