Filtering 기법

2022. 3. 26. 21:26Machinevision system/Filtering

Average Filtering기법은 주변의 값들의 평균을 내서 평균화하는 필터이다.

이미지를 픽셀단위로 한칸씩 이동하면서 적용되며 주위의 픽셀의 평균값으로 대체된다.

import cv2 as cv
from google.colab.patches import cv_imshow

img = cv.imread('/content/baseball.jpg')

blur3 = cv.blur(img,(3,3))
blur5 = cv.blur(img,(5,5))
blur7 = cv.blur(img,(7,7))

cv_imshow(img)
cv_imshow(blur3)
cv_imshow(blur5)
cv_imshow(blur7)

average filter의 kernel size가 커질 수록 주변의 픽셀값의 영향을 많이 받기 때문에 원본 영상에 비해 blur한 영상이 추출된다.


Image sharpening이란 영상을 blur시키는 것과 반대개념으로 영상의 경계선을 날카롭게 만드는 것이다.

구현은 다음과 같다.

import numpy as np
detail5 = np.int32(img) - np.int32(blur5)

shapened_img_5_2 = np.int32(img) + 2*detail5
shapened_img_5_5 = np.int32(img) + 5*detail5
shapened_img_5_10 = np.int32(img) + 10*detail5

원본 영상에서 원본 영상을 blur처리한 영상의 차이의 값을 이용한다. 이 차이에 α값을 곱해주어 sharpening 효과의 정도를 조절한다.

 

α의 크기가 증가할 수록 sharpening 효과가 심해진 것을 볼 수 있다.


Gaussian filter란 가우시안 분포를 영상처리에 적용한 필터이다.

Gaussian blur 함수

median filter, average filter등과 마찬가지로 영상의 잡음을 줄이기 위해 사용된다.

 

Gaussian filter를 사용할때 시간복잡도를 생각해보면

다음과 같은 N^2*M^2의 상대적으로 큰 시간복잡도가 발생한다.

하지만 (2D)3*3 filter를 적용시키지 않고 (1D)1*3 filter와 (1D)3*1 filter의 convolution(합성곱)dmf 이용한다면 시간복잡도는 줄이면서 (2D)3*3 filter와 같은 효과를 낼 수 있다.

 

다음 코드로 살펴볼 수 있다.

kernel1d = cv.getGaussianKernel(7,2)

kernel2d = np.outer(kernel1d, kernel1d.transpose())

output_1 = cv.filter2D(src = img,ddepth = -1, kernel = kernel2d)

output_2_1 = cv.filter2D(src = img,ddepth = -1, kernel = kernel1d)
output_2_2 = cv.filter2D(src = output_2_1,ddepth = -1, kernel = kernel1d.transpose())

output_1의 결과는 영상에 2D(7*7) Gaussian filter를 적용한 output이고 output_2_2의 결과는 1D * 1D Gaussain filter의 적용한 결과이다.

동일한 결과가 나온 것을 볼 수 있다.