虹膜图像清晰度评估

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhongqianli/article/details/87261012

项目地址: https://github.com/zhongqianli/image_focus_assessment

原理

《How Iris Recognition Works》提出了一种快速的虹膜图像清晰度评估算法,核心思想是利用一个8x8的卷积核与640x480的虹膜图像卷积(滤波),得到2D能量谱,其中较低的空间频率被滤除,带通环的较高的空间频率被筛选出来。在那个带宽的总能量就是清晰度的光谱测量。最后,用公式 f ( x ) = 100 x 2 / ( x 2 + c 2 ) f(x) = 100 * x^2 / (x^2 + c^2) 对累积的2D光谱能量进行非线性压缩,得到范围为 [ 0 , 100 ) [0, 100) 的归一化的清晰度分数,其中参数 c c 是harf-power与清晰度分数的50%相一致。

在这里插入图片描述
在这里插入图片描述

实现

OpenCV

#include <opencv2/opencv.hpp>

double image_focus_assessment(const cv::Mat &src)
{
    cv::Mat gray;
    if(src.channels() == 3)
        cv::cvtColor( src, gray, CV_BGR2GRAY);
    else
        gray = src;
    
    cv::Mat kernel;
    cv::Point anchor;
    double delta;
    int ddepth;
    
    anchor = cv::Point( -1, -1 );
    delta = 0;
    ddepth = -1;
    
    // reference: How Iris Recognition Works. John Daugman. 2004
    float data[8][8] = {
        {-1, -1, -1, -1, -1, -1, -1, -1},
        {-1, -1, -1, -1, -1, -1, -1, -1},
        {-1, -1,  3,  3,  3,  3, -1, -1},
        {-1, -1,  3,  3,  3,  3, -1, -1},
        {-1, -1,  3,  3,  3,  3, -1, -1},
        {-1, -1,  3,  3,  3,  3, -1, -1},
        {-1, -1, -1, -1, -1, -1, -1, -1},
        {-1, -1, -1, -1, -1, -1, -1, -1}
    };
    kernel = cv::Mat(8, 8, CV_32F, data);
    
    cv::Mat src_32f;
    gray.convertTo(src_32f, CV_32F);
    cv::Mat dst;
    cv::filter2D(src_32f, dst, ddepth , kernel, anchor, delta, cv::BORDER_DEFAULT );
    
    double power = 0;
    double score = 0;
    for(int row = 0; row < dst.rows; ++row)
        for(int col = 0; col < dst.cols; ++col)
        {
            power += abs(dst.at<float>(row, col));
        }
    const int FOCUS_SCORE_50PERCENT = 60;
    score = (power * power) / (power * power + FOCUS_SCORE_50PERCENT * FOCUS_SCORE_50PERCENT) * 100.0f + 0.5f;
    
    return score;
}

Matlab

function [ score ] = image_focus_assessment( image )
%IMAGE_FOCUS_ASSESSMENT 此处显示有关此函数的摘要
%   此处显示详细说明
%-------8x8 high pass filter
% // reference: How Iris Recognition Works. John Daugman. 2004
kernel = [-1 -1 -1 -1 -1 -1 -1 -1;
     -1 -1 -1 -1 -1 -1 -1 -1;
     -1 -1  3  3  3  3 -1 -1;
     -1 -1  3  3  3  3 -1 -1;
     -1 -1  3  3  3  3 -1 -1;
     -1 -1  3  3  3  3 -1 -1;
     -1 -1 -1 -1 -1 -1 -1 -1;
     -1 -1 -1 -1 -1 -1 -1 -1];
 
kernel = double(kernel);
image = double(image);
res_HPF_Daugman_8x8 = imfilter(image, kernel);

% res_HPF_Daugman_8x8 = im2double(res_HPF_Daugman_8x8);
[rows, cols] = size(res_HPF_Daugman_8x8);
power = 0.0;
for col=1 : cols
    for row=1 : rows
        power = power + abs(res_HPF_Daugman_8x8(row, col));
    end
end
power = power / (cols*rows);
GLOBALFOCUSVALUE_FOR50PERCENT = 60;
score = ((power*power) / (power*power + GLOBALFOCUSVALUE_FOR50PERCENT*GLOBALFOCUSVALUE_FOR50PERCENT)*100 + 0.5);

end

猜你喜欢

转载自blog.csdn.net/zhongqianli/article/details/87261012