OpenCV 1주차_3

심민제·2022년 7월 21일

OpenCV

목록 보기
3/3
post-thumbnail

OpenCV를 이용하여 이미지 다루기 2탄

앞선 '1주차_2'에서 이미지 블러처리 및 이진화 처리까지 알아보았다. 이제 이진화 된 이미지를 morphing 처리 및 가장자리 검출을 해보려한다.

이미지 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)

0개의 댓글