bilateralFilter - openCV
필터에 대한 다른 분들의 설명 입니다.
양방향 필터 (bilateral Filter)는 선명도를 증가시키고, 노이즈를 감소시키는 비선형 필터이다. 양방향 필터는 두개의 가우시안 필터(Gaussian filter) 즉, 도메인 필터(domain filter) 및 레인지 필터(range filter)에 의해 동작한다.
출처 : http://www.dbpia.co.kr/Journal/ArticleDetail/NODE01251559
경계를 보존하면서(edge preserving) 노이즈를 감소(noise smoothing reducing)시키는 필터, 보통 가우시안에 기초하며, 특징적인 점은 Weight가 위치뿐만 아니라 그 위치의 값에도 의존한다.
openCV 의 bilateralFilter 입니다.
void cv::bilateralFilter(
InputArray src,
OutputArray dst,
int d,
double sigmaColor,
double sigmaSpace,
int borderType = BORDER_DEFAULT
)
src: 입력영상
dst : 출력영상
d : 필터링에 이용하는 이웃한 픽셀의 지름을 정의, 불가능한 경우 sigmaSpace를 사용함.
sigmaColor : 컬러공간의 시그마공간 정의, 클수록 이웃한 픽셀과 기준색상의 영향이 커진다.
sigmaSpace : 시그마 필터를 조절한다, 값이 클수록 긴밀하게 주변 픽셀에 영향을 미친다. d > 0 이면 영향을 받지 않고, 그 이외에는 d 값에 비례한다.
코드
bilateralFilter(srcImage,destImage2,-1,sigmaColor,sigmaSpace);
bilateralFilter(srcImage,destImage2,3,sigmaColor,sigmaSpace);
수행결과설명
가장 왼쪽부터 Box Filter, GaussianBlur, bilateralFilter, bilateral Filter 입니다.
흑백 사진이라 명확하게 구분하기 어려울 수 있는데요, 일부분을 Crop해서 보면 경계선에 대한 선명도가 bilateralFilter가 더 선명한 것을 볼 수 있습니다.
아래는 사용한 코드 입니다.
JNIEXPORT jstring JNICALL
Java_com_tistory_technote_opencvandroid_MainActivity_convertNativeLibtoBoxFilter2(JNIEnv *env, jobject, jlong addrInput, jlong addrResult) {
Mat &img_input = *(Mat *) addrInput;
Mat &img_result = *(Mat *) addrResult;
cvtColor(img_input, img_result, CV_RGBA2GRAY);
jstring result;
std::stringstream buffer;
Mat srcImage = img_result;
int border = 3;
Size ksize (border*2+1,border*2+1);
Mat destImage2;
int d = ksize.width;
double sigmaColor =10.0;
double sigmaSpace = 10.0;
bilateralFilter(srcImage,destImage2,-1,sigmaColor,sigmaSpace);
img_result = destImage2.clone();
buffer << "Box Filter, d= -1, 7 x 7, bilateralFilter" << endl;
const char *cstr = buffer.str().c_str();
result = env->NewStringUTF(cstr);
return result;
}
관련문의
- 이메일: [email protected]
- Blog : technote.tistory.com
- Github : https://gitlab.com/Technote/opencv320-android-study