본문 바로가기
코딩/OpenCV

[C++ opencv] 가우시안 필터로 노이즈 제거하기 gaussian filter, gaussian blur()

by DIYver 2020. 6. 30.

본문 목표

영상처리에서 '노이즈 제거'의 중요성은 80%를 차지한다고해도 과언이 아니다.

 

노이즈 제거의 방법에는 여러가지가 있겠지만,

 

가장 쉽게 하는 방법은 영상을 흐리게 하는 것이다.

 

그 중에서 오늘은 '가우시안 필터' 또는 '가우시안 블러'를 알아보도록 한다.

 

이 방법은 중앙값에 가중치를 더 주고 주변은 더 흐리게 한다고 보면된다.

 

 

 

 

키워드 : 가우시안 필터, 가우시안 블러, Gaussian blur

 

 

 

 

 

알아볼 함수 원형

- 가우시안 필터 적용한 블러처리 ( Gaussian Blur )

...

	Mat img = imread("Lenna.png", 0);	//이미지를 grayscale로 불러옴
	
	Mat img_blur;

	GaussianBlur(img, img_blur, Size(7, 7), 0);
    
...    

 

GaussianBlur( src, dst, kernel_size, sigma_x, sigma_y, borderType) 

 

  ○ src : 입력할 이미지 변수

 

  ○ dst : 필터가 적용되어 저장될 이미지 변수

 

  ○ kernel_size : 가우시안 함수가 적용된 커널 마스크의 크기

 

  ○ sigma_x : X 방향 표준편차

 

  ○ sigma_y : Y 방향 표준편차, sigma_x 만 설정하면 자동으로 같은 값으로 적용됨

  ※simga_x 와 sigma_y 값을 0으로 사용하면 커널 크기에서 자동으로 계산 됨.

 

  ○ borderType : 이미지의 테두리 바깥쪽의 가상의 픽셀들을 어떻게 처리할 것인지 선택

    - zero padding 또는 reflect(mirror) padding 을 적용할 수 있음

      ■ BORDER_CONSTANT  또는  0

      ■ BORDER_REPLICATE  또는 1

      ■ BORDER_REFLECT  또는  2 
      ■ BORDER_DEFAULT  또는  4 

      ■ BORDER_REFLECT101  또는  4 

      ■ BORDER_TRANSPARENT  또는  5 
      ■ BORDER_ISOLATED  또는  16

 

border type을 봤을 때,

OpenCV에서는 기본값으로 mirror padding 을 사용하고 있음을 확인할 수 있었다.

 

 

 

 

 

 

 

 

 

기본적인 이미지 필터 적용 방식은 

 

이 포스팅 전의 Average Filter 에서 자세하게 다뤘으므로

 

아직 못 봤다면 보는 것을 추천한다.

https://diyver.tistory.com/60

 

[C++ opencv] 평균필터 적용하여 노이즈 제거하기 average filter, filter2d()

본문 목표 영상처리에 있어서 제일 중요한 것들 중 하나는 당연 '노이즈 제거' 이다. 노이즈 제거 방법에는 정말 여러가지가 있지만, 제일 쉬운 방법은 blur 처리를 하는 것이다. blur 처리란 영상��

diyver.tistory.com

 

 

 

 

 

가우시안 필터를 좀 더 살펴보자면

 

가우시안 함수는 위와 같을 때,

 

그래프는 아래와 같다.

 

여기서 확인할 수 있는 것은

 

시그마(편차) 에 따라서 그래프 모양이 바뀌는데,

 

이 뜻은 가중치를 어떻게 줄 것인가 하는 것이다.

 

편차가 크면, 중앙값과 인접 픽셀 값들이 스무스하게 작용된다면

 

편차가 작으면, 중앙값에 가중치를 몰빵하는 것이 된다.

 

 

 

 

가우시안 필터를 적용할 때, 마스크 사이즈를 5x5 로 하고, 시그마(편차)를 5로 설정하면

 

가우시안 필터 커널은 아래와 같다.

보면 중앙 값이 제일 크게 가중치가 적용된 것을 확인할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

코드 테스트 결과

- CODE

#include <opencv2/opencv.hpp>


using namespace cv;
using namespace std;

int main(int ac, char** av) {
	Mat img = imread("Lenna.png", 0);	//이미지를 grayscale로 불러옴
	
	Mat img_blur;

	GaussianBlur(img, img_blur, Size(7, 7), 0);


	imshow("original", img);
	imshow("img_blur", img_blur);
	waitKey(0);

	return 0;
}

 

- RESULT

 

원본 이미지
가우시안 블러 적용한 이미지,  마스크 크기 7x7

 

원본이미지는 선명한 반면에

 

가우시안 블러를 적용한 이미지는 확실히 흐릿해졌음을 알 수 있다.

 

사람이 느끼기에는 원본이 더 좋다고 느끼겠지만,

 

컴퓨터가 이미지를 분석할 때에는 아래와 같은 이미지가 더 좋다고 느낀다.

 

그러므로 적절한 blur 방식을 사용하여 이미지를 컴퓨터가 처리하기 쉽게해주는 작업은 매우 중요하다.

 

이전에 다뤘던 평균필터와 가우시안 필터를 사용하는 상황이 다르기 때문에

 

주의해야한다.

 

무작정 가우시안 필터가 더 전문성 있어보인다고 사용해서는 안 된다는 것이다.

 

다만, 사실 일반인이 사용할 때에는 큰차이 없고,

 

가우시안 필터가 더 사용하기 편해서 그냥 사용해도 큰 문제는 없다.

 

 

 

가우시안 필터를 평균 필터와 비교했을 때,

 

평균필터는 비교적 윤곽선이 살아나면서 블러처리가 되고,

 

가우시안 필터는 윤곽선도 흐려지는 결과를 얻게 된다.

 

동일한 마스크 크기로 했을 때, 처리속도는 누가 더 빠를 것인지는

 

직접 생각해보시고, 테스트 해보시길 바란다.

 

 

 

비슷하게 노이즈가 제거되는 상황이면,

 

처리속도가 빠른것을 선택하는 것이 현명하기 때문에 제일 중요한 부분이라 할 수 있다.

 

 

 

도움이 되었거나, 문제가 있는 경우 댓글로 알려주세요~!

감사의 댓글은 작성자에게 큰 힘이 됩니다 ^^

 

댓글