Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 영상의 모폴로지 - 열기와 닫기 - cv2.morphologyEx

AI 꿈나무 2020. 10. 10. 21:32
반응형

황선규 박사님의 'OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝' 을 공부하면서 정리해 보았습니다.

 

예제 코드 출처 :  황선규 박사님 github홈페이지

 

『OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝』

예제 소스 코드는 아래 링크를 참고하세요

sunkyoo.github.io


 

 

[파이썬 OpenCV] 영상의 모폴로지 - 침식과 팽창 - cv2.erode, cv2.dilate, cv2.getStructuringElement

황선규 박사님의 'OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝' 을 공부하면서 정리해 보았습니다. 예제 코드 출처 :  황선규 박사님 github홈페이지 『OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝』 �

deep-learning-study.tistory.com

 이전 포스팅에서 모폴로지 방법인 침식과 팽창에 대해 공부했습니다.

 이번에는 침식과 팽창을 활용하는 열기와 닫기에 대해 알아보겠습니다.

 

1. 이진 영상의 열기(opening) 연산

 이진 연산의 열기 연산은 이진 영상에 침식을 적용하고 팽창을 적용하는 기법입니다.

 

이진 영상

 

열기 적용

 

 열기 연산을 적용함으로써 작은 돌기, 작은 객체가 사라지고 얇은 연결선이 끊어집니다.

 열기는 모양이 단순해지긴 하지만 한 두 픽셀 노이즈에 해당하는 객체가 사라지기 때문에 사람들이 많이 사용합니다.

 열기 연산은 노이즈를 제거하는 용도로 많이 이용합니다.

 

2. 이진 영상의 닫기(closing) 연산

 닫기 연산은 팽창을 적용하고 침식을 적용하는 기법입니다. 

 작은 홈, 작은 홀들이 사라지고, 얇은 연결선이 두꺼워 집니다.

 

이진 영상

 

닫기 적용

 

3. 범용 모폴로지 연산 함수 - cv2.morphologyEx

 범용 모폴로지 연산 함수는 침식과 팽창, 열기와 닫기 그 외에도 모폴로지 그래디언트를 지원합니다.

 

함수 설명

cv2.morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None) -> dst

• src: 입력 영상.
• op: 모폴로지 연산 플래그.

• kernel: 커널
• dst: 출력 영상

4. 열기 연산을 이용한 잡음 제거 예제

 예제 코드는 황선규 박사님의 깃허브를 참고했습니다. sunkyoo.github.io/opencv4cvml/

 

src = cv2.imread('rice.png', cv2.IMREAD_GRAYSCALE)

if src is None:
    print('Image load failed!')
    sys.exit()

# src 영상에 지역 이진화 수행
dst1 = np.zeros(src.shape, np.uint8)

bw = src.shape[1] // 4
bh = src.shape[0] // 4

for y in range(4):
    for x in range(4):
        src_ = src[y*bh:(y+1)bh, x*bw:(x+1)bw]
        dst_ = dst[y*bh:(y+1)bh, x*bw:(x+1)bw]
        cv2.threshold(src_, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU, dst_)
        
# 영상 안에 있는 흰색 덩어리를 정수 형태로 리턴
cnt1, _ = cv2.connectedComponents(dst1)
print('cnt1:', cnt1)

# 모폴로지 열기
dst2 = cv2.morphologyEx(dst1, cv2.MORPH_OPEN, None)

# 영상 안에 있는 흰색 덩어리를 정수 형태로 리턴
cnt2, _ = cv2.connectedComponents(dst2)
print('cnt2:', cnt2)

cv2.imshow('src', src)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
cv2.waitKey()
cv2.destroyAllWindows()

 

원본 영상

 

지역 이진화 영상
열기 연산

 

 

 작은 픽셀 들이 사라져 노이즈가 감소된 것을 확인할 수 있습니다.

 또한 흰색 덩어리가 113개에서 99개로 감소하였습니다. 

 

 

반응형