Sharpening Filter LoG (Laplacian of Gaussian)

라플라시안 필터링은 2차 미분을 사용하여 잡음에 민감하다. 잡음을 줄이기 위한 방법으로 입력영상을 가우시안 필터링하여 잡음을 제거한 후에 라플라시안을 적용하는 방법을 사용할 수 있다. 또는 가우시안 함수에 대한 라플라시안을 계산하여 커널을 생성하여 필터ㅇ링할 수 있다. 이러한 필터링을 LoG라고 한다.

출처 : C++ API OpenCV 프로그래밍(책)

코드
int ksize = 15;
GaussianBlur(srcImage,blurImage,Size(ksize,ksize),0.0);
Laplacian(blurImage,lapImage,CV_32F,ksize);
ZeroCrossing(lapImage,dstImage,10);
normalize(dstImage,dstImageConvert,0,255,NORM_MINMAX,CV_8U);
실행결과

설명

아래는 전체 소스 코드 입니다.

void ZeroCrossing(Mat &src, Mat &dst, int th)
{
    int x,y;
    double a,b;

    Mat zeroCrossH(src.size(), CV_32F,Scalar::all(0));
    Mat_<float> _src(src);

    for(y = 1; y < src.rows-1 ; y++){
        for(x = 1; x < src.cols-1 ; x++){
            a = _src(y,x);
            b = _src(y,x+1);
            if(a== 0)
                a = _src(y,x-1);
            if(a*b < 0)
                zeroCrossH.at<float>(y,x) = fabs(a) + fabs(b);
            else
                zeroCrossH.at<float>(y,x) = 0;
        }

        Mat zeroCrossV(src.size(),CV_32F,Scalar::all(0));
        for(y = 1; y < src.rows ; y++){
            for(x = 1; x < src.cols-1 ; x++){
                a = _src(y,x);
                b = _src(y+1,x);
                if(a ==0)
                    a = _src(y-1,x);
                if(a*b < 0)
                    zeroCrossV.at<float>(y,x) = fabs(a) + fabs(b);
                else
                    zeroCrossV.at<float>(y,x) = 0;
            }
            Mat zeroCross(src.size(),CV_32F,Scalar::all(0));
            add(zeroCrossH,zeroCrossV,zeroCross);
            threshold(zeroCross,dst,th,255,THRESH_BINARY);
        }
    }
}

JNIEXPORT jstring JNICALL
Java_com_tistory_technote_opencvandroid_MainActivity_convertNativeLibtoSharpeningLoG(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 ksize = 15;
    Mat blurImage;
    GaussianBlur(srcImage,blurImage,Size(ksize,ksize),0.0);

    Mat lapImage;
    Laplacian(blurImage,lapImage,CV_32F,ksize);
    Mat dstImage;
    ZeroCrossing(lapImage,dstImage,10);

    Mat dstImageConvert;
    normalize(dstImage,dstImageConvert,0,255,NORM_MINMAX,CV_8U);
    img_result = dstImageConvert.clone();

    buffer << "laplacian ksize = 15";
    const char *cstr = buffer.str().c_str();
    result = env->NewStringUTF(cstr);

    return result;
}

관련문의
Gitbook에서 바로 문의하기

results matching ""

    No results matching ""