파이썬 강의/openCV

파이썬 openCV 13. 블러링(blurring)/스무딩(smoothing)/샤프닝(sharpening)

마리사라 2020. 11. 28. 10:11
반응형

파이썬 openCV 13번째 강의는 블러링(blurring)/스무딩(smoothing)/샤프닝(sharpening)의 3가지입니다.

 

이 3가지의 기법은 모두 필터를 통해 진행된다는 공통점이 있어, 한 번에 진행해보려고 합니다.

 

기본적인 필터 적용 방법은 이전 강의에서 자세히 설명했으니, 참조하시기 바랍니다.

 

2020/11/25 - [파이썬/openCV] - 파이썬 openCV 12. 엠보싱 기법(embossing)

 

파이썬 openCV 12. 엠보싱 기법(embossing)

파이썬 openCV 12번째 강의는 엠보싱 기법(embossing)입니다. 이번 강의도 중첩 for문을 사용하는 방식과, 내장 함수를 사용해서 시간을 단축시키는 방법이 있습니다. 이번 강의부터는 최대한 중첩 for

marisara.tistory.com


0. 블러링(blurring)/스무딩(smoothing)/샤프닝(sharpening)?

blur의 사전적 정의

블러링은 blur의 사전적 정의처럼 흐릿하게 만든다는 뜻입니다. 블러링을 적용하게 되면 초점이 맞지 않는 카메라처럼 영상의 경계가 흐릿해지는 효과가 있습니다. 이러한 블러를 배경에만 적용하면 피사체가 더욱 돋보이는 효과를 줄 수도 있습니다.

 

smooth의 사전적 정의

스무딩은 smooth의 사전적 정의처럼 매끈하게 만든다는 뜻입니다. 스무딩은 블러링과 비슷하게 주변과 동화되는 효과가 있지만, 주변의 화소의 평균으로 값을 내는 블러링과 다르게 스무딩은 3x3의 필터에 편차를 주어 원래 화소에 좀 더 가깝게 설정합니다. 따라서 경계선이 없어지는 효과가 있지만, 블러링처럼 모든 화소가 흐릿하게 되지는 않습니다.

 

sharp의 사전적 정의

샤프닝은 sharp의 사전적 정의처럼 날카롭게 만든다는 뜻입니다. 이때 날카롭다는 뜻은 주변 화소에 대비해서 원래 화소를 돋보이게 만들어 준다는 뜻입니다. 이렇게 되면 주변 화소와 값이 크게 다른 경계선 부분이 돋보이게 되어, 피사체의 경계선이 돋보이게 됩니다.


1. openCV에서의 x

img = cv2.imread("lenna.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

우선 이번 마스크역시 그레이 스케일(흑백)에서 진행됩니다.

 

먼저 각각의 마스크를 설명드리겠습니다.

 

블러링(blurring)

블러링은 주변 3x3또는 5x5의 크기의 모든 화소들의 평균값을 적용합니다. 그렇기에 마스크 역시 1/n값이 되게 됩니다.

blurring_mask1 = np.array([[1 / 9, 1 / 9, 1 / 9], [1 / 9, 1 / 9, 1 / 9], [1 / 9, 1 / 9, 1 / 9]])
blurring_mask2 = np.array([[1 / 25, 1 / 25, 1 / 25, 1 / 25, 1 / 25], [1 / 25, 1 / 25, 1 / 25, 1 / 25, 1 / 25],
                           [1 / 25, 1 / 25, 1 / 25, 1 / 25, 1 / 25], [1 / 25, 1 / 25, 1 / 25, 1 / 25, 1 / 25],
                           [1 / 25, 1 / 25, 1 / 25, 1 / 25, 1 / 25]])

 

스무딩(smoothing)

스무딩은 블러링과 비슷하게 주변 화소들의 평균으로 적용하지만, 이때 주변 화소들에 편차를 주어 계산합니다. 기본적인 스무딩 마스크의 형태는 다음과 같습니다.

1/16 1/8 1/16
1/8 1/4 1/8
1/16 1/8 1/16

그렇기에 스무딩이 적용되는 화소는 원래의 화소와 가깝게 적용됩니다.

smoothing_mask = np.array([[1/16, 1/8, 1/16], [1/8, 1/4, 1/8], [1/16, 1/8, 1/16]])

 

샤프닝(sharpeing)

샤프닝은 자기 자신이 돋보여야 하므로, 마스크를 주변의 값들과 대비되도록 만듭니다. 따라서 샤프닝의 방법은 원래의 화소 값을 n배, 주변의 화소 값을 -1배 하여 합이 1이 되도록 마스크를 만듭니다. 그 예시로는 다음과 같습니다.

-1 -1 -1
-1 9 -1
-1 -1 -1

샤프닝 마스크는 대표적으로 두가지가 있으며, 이번 강의에서 두 가지 모두 시연해볼 예정입니다.

sharpening_mask1 = np.array([[-1, -1, -1], [-1, 9, -1], [-1, -1, -1]])
sharpening_mask2 = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])

 

