Language - Python(Opencv)

Python Opencv - #27, 영상의 모폴리지

KimTory 2021. 11. 23. 22:06

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

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

 

이진 영상

 

열기 적용

 

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

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

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

 

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

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

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

 

이진 영상

 

닫기 적용

 

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

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

 

함수 설명

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

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

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

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

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개로 감소하였습니다.