참고 글
16. Opening & Closing
Opening 열림
Opening은 erosion 후에 dilation을 적용한다. 열림을 적용하면 침식으로 인해 밝은 영역이 줄어들고 어두운 영역이 늘어난다. 여기서 줄어든 영역을 다시 복구하기 위해 팽창을 적용하면 반대로 어두운 영역이 줄어들고 밝은 영역이 늘어나 작은 object나 돌기 제거에 적합한 이미지 변환방법이다.
Opening을 사용하는 방법은 이 전에 했던 cv2.erode를 사용해 erosion을 적용해 침식한 후 cv2.dilate로 팽창하는 방법과 cv2.morphologyEx 함수를 사용하는 방법이 있다.
1. cv2.erode -> cv2.dilate
import cv2
import numpy as np
kernel = np.ones((3, 3), dtype = np.uint8)
img = cv2.imread("erode.png", cv2.IMREAD_GRAYSCALE)
# Opening
# 원본 이미지에 erosion 적용
erode = cv2.erode(img, kernel, iterations = 3)
# erosion이 적용된 이미지에 dilation 적용
dilate = cv2.dilate(erode, kernel, iterations = 3)
cv2.imshow("origin", img) # 원본 이미지
cv2.imshow("Opening", dilate) # Opening 적용 이미지
cv2.waitKey(0)
cv2.destroyAllWindows()
Opening이 적용된 이미지를 보면 아직 주변에 흰색 점들이 남아있지만 글씨는 많이 복원되었음을 확인할 수 있다. 침식과 팽창의 반복 횟수를 조절하여 어느 정도 원본에 가깝게 Opening을 적용할 수 있음을 알 수 있다.
2. cv2.morphologyEx
cv2.morphologyEx(src, op, kernel, anchor, iterations)
여기서 op은 다음에서 적용할 유형을 선택한다.
- cv2.MORPH_OPEN : Opening 적용
- cv2.MORPH_CLOSE : Closing 적용
- MORPH_GRADIENT : 입력 이미지에 각각 dilate와 erode를 적용하고 감산
이 외에도 입력이미지(src)와 Opening을 조합한 MORPH_TOPHAT과 입력이미지(src)와 Closing을 조합한 MORPH_BLACKHAT이 있다.
cv2.morphologyEx함수를 사용해 Opening을 적용하면 다음과 같이 나타낼 수 있다.
import cv2
import numpy as np
kernel = np.ones((3, 3), dtype = np.uint8)
img = cv2.imread("erode.png", cv2.IMREAD_GRAYSCALE)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, iterations = 3)
cv2.imshow("origin", img)
cv2.imshow("Opening", opening)
cv2.waitKey(0)
cv2.destroyAllWindows()
Closing 닫힘
Closing은 Opening과 반대로 dilation 후 erosion을 적용한다. 닫힘은 팽창으로 인해 어두운 영역이 줄어들과 밝은 영역이 늘어난다. 늘어난 영역을 다시 복구하기 위해 침식 연산을 적용하면 밝은 영역이 줄어들고 어두운 영역이 늘어나 전체적인 윤곽 파악에 적합하다.
Closing 또한 Opening과 같이 cv2.dilate를 사용해 이미지를 팽창시킨 후 cv2.erode로 침식하는 방법과 cv2.morphologyEx 함수를 사용하는 방법이 있다.
1. cv2.dilate -> cv2.erode
import cv2
import numpy as np
kernel = np.ones((3, 3), dtype = np.uint8)
img = cv2.imread("dilate.png", cv2.IMREAD_GRAYSCALE)
# Closing
# 원본 이미지에 dilation 적용
dilate = cv2.dilate(img, kernel, iterations = 4)
closing = cv2.erode(dilate, kernel, iterations = 4)
cv2.imshow("origin", img)
cv2.imshow("closing", closing)
cv2.waitKey(0)
cv2.destroyAllWindows()
Closing이 적용된 이미지를 보면 원본 이미지 글씨에 있던 검은 점들이 모두 흰색으로 변했고, 두꺼워졌던 글씨가 적당히 원본과 비슷한 두께로 변환된 것을 통해 dilate와 erode 모두 잘 적용이 되었음을 확인할 수 있다.
2. cv2.morphologyEx
Opening때와 사용방법은 동일하며 다만 op값에 cv2.MORPH_CLOSE를 적용하여 실행한다.
import cv2
import numpy as np
kernel = np.ones((3, 3), dtype = np.uint8)
img = cv2.imread("dilate.png", cv2.IMREAD_GRAYSCALE)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel, iterations = 4)
cv2.imshow("origin", img)
cv2.imshow("closing", closing)
cv2.waitKey(0)
cv2.destroyAllWindows()
'Study > ML | DL' 카테고리의 다른 글
[Python] OpenCV를 이용한 이미지/영상 처리 - 이미지 윤곽선(Image Contours) (0) | 2023.06.27 |
---|---|
[Python] OpenCV를 이용한 이미지/영상 처리 - 이미지 경계선 (0) | 2023.06.16 |
[Python] OpenCV를 이용한 이미지/영상 처리 - 모폴로지 변환(dilate, erode) (1) | 2023.06.13 |
[Python] OpenCV를 이용한 이미지/영상 처리 - Adaptive Threshold, otsu algorithm Threshold (0) | 2023.06.08 |
[Python] OpenCV를 이용한 이미지/영상 처리 - 이진화(Binarization), TrackBar (0) | 2023.06.07 |