이제 각각의 마스크를 적용하도록 합니다.

blurring_out1 = cv2.filter2D(gray, -1, blurring_mask1)
blurring_out2 = cv2.filter2D(gray, -1, blurring_mask2)

smoothing_out = cv2.filter2D(gray, -1, smoothing_mask)

sharpening_out1 = cv2.filter2D(gray, -1, sharpening_mask1)
sharpening_out2 = cv2.filter2D(gray, -1, sharpening_mask2)

 

마지막으로 이렇게 적용된 영상들을 확인해 보겠습니다.

원본 영상
3x3 블러링
5x5 블러링

블러링 마스크의 크기가 클수록 영상이 흐릿해 보이는 것을 확인하실 수 있습니다.

 

스무딩

스무딩은 블러링과 비슷하지만, 블러링보다는 경계선이 더 뚜렷합니다.

 

중앙값이 9인 샤프닝
중앙값이 5인 샤프닝

샤프닝은 중앙값이 클수록 원본 영상보다 거친 느낌을 받을 수 있습니다.


2. 마치며

필터를 적용하는 대표적인 4가지 기법인 엠보싱, 블러링, 스무딩, 샤프닝을 알려드렸습니다.

 

다음 강의부터는 rgb로 이루어진 값을 다른 속성으로 변환시키는 방법을 알려드리겠습니다.

 

감사합니다.

 

import cv2
import numpy as np

img = cv2.imread("lenna.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

blurring_mask1 = np.array([[1 / 9, 1 / 9, 1 / 9], [1 / 9, 1 / 9, 1 / 9], [1 / 9, 1 / 9, 1 / 9]])
blurring_mask2 = np.array([[1 / 25, 1 / 25, 1 / 25, 1 / 25, 1 / 25], [1 / 25, 1 / 25, 1 / 25, 1 / 25, 1 / 25],
                           [1 / 25, 1 / 25, 1 / 25, 1 / 25, 1 / 25], [1 / 25, 1 / 25, 1 / 25, 1 / 25, 1 / 25],
                           [1 / 25, 1 / 25, 1 / 25, 1 / 25, 1 / 25]])

smoothing_mask = np.array([[1 / 16, 1 / 8, 1 / 16], [1 / 8, 1 / 4, 1 / 8], [1 / 16, 1 / 8, 1 / 16]])

sharpening_mask1 = np.array([[-1, -1, -1], [-1, 9, -1], [-1, -1, -1]])
sharpening_mask2 = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])

blurring_out1 = cv2.filter2D(gray, -1, blurring_mask1)
blurring_out2 = cv2.filter2D(gray, -1, blurring_mask2)

smoothing_out = cv2.filter2D(gray, -1, smoothing_mask)

sharpening_out1 = cv2.filter2D(gray, -1, sharpening_mask1)
sharpening_out2 = cv2.filter2D(gray, -1, sharpening_mask2)

cv2.imshow("original", gray)

cv2.imshow('blurring(3X3)', blurring_out1)
cv2.imshow('blurring(5X5)', blurring_out2)

cv2.imshow('smoothing', smoothing_out)

cv2.imshow('sharpening1', sharpening_out1)
cv2.imshow('sharpening2', sharpening_out2)

cv2.waitKey(0)
반응형