모폴로지 변환 (Morphological Transformation)
Morphological Transformation은 이미지를 분할하여 단순화, 제거, 보정을 통해 형태를 파악하는 목적으로 사용한다. 일반적으로 binary나 grayscale image에 사용된다. 사용하는 방법으로는 Dilation(팽창)과 Erosion(침식), 그리고 이 두 개를 조합한 Opening과 Closing이 있다.
14. Dilation 팽창
이미지 팽창은 이미지를 확장하여 작은 구멍을 채우는 작업이다. 즉 어떤 흰색영역의 외곽 픽셀 주변에 흰색을 추가하여 어두운 영역을 줄이고 밝은 영역을 넓힌다. 따라서 팽창은 노이즈 제거 후 줄어든 크기를 복구하고자 할 때 주로 사용한다.
팽창의 과정을 확인하기 위해 그림판에서 아래와 같은 예시 이미지를 준비한다
위 이미지를 팽창시키기 위해 cv2.dilate 함수를 사용한다.
cv2.dilate(src, kernel, anchor, iteration)
kernel은 원본 이미지에 적용되는 kernel로, 중심을 원점으로 사용할 수도 있고, 원점을 변경할 수도 있다. 일반적으로는 꽉찬 사각형, 타원형, 십자형을 많이 사용한다. kernel은 cv2.getStructuringElement()나 np.ones()와 같은 array형식을 입력한다. anchor은 중심점을 설정한다. (-1, -1)을 default로 한다. iteration은 적용 반복횟수를 나타낸다.
kernel에서 사각형의 경우 numpy를 사용할 수도 있지만 타원형 또는 십자모양의 경우 cv2.getStructuringElemen를 사용한다.
cv2.getStructuringElement(shape, ksize)
shape의 종류는 다음과 같다.
- MORPH_RET : 사각형
- NORPH_ELLIPSE : 타원형
- NORPH_CROSS : 십자모양
이를 바탕으로 위 예시 이미지를 팽창하면 다음과 같다.
import cv2
import numpy as np
# kernel을 정의한다
kernel = np.ones((3, 3), dtype = np.uint8)
# 이미지를 불러온다
img = cv2.imread("dilate.png", cv2.IMREAD_GRAYSCALE)
#반복횟수에 따른 변화를 확인하기 위해 반복횟수를 각각 1, 2, 3회로 한다
dilate1 = cv2.dilate(img, kernel, iterations = 1)
dilate2 = cv2.dilate(img, kernel, iterations = 2)
dilate3 = cv2.dilate(img, kernel, iterations = 3)
# 이미지 출력
cv2.imshow("gray", img) # 원본
cv2.imshow("dilate1", dilate1)
cv2.imshow("dilate2", dilate2)
cv2.imshow("dilate3", dilate3)
cv2.waitKey(0)
cv2.destroyAllWindows()
팽창 결과를 보면 글씨에 찍혀있던 검은 점들이 횟수를 거듭할 수록 많이 사라지는 것을 알 수 있다. 또한 Dilate 글씨 자체도 원본과 3번 반복했을 때를 비교했을 때 두꺼워졌음을 확인할 수 있다.
15. Erode 침식
이미지 침식은 이미지를 축소하여 어떤 흰색영역의 외곽 픽셀을 검은색으로 변경해 밝은 영역을 줄이고 어두운 영역을 넓힌다. 따라서 침식은 노이즈 제거에 주로 사용한다.
침식의 과정을 확인하기 위해 그림판에서 아래와 같은 예시 이미지를 준비한다.
위 이미지를 침식시키기 위해 cv2.erode 함수를 사용한다.
cv2.erode(src, kernel, anchor, iteration)
cv2.erode 함수의 사용방법은 cv2.diate 함수와 비슷하다.
이를 바탕으로 위 예시 이미지를 팽창하면 다음과 같다.
import cv2
import numpy as np
# kernel 크기 정의
kernel = np.ones((3, 3), dtype = np.uint8)
# 이미지 호출
img = cv2.imread("erode.png", cv2.IMREAD_GRAYSCALE)
# 이미지 침식 : iterations = 반복값으로 침식 정도를 조절
erode1 = cv2.erode(img, kernel, iterations = 1)
erode2 = cv2.erode(img, kernel, iterations = 2)
erode3 = cv2.erode(img, kernel, iterations = 3)
# 이미지 출력
cv2.imshow('gray', img)
cv2.imshow("erode1", erode1)
cv2.imshow("erode2", erode2)
cv2.imshow("erode3", erode3)
cv2.waitKey(0)
cv2.destroyAllWindows()
출력결과를 보면 원본에 있던 흰색 노이즈가 반복 횟수를 늘려갈 수록 줄어듦을 확인할 수 있다. 또한 흰색 " Erode " 라는 글씨도 원본과 비교했을 때 점점 얇아지는 것을 알 수 있다.
'Study > ML | DL' 카테고리의 다른 글
[Python] OpenCV를 이용한 이미지/영상 처리 - 이미지 경계선 (0) | 2023.06.16 |
---|---|
[Python] OpenCV를 이용한 이미지/영상 처리 - 모폴로지 변환(Opening & Closing) (0) | 2023.06.14 |
[Python] OpenCV를 이용한 이미지/영상 처리 - Adaptive Threshold, otsu algorithm Threshold (0) | 2023.06.08 |
[Python] OpenCV를 이용한 이미지/영상 처리 - 이진화(Binarization), TrackBar (0) | 2023.06.07 |
[Python] OpenCV를 이용한 반 자동 문서스캐너 구현하기2 - 반 자동 문서 스캐너 구현 (0) | 2023.06.01 |