[ch04] 필터링 - 샤프닝 : 언샤프 마스크 필터

빨주노·2021년 8월 20일
0

언샤프 마스크(Unsharp mask) 필터링

  • 날카롭지 않은(unsharp) 영상, 즉 부드러워진 영상을 이용하여 날카로운 영상을 생성

언샤프 마스크 필터 구현하기

src = cv2.imread('rose.bmp', cv2.IMREAD_GRAYSCALE)
src_f = src.astype(np.float32)
blr = cv2.GaussianBlur(src_f, (0, 0), 2.0)
dst = np.clip(2. * src_f - blr, 0, 255).astype(np.uint8)

dst 영상이 src에 비해 날카로운 느낌이 난다.

  • 샤프닝 정도를 조절할 수 있도록 수식 변경
src = cv2.imread('rose.bmp', cv2.IMREAD_GRAYSCALE)
blr = cv2.GaussianBlur(src, (0, 0), 2)

def on_trackbar(pos):
    alpha = cv2.getTrackbarPos('alpha x 10', 'dst')
     
    dst = np.clip((1.0+alpha/10)*src - alpha/10*blr, 0, 255).astype(np.uint8)
    cv2.imshow('dst', dst)

cv2.imshow('src', src)
cv2.namedWindow('dst')
cv2.createTrackbar('alpha x 10', 'dst', 0, 10, on_trackbar)
on_trackbar(0)
cv2.waitKey()
cv2.destroyAllWindows()

트랙바를 움직이면 샤프닝이 변하는 것을 관찰할 수 있다.
(createTrackbar에 정수 인자만 입력할 수 있으므로, 0과 10으로 설정하고 대신 실제 alpha는 0과 1 사이에서 움직이게 하였다.)

컬러 영상에 대한 언샤프 마스크 필터 구현하기

src = cv2.imread('rose.bmp')
src_ycrcb = cv2.cvtColor(src, cv2.COLOR_BGR2YCrCb)

# 실수 형태로 연산(float32)
src_f = src_ycrcb[:, :, 0].astype(np.float32)
blr = cv2.GaussianBlur(src_f, (0, 0), 2.0)
# 최종 결과는 정수로(uint8)
src_ycrcb[:, :, 0] = np.clip(2. * src_f - blr, 0, 255).astype(np.uint8)

dst = cv2.cvtColor(src_ycrcb, cv2.COLOR_YCrCb2BGR)

profile
딥 하게 딥러닝 하는중

0개의 댓글

관련 채용 정보