본문 바로가기
OpenCV

OpenCV - Blurring(2) & Sharpening

by winston1214 2020. 12. 16.
반응형

2020/10/28 - [OpenCV] - OpenCV - Convolution & Blurring

 

OpenCV - Convolution & Blurring

Convolution이란 수학적 연산을 각 화소에 적용하고 그 값을 변화시키는 것이다. 여기서 말한 수학적 연산을 하기 위해 kernel 이라고 불리우는 또 다른 행렬을 사용한다. kernel은 입력 영상에 비해 아

bigdata-analyst.tistory.com

 

Blurring에 대한 개념은 그 전글을 참고하면 된다.

 

다양한 블러링에 대해서 알아보겠다.

- Motion Blur

모션 블러란 말그대로 움직이는 것 처럼 보이는 것이다. 그 전까지는 3x3, 5x5 등 필터를 줘서 블러링의 효과를 적용하였다면 이번은 수평 방향으로 블러링을 주는 것이다.

원본

img = cv2.imread('img/input.jpg')
size = 15
# generating kernel
kernel_motion_blur = np.zeros((size,size))
kernel_motion_blur[int((size-1)/2),:] = np.ones(size) # 수평방향
kernel_motion_blur = kernel_motion_blur/size # avg

# applying the kernel to the input image
output = cv2.filter2D(img,-1,kernel_motion_blur)
show_img(output)

 

위와 같은 이미지에서 kernel_motion_blur라는 0행렬을 생성한다.(임의의 사이즈 15)

15x15 0행렬에서 가운데 행을 모두 1로 만들어준다. 그런 뒤 low pass filter를 해준 후 (avg) cv2.filter2D에 적용을 시킨다. filter2D 에서 -1의 의미는 ddepth인데 이는 출력 이미지 소스와 동일한 깊이를 갖게 만들어 주는 것이다.

 

- Sharpening

Sharpening이란 영상에서 edge를 더욱 향상 시키기 위한 것이다.

이도 블러링과 비슷하게 커널을 이용하여 sharpening의 정도를 조절할 수 있다.

 

img = cv2.imread('img/input.jpg')
rows,cols = img.shape[:2]
kernel_sharpen_1 = np.array([[-1,-1,-1],[-1,7,-1],[-1,-1,-1]]) # kernel 내의 합이 0이기 때문에 normalization X -> /1
kernel_sharpen_2 = np.array([[1,1,1],[1,-7,1],[1,1,1]]) 
kernel_sharpen_3 = np.array([[-1,-1,-1,-1,-1],[-1,2,2,2,-1],[-1,2,8,2,-1],[-1,2,2,2,-1],[-1,-1,-1,-1,-1]])/8.0
output_1 = cv2.filter2D(img,-1,kernel_sharpen_1)
output_2 = cv2.filter2D(img,-1,kernel_sharpen_2)
output_3 = cv2.filter2D(img,-1,kernel_sharpen_3)

fig,axes = plt.subplots(2,2,figsize=(12,8))
axes[0,0].imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
axes[0,0].set(title='origin')
axes[0,1].imshow(cv2.cvtColor(output_1,cv2.COLOR_BGR2RGB))
axes[0,1].set(title='sharpening')
axes[1,0].imshow(cv2.cvtColor(output_2,cv2.COLOR_BGR2RGB))
axes[1,0].set(title='Excessive sharpening')
axes[1,1].imshow(cv2.cvtColor(output_3,cv2.COLOR_BGR2RGB))
axes[1,1].set(title='edge enhancement')
plt.show()

 

sharpening

(1) 오른쪽 맨 위에 있는 샤프닝은 가운데 값을 9로 주고 나머지 값을 -1로 준 3x3 행렬값을 적용시킨 샤프닝이다.

(2) 왼쪽 맨 아래에 있는 샤프닝은 가운데 값을 -7로 주고 나머지 값을 1로 준 3x3 행렬값을 적용시킨 샤프닝이다.

(1) 번에 비해 (2) 번이 약간 부자연스럽지만 엣지가 더욱 도드라지게 보인다. 가운데 값을 마이너스로 적용하여 엣지가 밝은 색으로 보이는 효과를 강조시켰다. (1)번은 주변을 음수값으로 줘서 기본적인 값을 밝게 주어 엣지가 도드라지는 샤프닝 효과를 내었다.

이 때 (1) 번과 (2)번은 모두 정규화를 따로 취해주지 않은 것처럼 보이지만 이것은 행렬의 합이 1이 되기 때문에 암시적으로 1로 나눈것으로 정규화 개념이 들어간 것이다.

마지막으로 왼쪽 아래의 그림은 전체적으로 자연스러운 샤프닝이 되었다. 이는 필터가 5x5 행렬인 이유 때문인 것도 있을 뿐더러 -1 과 2가 적절히 주변을 감싸고 8로 가운데 샤프닝을 줬기 때문이다. 또한, 이 행렬을 정규화를 시켜 너무 밝게 보이지 않게 조절하였기 때문이다.

 

커널의 값을 조절하여 변환하다보면 더욱 새로운 결과를 얻을 수 있게 될 것이다.

반응형

'OpenCV' 카테고리의 다른 글

OpenCV - Convolution & Blurring  (0) 2020.10.28
Ubuntu 18.04 OpenCV 3.2 설치  (0) 2020.10.24
OpenCV - Image Warpping  (0) 2020.10.11
OpenCV - 어파인 변환 및 투상 변환  (0) 2020.10.10
OpenCV - 이미지 사이즈 변환 및 보간법  (0) 2020.10.10

댓글