opencv c++ 가우시안 필터를 활용한 노이즈 제거

  • 최초 작성일: 2022년 1월 11일(화)

목차

[TOC]


목표

보통 노이즈하면 라디오 같은 전자 기기에서 지지직 거리는 소리로 알고 있다. 이와 유사하게 영상 처리에서는 노이즈를 주변과 비교했을 때 픽셀 값이 뜬금 없는 경우를 말한다. 원본 영상에 노이즈가 같이 섞이게 되면 영상의 선명도가 떨어질 것이다. 그렇기 때문에 영상 처리에서 노이즈 제거는 아주 중요한 작업이라고 할 수 있다.


노이즈 제거를 위한 방법은 여러 가지가 있지만, 대표적으로 blur (흐릿함) 처리를 하는 것이 있다. blur 는 말 그대로 “영상을 흐릿하게 하다” 인데, opencv에 내장되어있는 filter2D라는 함수를 통해 처리할 수 있다.


이번에는, 가우시안 필터(Gaissian Filter)를 이용하여 노이즈 제거를 해볼 것이다. 평균 필터는 평균값을 이용해 필터링을 하는 작업이었다면, 가우시안 필터는 중앙값에 가중치를 더 주고 주변은 더 흐리게 하는 작업이다.

아래의 이미지들이 평균 필터를 위한 계산 작업의 설명이다. 이 계산 작업을 반복하여 모든 행렬의 값들을 교체한다. 그러면 이미지의 픽셀들 중유독 튀던 값들이 주변값에 의해 부드러워(?)진다.

image

image


근데 그러면 하나의 의문점이 생길 것이다. 그러면 가장자리의 값들은 어떻게 계산할 수 있을까?

여러가지 방법이 있는데, 아래의 사진처럼 가장자리 값들을 무시하거나, 가장자지 밖의 값들을 모두 0으로 간주하거나, 가장자리 밖의 값들이 인접한 값을 따라가는 방법들이 있다.

image

이 방법들은 각자 상황이나 의도에 따라 다르게 쓰일 수 있다.


실습에 앞서, 우리가 쓰게 될 GaussianBlur 함수를 간단히 살펴보자.

GaussianBlur(src, dst, ddepth, kernel, sigma_x, sigma_y, borderType)

  • src: 입력 이미지
  • dst: 출력 이미지
  • kernel: Gaussian 함수가 적용될 kernel mask 크기
  • sigma_x: x축 방향 표준편차
  • sigma_y: y축 방향 표준편차 (sigma_y 를 설정하지 않으면 sigma_x 값과 동일하게 적용, 0이면 커널 크기에서 자동 계산됨)
  • borderType: 픽셀의 보외법, 외삼법. (참조링크)

가우시안 함수와 그래프는 아래와 같다.

sigma(편차) 값이 작을수록 적은 저주파 성분만 통과시킨다. sigma(편차) 값이 클수록 높이는 낮지만 폭은 넓어지므로 많은 저주파 성분을 통과시킨다. 즉, 이렇게 sigma 값을 조절하며 고주파량, 저주파량을 조절할 수 있는 특징이 있다.

image

image

Gaussian Filter는 Gaussian 함수를 표본화하여 mask의 계수를 결정한다. 아래의 이미지 와 같이 3x3 Gaussian Filter이며, 모든 계수는 합이 1이 된다.

image

Gaussian Filter를 이용하면 더 부드러운 영상이 되며, 전체적으로 경계선이 약화되며 흐려지는 효과가 나타난다.



실습

그러면, 이번엔 Gaussian Filter에 대한 이해가 됐다면, 직접 코드를 실행해보면서 이미지의 변화를 확인하고 비교해보자.

커널 사이즈를 크게 할 수록 더 부드러운 양상을 보일 거라고 예상되므로 직접 결과를 확인해보자.



소스 코드

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int ac, char** av) {
	Mat img = imread("lion.png", 0);	// grayscale

	Mat img_blur55;
	Mat img_blur77;

	GaussianBlur(img, img_blur55, Size(5, 5), 0);
	GaussianBlur(img, img_blur77, Size(7, 7), 0);


	imshow("original", img);
	imshow("img_blur55", img_blur55);
	imshow("img_blur77", img_blur77);

	waitKey(0);

	return 0;
}


결과

커널 사이즈를 5x5 와 7x7로 각각 해보았는데, 커널 사이즈가 커질수록 더 흐릿한 결과를 확인할 수 있다.

image