본문 바로가기
openCV

[openCV] 공간 도메인 필터링

by _eunji_ 2020. 1. 18.

Spatial Filtering

  • Spatial Filter를 사용하여 전처리를 하는 것
  • Spatial filters = spatial masks, kernels, templates, windows

특정한 픽셀에 Spatial Filtering을 수행할 때 사전에 정의한 Spatial Filter을 마스크 가운데에 위치시키고 매칭 되는 픽셀 값끼리 곱해서 더해준다. 결과로 g(x,y) 값이 나오면 f(x, y) 값과 변환시킨다. ( 일반적으로 필터의 크기는 3*3 , 5*5, 7*7의 크기 )

spatial filter의 개수에 따라 다양한 결과를 만들 수 있다.

 

Averaging filter

  • 특정한 픽셀 값을 이웃 픽셀들의 평균값으로 대체시키는 것이다.
  • low pass filters라고 불리기도 한다.
  • 랜덤 한 잡음들을 줄일 수 있는 장점이 있다.
  • 영상이 흐릿해지는(블러링) 단점이 있다.

왼쪽 마스크는 픽셀들의 평균값과 같고 오른쪽 마스크는 픽셀의 가중치를 두어 가중치 평균을 구할 수 있다. 따라서 외부가 블러 처리가 되지만 잡음을 줄일 수 있다.

Gaussian filter

Mask size

  • 마스크의 크기가 작으면 작을수록 작은 잡음들을 없앨 수 있다.
  • 작은 물체를 블러 처리하고 싶으면 마스크의 크기를 줄이면 된다.
  • 크기가 큰 마스크를 사용하면 계산량이 많아지는 단점이 있다.

마스크의 크기가 커질수록 블러링이 된다.

Sharpening

  • 밝기 값의 차이가 있는 부분을 더 강조시킴으로써 영상이 보다 에지 있게 만드는 것이다.
  • 인접한 픽셀의 값들을 공간 도메인에서의 미분함으로써 수행할 수 있다.

값의 변화가 발생하는 부분을 강조시키는 것이기 때문에 급격한 변화에서 미분을 하는 것이다. 검은색 점은 1차 미분을 의미하고 흰색 점은 2차 미분을 의미한다. 2차 미분은 기울기가 일정한 부분도 값이 0이기 때문에 급격한 변화에만 적용시킬 수 있어 대부분 Sharpening을 수행할때는 2차 미분을 사용한다.

Mask for applying second derivative

위의 마스크를 이용하여 입력 영상이 주어졌을때 2차 미분을 구하고 그 값을 원본 영상에 더해  Sharpening을 수행한다.

Sharpening using unsharp masking

원본 영상에 블러링을 수행하면 값의 변화가 조금 더 부드럽게 변하고 원본 영상에서 블러 된 영상을 빼주면 값의 변화가 발생하는 부분에서 양수나 음수의 값을 갖게 된다. 이 unsharp mask를 원본 영상에 더해주면 변화가 발생하는 부분이 더 강조되는 것이다.

  • Median filter
  • 주어져 있는 픽셀들 중에 중간값을 구해서 그 값으로 대체시켜주는 것
  • 잡음들을 제거시킬 수 있는데 m*m 크기의 필터를 사용했을 때 𝑚^2/2 크기의 잡음들을 제거할 수 있다.
  • salt-and pepper noise 란 영상의 이미 없는 흰색과 검정색의 잡음을 의미한다.
  • 블러링이 생기지 않으면서 잡음을 제거할 수 있는 장점이 있다.
  • 하지만 averaging filter와 가우시안 필터에 비해 연산량이 많고 salt-and pepper noise에서만 효과적이라는 단점이 있다.

Averaging filter

int main() {
Mat image, AvgImg, GaussianImg;
image = imread("lena.png");
// Blurs an image using the normalized box filter
// image: input image, AvgImg: output image, Size(5, 5): blurring kernel size
blur(image, AvgImg, Size(5, 5));
// Blurs an image using a Gaussian filter
// image: input image, GaussianImg: output image, Size(5, 5): Gaussian kernel size
// 1.5: Gaussian kernel standard deviation in X direction 
// 1.5 : 가우시안 필터의 표준편차 값 (x축)
GaussianBlur(image, GaussianImg, Size(5, 5), 1.5);
imshow("Input image", image);
imshow("Average image", AvgImg);
imshow("Gaussian blurred image", GaussianImg);
waitKey(0);
return 0;
}

Sharpening using second derivative

int main() {
Mat image, laplacian, abs_laplacian, sharpening;
image = imread("moon.jpg", 0);

//가우시안 블러링 수행
GaussianBlur(image, image, Size(3, 3), 0, 0, BORDER_DEFAULT);
// calculates the Laplacian of an image
// image: src, laplacian: dst, CV_16S: desire depth of dst,
// 1: aperture size used to compute second-derivative (optional)
// 1: optional scale factor for the computed Laplacian values
// 0: optional delta value that is added to the result
Laplacian(image, laplacian, CV_16S, 1, 1, 0); // Laplacian : 이차 미분 수행
convertScaleAbs(laplacian, abs_laplacian); //8비트 영상으로 변환
sharpening = abs_laplacian + image;

imshow("Input image", image);
imshow("Laplacian", laplacian);
imshow("abs_Laplacian", abs_laplacian);
imshow("Sharpening", sharpening);
waitKey(0);
}

Using unsharp masking

int main() {
Mat input = imread("lena.png");
Mat gray, blur, sharp;
cvtColor(input, gray, COLOR_BGR2GRAY);
GaussianBlur(gray, blur, Size(5, 5), 3);
//gray영상에 1.5를 곱하고 blur영상에 -0.5를 곱하여 더한 결과가 sharp
addWeighted(gray, 1.5, blur, -0.5, 0, sharp); 
imshow("gray", gray);
imshow("sharp", sharp);

waitKey(0);
}

 

Median filter

int main() {
Mat image = imread("saltnpepper.png", 0);
imshow("SaltAndPepper", image);
Mat mf1, mf2;
// Blurs an image using the median filter
// image: src, mf1: dst, 3: aperture size(must be odd and greater than 1)
medianBlur(image, mf1, 3); // 입력, 결과, 마스크 크기
imshow("MedianFiltered1", mf1);
medianBlur(image, mf2, 9);
imshow("MedianFiltered2", mf2);
waitKey(0);
return 0;
}

 

 

출처 - 컴퓨터 비전 한동대학교 황성수

 http://www.kocw.net/home/cview.do?cid=1b1f5b73413060b5

'openCV' 카테고리의 다른 글

[openCV] 영상 분할  (0) 2020.01.18
[openCV] 컬러영상 처리  (0) 2020.01.18
[openCV] 히스토그램 평활화  (0) 2020.01.18
[openCV] 밝기 값 변환  (1) 2020.01.18
[openCV] 메모리 관리 및 픽셀 엑세스  (0) 2020.01.11

댓글