본문으로 바로가기

Gradient (cv2.MORPH_GRADIENT)

Gradient 연산은 엣지를 검출할 때 사용합니다.

Gradient = 팽창(dilation) - 침식(erosion)

커널 크기에 따른 차이

 

Tophat (cv2.MORPH_TOPHAT)

Tophat 연산은 밝기 값이 크게 변화하는 영역을 강조합니다.

Tophat = 원본 - Opening

커널 크기에 따른 차이

 

Blackhat (cv2.BLACKHAT)

Blackhat 연산은 어두운 부분을 강조합니다.

Blackhat = Closing - 원본

커널 크기에 따른 차이

 

코드

저는 트랙바를 이용하여 커널 크기에 따른 차이를 만들어보았는데요.

다른 것도 비교해보시면 좋을 것 같습니다.

import os
import cv2
import numpy as np

path = os.path.join('img', 'img.jpg')
src = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
op_idx = {
    'gradient': cv2.MORPH_GRADIENT,
    'tophat': cv2.MORPH_TOPHAT,
    'blackhat': cv2.MORPH_BLACKHAT,
}

def onChange(k, op_name):
    if k == 0:
        cv2.imshow(op_name, src)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (k, k))
    dst = cv2.morphologyEx(src, op_idx[op_name], kernel)
    cv2.imshow(op_name, dst)

cv2.imshow('src', src)
cv2.imshow('gradient', src)
cv2.imshow('tophat', src)
cv2.imshow('blackhat', src)

cv2.createTrackbar('k', 'gradient', 0, 300, lambda x: onChange(k=x, op_name='gradient'))
cv2.createTrackbar('k', 'tophat', 0, 300, lambda x: onChange(k=x, op_name='tophat'))
cv2.createTrackbar('k', 'blackhat', 0, 300, lambda x: onChange(k=x, op_name='blackhat'))

cv2.waitKey()
cv2.destroyAllWindows()