본문 바로가기
IT

사진 노이즈 제거하기 (gaussian filter, gaussian blur)

by 배애앰이 좋아 2021. 1. 4.
반응형

 

가우시안 필터란?

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

 

아래는 가우시안 필터를 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//img2.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(img, cpimg);
	cvShowImage("test_img", bimg);

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

 

위 코드 결과 :

 

 

iter = 2 로 설정했을 때 결과이며 전반적으로 블러처리로 뭉개진 것을 확인할 수 있다.

 

iter = 4 로 설정했을 때 결과이며 위에 보다 더 많이 뭉개진 것을 확인할 수 있다.

 

 

반응형

댓글