앞선 '1주차_2'에서 이미지 블러처리 및 이진화 처리까지 알아보았다. 이제 이진화 된 이미지를 morphing 처리 및 가장자리 검출을 해보려한다.
모폴로지 변환은 영상이나 이미지를 형태학적 관점에서 접근하는 기법을 의미한다.
노이즈 제거, 요소 결합 및 분리, 강도 피크 검출 등에 이용할 수 있다.
기본적인 모폴로지 변환으로는 팽창(dilation)과 침식(erosion)이 있다.
팽창은 커널 영역안에 존재하는 모든 픽셀의 값을 커널 내부의 극댓값으로 대체, 침식은 극솟값으로 대체한다.
팽창은 침식으로 노이즈 제거 후에 주로 줄어든 크기를 복구하고자 할 때 주로 사용한다.
# 구조 요소 생성 함수
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (x,y))
| 속성 | 설명 |
|---|---|
| cv2.MORPH_RECT | 직사각형 형태 |
| cv2.MORPH_CROSS | 십자가 형태 |
| cv2.MORPH_ELLIPSE | 타원 형태 |
모폴로지 연산은 모폴로지 변환의 팽창, 침식을 기본 연산으로 사용해 고급형태학을 적용하는 변환 연산이다.
입력 이미지가 이진화된 이미지라면 팽창과 침식 연산으로도 우수한 결과를 얻을 수 있지만, 그레이스케일이나 다중 채널 이미지를 사용하는 경우 더 복잡한 연산이 필요하다.
# 모폴로지 연산 코드
image = cv2.morphologyEx(image, cv2.MORPH_TYPE, kernel)
| 속성 | 설명 |
|---|---|
| cv2.MORPH_DILATE | 팽창 연산 |
| cv2.MORPH_ERODE | 침식 연산 |
| cv2.MORPH_OPEN | 열림 연산 |
| cv2.MORPH_CLOSE | 닫힘 연산 |
| cv2.MORPH_GRADIENT | 모폴로지 그레이디언트 |
| cv2.MORPH_TOPHAT | 탑햇 연산 |
| cv2.MORPH_BLACKHAY | 블랙햇 연산 |
| cv2.MORPH_HITMISS | 히트미스 연산 |
원본 이미지
그레이스케일 변환, GaussianBlur, 이진화 처리 후
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
morp = cv2.morphologyEx(thresh.copy(), cv2.MORPH_DILATE, kernel) 처리 결과
그레이스케일 변환, GaussianBlur, 이진화 처리 후
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
morp = cv2.morphologyEx(thresh.copy(), cv2.MORPH_ERODE, kernel) 처리 결과
그레이스케일 변환, GaussianBlur, 이진화 처리 후
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
morp = cv2.morphologyEx(thresh.copy(), cv2.MORPH_GRADIENT, kernel) 처리 결과
가장자리(Edge)는가장 바깥 부분의 둘레를 의미하며, 객체의 테두리로 볼 수 있다.
이미지에서 픽셀의 밝기가 낮은 값에서 높은 값으로 변하거나 높은 값에서 낮은 값으로 변하는 지점이 가장자리가 된다.
이러한 가장자리를 검출하는 방식으로는 크게 소벨 미분(Sobel derivative), 샤르 필터(Scharr filter), 라플라시안(Laplacian), 캐니 엣지(Canny Edge)가 있다.
# MORPH_GRADIENT 적용한 이미지에 소벨 미분 적용
# edge = cv2.Sobel(src, ddepth, dx, dy, ksize = None, scale=None, delta = None, borderType = None)
edge = cv2.Sobel(morp_img, -1, 0, 1, delta = 128)

# MORPH_GRADIENT 적용한 이미지에 샤르 필터 적용
# edge = cv2.Scharr(src, ddepth, dx, dy, scale=None, delta = None, borderType = None)
edge = cv2.Scharr(morp_img, -1, 0, 1, delta = 128)

# MORPH_GRADIENT 적용한 이미지에 라플라시안 적용
# cv2.Laplacian(src, ddepth, ksize, scale=None, delta = None, borderType = None)
edge = cv2.Laplacian(morp, -1, 3)

# MORPH_GRADIENT 적용한 이미지에 캐니 엣지 적용
# cv2.Canny(src, threshold1(하위임계값), threshold2(상위 임계값), apertureSize = None, L2gradient = None)
edge = cv2.Canny(morp, 50, 80)
