使用基于渐变的方法获取指纹方向

时间:2018-03-19 08:10:31

标签: c++ opencv image-processing orientation fingerprint

我尝试使用this paper中提出的方法获取指纹的方向图。

我尝试执行本文第3.1.1节中描述的步骤,但我没有得到所需的结果。

以下是我的OpenCV代码:

Mat calculate_orientation(Mat img, Mat &coherence) {
    Mat image = img.clone();
    Mat orient_im = Mat::zeros(image.size(), image.type());
    Mat grad_x, grad_y;

    Sobel(image, grad_x, CV_32F, 1, 0, 3, 1, 0, BORDER_DEFAULT );
    Sobel(image, grad_y, CV_32F, 0, 1, 3, 1, 0, BORDER_DEFAULT );

    //Iterate per BLOCKSIZE and use BLOCKSIZE/2 as the center
    for (int i=BLOCKSIZE/2 ; i<=image.rows-BLOCKSIZE/2 ; i+=BLOCKSIZE) {
        for (int j=BLOCKSIZE/2 ; j<=image.cols-BLOCKSIZE/2 ; j+=BLOCKSIZE) {
            //Iterate each pixel in the block
            float vx = 0.0f, vy = 0.0f, angle;

            //Coherence
            float gx = 0.0f, gy = 0.0f, gxy = 0.0f;
            for (int u=i-BLOCKSIZE/2 ; u<i+BLOCKSIZE/2 ; u++) {
                for (int v=j-BLOCKSIZE/2 ; v<j+BLOCKSIZE/2 ; v++) {
                    gx = 2* grad_x.at<float>(u,v) * grad_y.at<float>(u,v);
                    gy = pow(grad_x.at<float>(u,v), 2) - pow(grad_y.at<float>(u,v), 2);
                    vx += gx;
                    vy += gy;
                    gxy += sqrt(pow(gx,2)+pow(gy,2));
                }
            }
            if (vy == 0) {
                angle = 90;
            } else {
                angle = 0.5 * atan(vx/vy) * 180.0f/CV_PI;
            }

            //The angle above is the angle perpendicular to ridge direction
            orient_im.at<float>(i,j) = angle + 90;

            //Coherence
            float coh = sqrt(pow(vx,2)+pow(vy,2))/gxy;
            coherence.at<float>(i,j) = coh;

        }
    }

    return orient_im;
}

这是input image

这是result。蓝线是相干值大于0.5的方向,红线是方向,相干值小于0.5。

只有大约一半的方向似乎是正确的。

我知道已经有一些关于此的问题,但我仍然没有得到正确的结果,所以请原谅我。任何帮助将不胜感激。

0 个答案:

没有答案