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
# 실행 결과
- 원본영상, 커널 기반 처리 영상, 기존의 방법으로 처리한 영상
# 느낀 점
- 커널을 구하는 과정이 맞는지에 대한 확신이 없음
- 이러한 방법으로 커널을 구하는 것이 아닌 거 같음
- 수업시간에 라플라시안 필터를 콘볼루션 한 영상이라는 것을 듣고 구현하였음
- 아직 영상처리에 대한 개념이 매우 부족하다는 것을 느낌
반응형
'전공 공부 > 영상처리' 카테고리의 다른 글
푸리에 변환 기반의 블러링 검출 (1) | 2020.12.29 |
---|---|
Chroma Key Editor (0) | 2020.12.29 |
UnsharpMasking 트랙 바로 시그마, 스케일 조정 (0) | 2020.12.29 |
히스토그램 명세화 작업 후 r,g,b 채널별 히스토그램 출력 (0) | 2020.12.29 |
히스토그램 스트레칭 함수 구현 (0) | 2020.12.29 |