728x90
import numpy as np
import cv2 as cv

img = cv.imread('data/lenna.tif')
img = img/255

org = np.zeros((19,19))
org[19//2][19//2] = 1
kernel1d = cv.getGaussianKernel(ksize=19, sigma=3)
kernel2d = np.multiply(kernel1d.T, kernel1d)  # 가우시안 필터 구함

kernel_la = (kernel2d - org)  # 라플라시안 필터 구함
kernel = (org - kernel_la)
np.set_printoptions(precision=4)
print(kernel)

result = cv.filter2D(img, -1, kernel)

blur = cv.GaussianBlur(src=img, ksize=(19,19), sigmaX=3, borderType=cv.BORDER_REPLICATE)
UnsharpMaskImg = img - blur
scale = 1
SharpenedImg = img + scale * UnsharpMaskImg

print(np.sum((result-SharpenedImg)**2))
cv.imshow('output', np.hstack((img, result, SharpenedImg)))
cv.waitKey(0)

# UnsharpMasking

- 고주파 부분을 강조하여 대조비 강화하여 선명한 영상 얻음

- 이를 커널 기반으로 처리하기 위해서 라플라시안 필터를 얻음

- 먼저 입력한 시그마 값에 따른 1차원 가우시안 커널을 얻음

- 1차원 가우시안 커널을 내적하여 2차원 커널로 변환함

- 2차원 커널을 사용하여 라플라시안 필터 구함

- 라플라시안 필터와 영상을 콘볼루션 연산하여 선명한 영상을 얻음

- 이를 기존의 방법과 비교하여 출력함

- 기존의 방법이란 블러링 영상을 구한 후 이를 원본 영상에서 뺀 값과 원본 영상을 더하여 선 명한 영상을 얻은 것을 말함

- 기존의 방법과 커널 기반 처리 방법을 비교해 보았을 때 비슷한 영상이 출력됨

 

# 필요한 모듈 import

- numpy, cv2

 

# 실행 결과

- 원본영상, 커널 기반 처리 영상, 기존의 방법으로 처리한 영상

# 느낀 점

- 커널을 구하는 과정이 맞는지에 대한 확신이 없음

- 이러한 방법으로 커널을 구하는 것이 아닌 거 같음

- 수업시간에 라플라시안 필터를 콘볼루션 한 영상이라는 것을 듣고 구현하였음

- 아직 영상처리에 대한 개념이 매우 부족하다는 것을 느낌

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기