본문 바로가기
IT

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

by 배애앰이 좋아 2020. 12. 31.
반응형

 

가우시안 필터란?

가우스 함수나 그 절단한 근삿값을 합성곱 적용해 신호를 부드럽게 하는 필터이다. 이미지 처리에 적용할때는 가우시안 블러라고 불리며 쉽게 말하면  흐려지는 효과를 내는 필터이다.

 

아래는 가우시안 필터를 openCV 를 활용해서 C++로 구현한 코드

 

#include <stdio.h>
#include "opencv2/opencv.hpp"

//#define MEAN_FILETER
#define GASSUIAN_FILETER

void noisefiltering(IplImage *img)
{
	double kernel[3][3];
#ifdef MEAN_FILETER
	double avg = 1.0 / 9.0;
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			kernel[i][j] = avg;
		}
	}
#endif
#ifdef  GASSUIAN_FILETER
	double nearest = 2.0 / 16.0;
	double far = 1.0 / 16.0;
	double self = 4.0 / 16.0;

	kernel[0][0] = far;
	kernel[0][1] = nearest;
	kernel[0][2] = far;

	kernel[1][0] = nearest;
	kernel[1][1] = far;
	kernel[1][2] = nearest;

	kernel[2][0] = far;
	kernel[2][1] = nearest;
	kernel[2][2] = far;

#endif
	for (int i = 1; i < img->width - 1; i++)
	{
		for (int j = 1; j < img->height - 1; j++)
		{
			CvScalar finalColor;
			finalColor.val[0] = finalColor.val[1] = finalColor.val[2] = 0;
			for (int u = 0; u < 3; u++)
			{
				for (int v = 0; v < 3; v++)
				{
					CvScalar color = cvGet2D(img, j + v - 1, i + u - 1);
					finalColor.val[0] += kernel[u][v] * color.val[0];
					finalColor.val[1] += kernel[u][v] * color.val[1];
					finalColor.val[2] += kernel[u][v] * color.val[2];
				}
			}
			cvSet2D(img, j, i, finalColor);
		}
	}
}
IplImage *merge(IplImage *img, IplImage *cpimg)
{
	IplImage *bimg = cvCreateImage(cvSize(img->width * 2, img->height), 8, 3);
	for (int i = 0; i < img->width; i++)
	{
		for (int j = 0; j < img->height; j++)
		{
			auto color1 = cvGet2D(img, j, i);
			auto color2 = cvGet2D(cpimg, j, i);
			cvSet2D(bimg, j, i, color1);
			cvSet2D(bimg, j, img->width+i, color2);
		}
	}
	return bimg;
}

int main(void)
{
	IplImage *img = cvLoadImage("img//cat1.jpg");
	IplImage *cpimg = cvCreateImage(cvGetSize(img), 8, 3);
	cvCopy(img, cpimg);

	int iter = 2;
	for (int i = 0; i < iter; i++)
	{
		noisefiltering(img);
	}

	IplImage *bimg = merge(cpimg, img);
	cvShowImage("test_img", bimg);

	cvWaitKey();
	cvDestroyAllWindows();
	cvReleaseImage(&img);
}

 

위 코드 결과 : 

 

 

고양이 얼굴 쪽을 보면 흐려진 것을 확인할 수 있다.

 

반응형

댓글