양방향 필터

전종원·2022년 10월 26일
0

1. 양방향 필터

양방향 필터란?

  • 에지 보전 잡음 제거 필터의 하나(블러처리를 하되 에지정보를 남기겠다.)
  • 평균값 필터 & 가우시안 필터는 에지 부근에서도 픽셀값을 평탄하게 만드는 단점이 존재
  • 기준 픽셀과 이웃 픽셀과의 거리, 픽셀 값의 차이를 함께 고려하여 스무딩 정도를 조절

  • 첫번째 가우시안 함수의 변수: p(x,y)점과 q(x',y')점의 L2-norm
  • 두번째 가우시안 함수의 변수: p(x,y)점과 q(x',y')점의 밝기값 차이

예시

  • input 이미지에서 밝기값 변화가 큰 부분은 가우시안 블러 커널에서 마스킹 하여 에지가 아닌 부분에서만 blurring 진행.
  • 각각의 픽셀마다 서로 다른 가우시안 블러 필터들이 생성되므로 시간이 오래걸림

OpenCV bilateralFilter 함수

void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, 
					 int borderType = BORDER_DEFAULT);
  • src: 입력 영상. 8-bit 실수형, 1채널 or 3채널
  • dst: 출력영상. src와 같은 크기, 같은 타입
  • d: 필터링에 사용될 이웃 픽셀의 거리(지름)
    • 음수를 입력할 경우 sigmaSpace 값에 의해 자동 결정됨.
  • sigmaColor: 색 공간에서 필터의 표준편차
  • sigmaSpace: 좌표 공간에서 필터의 표준편차.
  • borderType: 가장자리 픽셀 처리 방식.

실습코드

#include <iostream>
#include "opencv2/opencv.hpp"

using namespace cv;
using namespace std;

int main(void)
{
	Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);

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

//	Mat noise(src.size(), CV_32SC1);
//	randn(noise, 0, 5);
//	add(src, noise, src, Mat(), CV_8U);

	TickMeter tm;
	tm.start();

	Mat dst1;
	GaussianBlur(src, dst1, Size(), 5);

	tm.stop(); 
	cout << "Gaussian: " << tm.getTimeMilli() << endl;

	tm.reset();
	tm.start();

	Mat dst2;
	bilateralFilter(src, dst2, -1, 10, 5);

	tm.stop();
	cout << "Bilateral: " << tm.getTimeMilli() << endl;

	imshow("src", src);
	imshow("dst1", dst1);
	imshow("dst2", dst2);

	waitKey();
	return 0;
}

결과영상

0개의 댓글