# 11种图像清晰度评价函数附MATLAB代码

matlab代码如下：

%EOG(Energy Of Grad)
N1 = 5;      %要处理的图片张数
A = zeros(1,N1);  %存储每一幅图像清晰度评价值
X = zeros(1,N1);  %存储做归一化处理后的评价值
tic     %计时
for L=1: N1
I=double(I);
[M N]=size(I);
FI=0;
for x=1:M-1
for y=1:N-1
% x方向和y方向的相邻像素灰度值只差的的平方和作为清晰度值
FI=FI+(I(x+1,y)-I(x,y))*(I(x+1,y)-I(x,y))+(I(x,y+1)-I(x,y))*(I(x,y+1)-I(x,y));
end
end

A(1,L) = FI;
end
time=toc
%--------------------------------
%对图像清晰度值做归一化处理，线性函数归一化公式
for W = 1:N1
C = max(A);
D = min(A);
E = C-D;
R = (A(1,W) - D)/(E);
X(1,W) = R;
end
%做曲线拟合输出函数曲线
x1=[-20 -10 0 10 20 ];
y1 = [X(1,1) X(1,2) X(1,3) X(1,4) X(1,5)];
[p,S]=polyfit(x1,y1,2);
Y=polyconf(p,x1,y1);
plot(x1,y1,'y');
hold on;

2.Roberts函数

Roberts函数与能量梯度函数相似，它是利用对角方向像素点灰度值之差。将4个相邻像素点的灰度值交叉相减的平方和作为每个像素点的梯度值，对所有像素梯度值累加作为清晰度评价函数值，表达式如下式所示：

%Roberts
N1 = 5;
A = zeros(1,N1);
X = zeros(1,N1);
tic
for L=1: N1
I=double(I);
[M N]=size(I);
FI=0;
%Robert算子原理，对角方向相邻的两像素之差
for x=1:M-1
for y=1:N-1
FI= FI + (abs(I(x,y)-I(x+1,y+1))+abs(I(x+1,y)-I(x,y+1)));
end
end
A(1,L) = FI;
end
time=toc

for W = 1:N1
C = max(A);
D = min(A);
E = C-D;
R = (A(1,W) - D)/(E);
X(1,W) = R;
end

x1=[-20 -10 0 10 20 ];
y1 = [X(1,1) X(1,2) X(1,3) X(1,4) X(1,5)];
[p,S]=polyfit(x1,y1,2);
Y=polyconf(p,x1,y1);
plot(x1,y1,'c');
hold on;

%Tenengrad
N1 =5;
A = zeros(1,N1);
X = zeros(1,N1);
tic
for L=1: N1
I=double(I);
[M N]=size(I);
%利用sobel算子gx,gy与图像做卷积，提取图像水平方向和垂直方向的梯度值
GX = 0;   %图像水平方向梯度值
GY = 0;   %图像垂直方向梯度值
FI = 0;   %变量，暂时存储图像清晰度值
T  = 0;   %设置的阈值
for x=2:M-1
for y=2:N-1
GX = I(x-1,y+1)+2*I(x,y+1)+I(x+1,y+1)-I(x-1,y-1)-2*I(x,y-1)-I(x+1,y-1);
GY = I(x+1,y-1)+2*I(x+1,y)+I(x+1,y+1)-I(x-1,y-1)-2*I(x-1,y)-I(x-1,y+1);
SXY= sqrt(GX*GX+GY*GY); %某一点的梯度值
%某一像素点梯度值大于设定的阈值，将该像素点考虑，消除噪声影响
if SXY>T
FI = FI + SXY*SXY;    %Tenengrad值定义
end
end
end
A(1,L) = FI;
end
time=toc

% X = zeros(1,N1);
for W = 1:N1
C = max(A);
D = min(A);
E = C-D;
R = (A(1,W) - D)/(E);
X(1,W) = R;
end
x1=[-20 -10 0 10 20 ];
y1 = [X(1,1) X(1,2) X(1,3) X(1,4) X(1,5)];
[p,S]=polyfit(x1,y1,2);
Y=polyconf(p,x1,y1);
plot(x1,y1,'g');
hold on;

4.Brenner函数

