OpenCV | 영상 필터링 기법 : 블러링

박나연·2021년 3월 28일
0

OpenCV

목록 보기
20/40

블러링은 초점이 맞지 않은 사진처럼 영상을 부드럽게 만드는 필터링 기법이며 스무딩이라고도 한다. 영상에서 인접한 픽셀 간의 픽셀 값 변화가 크지 않은 경우 부드러운 느낌을 받을 수 있다.

💡 평균 값 필터

블러링 필터 중 단순하고 구현하기 쉬운 평균값 필터이다. 입력영상에서 특정 픽셀과 주변 픽셀들의 산술 평균을 결과 영상 픽셀 값으로 설정하는 필터이다.

blur() 함수

void blur(InputArray src, OutputArray dst, Size ksize, 
Point anchor = Point(-1,-1), int borderType = BORDER_DEFAULT);

src : 입력 영상
dst : 출력 영상
ksize : 블러링 커널 크기
anchor : 고정점 좌표
borderType : 가장자리 픽셀 확장 방식

void blurring_mean() {
	Mat src = imread("rose.bmp", IMREAD_GRAYSCALE);

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	imshow("src", src);

	Mat dst;
	for (int ksize = 3; ksize <= 7; ksize += 2) {
		blur(src, dst, Size(ksize, ksize));

		String desc = format("Mean: %dx%d", ksize, ksize);
		putText(dst, desc, Point(10, 30), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(255), 1, LINE_AA);

		imshow("dst", dst);
		waitKey();
	}

	destroyAllWindows();
}


💡 가우시안 필터

평균값 필터보다 자연스러운 블러링 결과를 생성하는 가우시안 필터이다. 가우시안 분포 함수를 근사하여 생성한 필터 마스크를 사용하는 필터링 기법이다. 가우시안 분포는 평균을 중심으로 좌우 대칭의 종 모양을 갖는 확률 분포이며 정규 분포라고도 한다. 가우시안 분포는 평균과 표준 편차에 따라 분포 모양이 결정된다. 영상의 가우시안 필터에서는 주로 평균이 0인 가우시안 분포함수를 사용한다.

가우시안 스무딩

가우시안 필터 마스크

중앙부에서 큰 값을 가지고 주변부로 갈 수록 행렬 원소 값이 0에 가까운 작은 값을 가진다. 필터링 대상 픽셀 근처에는 가중치를 크게 주고, 필터링 대상 픽셀과 멀리 떨어져 있는 주변부에는 가중치를 조금만 주어 가중 평균을 구하는 것과 같다.

GaussianBlur() 함수

void GaussianBlur(InputArray src, OutputArray dst, Size ksize,
double sigmaX, double sigmaY = 0,
int borderType = BORDER_DEFAULT);

src : 입력 영상
dst : 출력 영상
ksize : 가우시안 커널 크기
sigmaX : x방향으로의 가우시안 커널 표준 편차
sigmaY : y방향으로의 가우시안 커널 표준 편차
borderType : 가장자리 픽셀 확장 방식

이 함수는 src영상에 가우시안 필터링을 수행하고 그 결과를 dst 영상에 저장한다.

void blurring_gaussian() {
	Mat src = imread("rose.bmp", IMREAD_GRAYSCALE);

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	imshow("src", src);

	Mat dst;
	for (int sigma = 1; sigma <= 5; sigma++) {
		GaussianBlur(src, dst, Size(), (double)sigma);

		String desc = format("Sigma: %d", sigma);
		putText(dst, desc, Point(10, 30), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(255), 1, LINE_AA);

		imshow("dst", dst);
		waitKey();
	}

	destroyAllWindows();
}

profile
Data Science / Computer Vision

0개의 댓글