본문 바로가기
Programmer/openCV for Android

Android openCV #6 - bilateral Filter 적용하기

by JaehwanPark 2017. 4. 16.

Android openCV #6 - bilateral Filter 적용하기




아래내용은 제가 Gitbook으로 작성한 내용 입니다.

gitbook을 통해 바로 보실 수 도 있습니다!


그리고 포스팅 내용에 관한 문의는 언제든 환영입니다!!


https://jaehwanpark.gitbooks.io/opencv-android-study/content/bilateralfilter.html



bilateralFilter - openCV

필터에 대한 다른 분들의 설명 입니다.

양방향 필터 (bilateral Filter)는 선명도를 증가시키고, 노이즈를 감소시키는 비선형 필터이다. 양방향 필터는 두개의 가우시안 필터(Gaussian filter) 즉, 도메인 필터(domain filter) 및 레인지 필터(range filter)에 의해 동작한다.

경계를 보존하면서(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;
}


댓글