%Brenner
N1 = 5;           %N1为要处理的图片张数
A = zeros(1,N1);   %zeros()定义指定行列的零矩阵；A矩阵用来存储每一幅图像的清晰度原值
X = zeros(1,N1);   %X用来存储做归一化处理后的函数值
%------------------------------
tic
for L=1: N1
I=double(I);         %精度存储问题
[M N]=size(I);     %M等于矩阵行数，N等于矩阵列数；size()获取矩阵行列
FI=0;        %变量，暂时存储每一幅图像的Brenner值
for x=1:M-2      %Brenner函数原理，计算相差两个位置的像素点的灰度值
for y=1:N
FI=FI+(I(x+2,y)-I(x,y))*(I(x+2,y)-I(x,y));
end
end
A(1,L) = FI;
end
time=toc
%对原始数据做归一化处理，线性函数归一化公式
for W = 1:N1
C = max(A);
D = min(A);
E = C-D;
R = (A(1,W) - D)/(E);
X(1,W) = R;
end
%曲线拟合
x1=[-20 -10 0 10 20 ];
y1 = [X(1,1) X(1,2) X(1,3) X(1,4) X(1,5)];
[p,S]=polyfit(x1,y1,2);   %polyfit(x,y,n)曲线拟合函数，已知离散点坐标拟合曲线；x,y横纵坐标，n为拟合阶数，一阶直线拟合，二阶抛物线拟合 ，返回幂次从高到低的多项式系数向量P，矩阵S用于生成预测值的误差估计
Y=polyconf(p,x1,y1); %置信区间
plot(x1,y1,'r');     %画出拟合曲线，红线red
title('梯度评价函数');
xlabel('成像面位置');
ylabel('归一化后的图像清晰度评价值');
hold on;

5.Variance方差函数

Variance函数表示图像灰度分布的离散程度。离焦图像灰度值变换范围小，离散程度低，方差小；正焦图像灰度值变换范围大，离散程度高，方差大。因此可以用其作为评价函数，对于M*N大小的图像表达式如下式所示：

代码：

%Variance
N1 = 5;
A = zeros(1,N1);
X = zeros(1,N1);
tic
for L=1: N1
I=double(I);
[M N]=size(I);
gama = 0;   %gama图像平均灰度值
%求gama
for x=1:M
for y=1:N
gama = gama + I(x,y);
end
end
gama = gama/(M*N);

FI=0;
for x=1:M
for y=1:N
FI=FI+(I(x,y)-gama)*(I(x,y)-gama);
end
end
A(1,L) = FI;
end
time=toc
for W = 1:N1
C = max(A);
D = min(A);
E = C-D;
R = (A(1,W) - D)/(E);
X(1,W) = R;
end

x1=[-20 -10 0 10 20 ];
y1 = [X(1,1) X(1,2) X(1,3) X(1,4) X(1,5)];
[p,S]=polyfit(x1,y1,2);
Y=polyconf(p,x1,y1);
plot(x1,y1,'b');
hold on;

6. Laplace拉普拉斯函数

%Laplace
N1 = 5;
A = zeros(1,N1);
X = zeros(1,N1);
tic
for L=1: N1
I=double(I);
[M N]=size(I);
FI=0;
for x=2:M-1
for y=2:N-1
IXXIYY = -4*I(x,y)+I(x,y+1)+I(x,y-1)+I(x+1,y)+I(x-1,y);
FI=FI+IXXIYY*IXXIYY;        %取各像素点梯度的平方和作为清晰度值
end
end
A(1,L) = FI;
end
time=toc

for W = 1:N1
C = max(A);
D = min(A);
E = C-D;
R = (A(1,W) - D)/(E);
X(1,W) = R;
end

x1=[-20 -10 0 10 20 ];
y1 = [X(1,1) X(1,2) X(1,3) X(1,4) X(1,5)];
[p,S]=polyfit(x1,y1,2);
Y=polyconf(p,x1,y1);
plot(x1,y1,'m');
hold off;


1.基于二维离散傅里叶变换的图像清晰度评价函数

其中，加权系数$\sqrt{{u}^{2}+{v}^{2}}$表示像素到中心像素的距离，其作用为强调频谱中的高频成分。因为图像经过傅里叶变换和移位后，频率分布为从中央到四周边缘从低频向高频扩散；M,N 为图像尺寸；P（u，v）表示图像的频谱的平方。

