版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhongqianli/article/details/87261012
项目地址: https://github.com/zhongqianli/image_focus_assessment
原理
《How Iris Recognition Works》提出了一种快速的虹膜图像清晰度评估算法,核心思想是利用一个8x8的卷积核与640x480的虹膜图像卷积(滤波),得到2D能量谱,其中较低的空间频率被滤除,带通环的较高的空间频率被筛选出来。在那个带宽的总能量就是清晰度的光谱测量。最后,用公式 对累积的2D光谱能量进行非线性压缩,得到范围为 的归一化的清晰度分数,其中参数 是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