%DFT
N1 = 5;      %N1要处理的图像张数
A = zeros(1,N1);  %A向量用来存储每一幅图像的清晰度原值
X = zeros(1,N1);  %X用来存储做归一化处理后的清晰度函数值
%----------------------
tic
for L=1: N1
I=rgb2gray(I);
I=double(I);
[M N]=size(I);
fftI = fft2(I);   %进行二维离散傅里叶变换
sfftI = fftshift(fftI);   %移位，直流分量移到图像中心
magnitude = abs(sfftI);      %取模值
FI=0;
for u=1:M
for v=1:N
FI=FI+sqrt(u*u+v*v)*magnitude(u,v);      %基于离散傅里叶变换的清晰度评价函数
end
end
A(1,L) = FI/(M*N);
end
time=toc
%对原始数据做归一化处理，线性函数归一化公式
%-------------------------
for W = 1:N1
C = max(A);
D = min(A);
E = C-D;
R = (A(1,W) - D)/(E);
X(1,W) = R;
end
%曲线拟合，0为正焦位置，离焦-正焦-离焦
x1=[-20 -10 0 10 20 ];
y1 = [X(1,1) X(1,2) X(1,3) X(1,4) X(1,5)];
[p,S]=polyfit(x1,y1,2);   %polyfit(x,y,n)曲线拟合函数，已知离散点坐标拟合曲线；x,y横纵坐标，n为拟合阶数，一阶直线拟合，二阶抛物线拟合 ，返回幂次从高到低的多项式系数向量P，矩阵S用于生成预测值的误差估计
Y=polyconf(p,x1,y1); %置信区间
plot(x1,y1,'b');     %画出拟合曲线，红线red
title('频域评价函数');
xlabel('成像面位置');
ylabel('归一化后的图像清晰度评价值');
hold on;



2.离散余弦变换DCT

%DCT
N1 = 5;      %N1要处理的图像张数
A = zeros(1,N1);  %A向量用来存储每一幅图像的清晰度原值
X = zeros(1,N1);  %X用来存储做归一化处理后的清晰度函数值
%----------------------
tic
for L=1: N1
I=rgb2gray(I);
I=double(I)+10*randn(size(I));
[M N]=size(I);
dctI = dct2(I);   %进行二维离散傅里叶变换
magnitude = abs(dctI);      %取模值
FI=0;
for u=1:M
for v=1:N
FI=FI+(u+v)*magnitude(u,v);      %基于离散傅里叶变换的清晰度评价函数
end
end
A(1,L) = FI/(M*N);
end
time=toc
%对原始数据做归一化处理，线性函数归一化公式
%-------------------------
for W = 1:N1
C = max(A);
D = min(A);
E = C-D;
R = (A(1,W) - D)/(E);
X(1,W) = R;
end
%曲线拟合，0为正焦位置，离焦-正焦-离焦
x1=[-20 -10 0 10 20 ];
y1 = [X(1,1) X(1,2) X(1,3) X(1,4) X(1,5)];
[p,S]=polyfit(x1,y1,2);   %polyfit(x,y,n)曲线拟合函数，已知离散点坐标拟合曲线；x,y横纵坐标，n为拟合阶数，一阶直线拟合，二阶抛物线拟合 ，返回幂次从高到低的多项式系数向量P，矩阵S用于生成预测值的误差估计
Y=polyconf(p,x1,y1); %置信区间
plot(x1,y1,'r');     %画出拟合曲线，红线red
hold off;


%entropy
N1 = 5;           %N1为要处理的图片张数
A = zeros(1,N1);   %zeros()定义指定行列的零矩阵；A矩阵用来存储每一幅图像的清晰度原值
X = zeros(1,N1);   %X用来存储做归一化处理后的函数值
%处理图片
tic
for L=1: N1
I=rgb2gray(I);
I=double(I);
A(1,L)=entr(I);    %调用求熵值函数
end
time=toc
%对原始数据做归一化处理，线性函数归一化公式
for W = 1:N1
C = max(A);
D = min(A);
E = C-D;
R = (A(1,W) - D)/(E);
X(1,W) = R;
end
x1=[-20 -10 0 10 20 ];
y1 = [X(1,1) X(1,2) X(1,3) X(1,4) X(1,5)];
[p,S]=polyfit(x1,y1,2);   %polyfit(x,y,n)曲线拟合函数，已知离散点坐标拟合曲线；x,y横纵坐标，n为拟合阶数，一阶直线拟合，二阶抛物线拟合 ，返回幂次从高到低的多项式系数向量P，矩阵S用于生成预测值的误差估计
Y=polyconf(p,x1,y1); %置信区间
plot(x1,y1,'r');     %画出拟合曲线，红线red
title('基于信息熵的评价函数');
xlabel('成像面位置');
ylabel('归一化后的图像清晰度评价值');

%定义子函数entr()，求一幅图像的熵值
%-------------------------------------------
function[H_img]= entr(I)
[C,R]=size(I); %求图像的规格
Img_size=C*R; %图像像素点的总个数
L=256; %图像的灰度级0-255
H_img=0;  %图象熵
nk=zeros(L,1); %存储图像灰度出现次数
for i=1:C
for j=1:R
Img_level=I(i,j)+1; %获取图像的灰度级
nk(Img_level)=nk(Img_level)+1; %统计每个灰度级像素的点数
end
end
for k=1:L
Ps(k)=nk(k)/Img_size; %计算每一个灰度级像素点所占的概率
if Ps(k)~=0 %去掉概率为0的像素点
H_img=-Ps(k)*log2(Ps(k))+H_img; %求熵值的公式
end
end
end



1.Range函数

Range函数基于灰度直方图中灰度带的变化大小反映清晰度，定义如下所示：

代码：

%Range
N1 =5;
gray_level = 32; %灰度直方图中划分的灰度等级
temp=zeros(1,gray_level);
A = zeros(1,N1);
X = zeros(1,N1);
tic
for L=1: N1
I=rgb2gray(I);
I=double(I);   %-------没做数值类型，出错，曲线相反----------
[count,K] = imhist(I,gray_level);%imhist()画灰度分布直方图,count表示某一灰度区间的像素个数，K表示灰度区间取值
for y=1:gray_level
temp(1,y)=count(y)*K(y);
end
A(1,L)=max(temp)-min(temp);
end
time=toc
for W = 1:N1
C = max(A);
D = min(A);
E = C-D;
R = (A(1,W) - D)/(E);
X(1,W) = R;
end
x1=[-20 -10 0 10 20 ];
y1 = [X(1,1) X(1,2) X(1,3) X(1,4) X(1,5)];
[p,S]=polyfit(x1,y1,2);   %polyfit(x,y,n)曲线拟合函数，已知离散点坐标拟合曲线；x,y横纵坐标，n为拟合阶数，一阶直线拟合，二阶抛物线拟合 ，返回幂次从高到低的多项式系数向量P，矩阵S用于生成预测值的误差估计
Y=polyconf(p,x1,y1); %置信区间
plot(x1,y1,'g');     %画出拟合曲线，红线red
title('统计学评价函数');
xlabel('成像面位置');
ylabel('归一化后的图像清晰度评价值');
hold on

2 Vollaths函数

Vollaths函数又称自相关函数，反映空间两点的相似性。正焦图像边缘清晰锐利，像素点之间相关程度低；离焦图像像素点相关程度高。清晰度评价函数如下所示：

.代码：

%vollaths
N1 = 5;           %N1为要处理的图片张数
A = zeros(1,N1);   %zeros()定义指定行列的零矩阵；A矩阵用来存储每一幅图像的清晰度原值
X = zeros(1,N1);   %X用来存储做归一化处理后的函数值
%用一个for循环处理每一张图片
tic
for L=1: N1
I=double(I);        %精度存储问题
[M N]=size(I);     %M等于矩阵行数，N等于矩阵列数；size()获取矩阵行列数
%begintime=clock;

FI=0;        %变量，暂时存储每一幅图像的Brenner值
for x=1:M-2      %Brenner函数原理，计算相差两个位置的像素点的灰度值
for y=1:N
FI=FI+I(x,y)*abs(I(x+1,y)-I(x+2,y));
end
end
%time=etime(clock,begintime);
A(1,L) = FI;
end
time=toc
%对原始数据做归一化处理，线性函数归一化公式
for W = 1:N1
C = max(A);
D = min(A);
E = C-D;
R = (A(1,W) - D)/(E);
X(1,W) = R;
end

x1=[-20 -10 0 10 20 ];
y1 = [X(1,1) X(1,2) X(1,3) X(1,4) X(1,5)];
[p,S]=polyfit(x1,y1,2);   %polyfit(x,y,n)曲线拟合函数，已知离散点坐标拟合曲线；x,y横纵坐标，n为拟合阶数，一阶直线拟合，二阶抛物线拟合 ，返回幂次从高到低的多项式系数向量P，矩阵S用于生成预测值的误差估计
Y=polyconf(p,x1,y1); %置信区间
plot(x1,y1,'r');     %画出拟合曲线，红线red
hold off


03-01

09-19
09-12
07-28 4万+
03-08 4万+
09-20
08-15 7816
01-06 341
05-17 1万+
07-26 237
06-30 7468
01-06 5617

¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。