11种图像清晰度评价函数

典型无参考图像清晰度评价(可用作对焦评价函数)

Tenengrad评价函数

Tenengrad函数是一种由Tenenbaum提出的,基于梯度的常用图像清晰度评价函数。特南梯度。
在图像处理中,一般认为对焦好的图像具有更尖锐的边缘,故具有更大的梯度函数值。
Tenengrad函数使用Sobel算子提取水平和垂直方向的梯度值,求其平方和作为评价函数。

具体过程如下:

设Sobel卷积核为,则图像在点处的梯度

定义该图像的Tenengrad值为:(其中为图像中像素总数)这个求了平均

或不求平均:评价函数F(k):

其中:T是给定的边缘检测阈值。

 View Code

 Laplacian 梯度函数

利用Laplacian算子对图像进行模板卷积得到图像的高频分量,然后可以对图像的高频分量求和,用高频分量和作为图像的清晰度评价标准。

对于一个M×N像素的图像,每个像素的亮度为g(x,y),进行滤波模板卷积后每个像素点值为z(x,y)。则图像清晰度评价函数:

Laplacian算子:z(x,y)=g(x-1,y)+g(x+1,y)+g(x,y-1)+g(x,y+1)一4g(x,y)

梯度算子为水平方向和垂直方向两个,高通滤波算子只有一个

SMD(灰度差分绝对值之和,Sum of Modulus of gray Difference )函数

 用差分绝对值代替乘方和开方,即对点(x,y)及其邻近点的灰度作差分运算,提取该点灰度值的变化大小,得出图像灰度差分绝对值之和算子。

灰度差分绝对值之和具有较好的计算性能,但其缺点也很明显,即在焦点附近灵敏度不高,即该函数在极值点附近过于平坦,从而导致聚焦精度难以提高。

在文章《一种快速高灵敏度聚焦评价函数》中提出了一种新的评价函数,称之为灰度差分绝对值乘积法,即对每一个像素领域两个灰度差相乘后再逐个像素累加。

“基于图像处理的自动对焦技术研究”,对焦过程中的一个重要阶段是图像清晰度评价,博主自己用MATLAB实现了4类清晰度评价函数:基于图像梯度的清晰度评价函数、频域评价函数、信息熵评价函数、统计学评价函数,总计11种。博主之前没有用过MATLAB,完全是本科论文需要,没办法对着别人的代码生看,虽然没学过matlab的基础知识,但是毕竟学过好几门语言,都是差不多的,还是能看懂的。需要哪部分知识就在网上搜,虽然没有一样的,但是会搜到相关的,看懂了之后,实现自己的代码。

其中基于图像梯度的清晰度评价函数博主很大一部分借鉴他人上传的毕设代码,在此附上链接。

http://www.pudn.com/Download/item/id/1394579.html

一、基于图像梯度的清晰度评价函数 

这类算法的实质是图像处理知识,因为博主报考研究生时选的图像处理方向,所以本科毕业论文找了一位这方面的指导老师。

正焦的清晰图像比模糊的离焦图像边缘更加锐利清晰,边缘像素灰度值变化大,因而有更大的梯度值。在进行图像处理时,将图像看作二维离散矩阵,利用梯度函数获取图像灰度信息,以此来评判图像清晰度。在离散信号中梯度表现为差分形式。常用的梯度函数有:能量梯度函数EOG、Roberts函数、Tenengrad函数、Brenner函数、方差Variance函数、拉普拉斯Laplace函数等等。下面分别对其进行介绍,其中表示对应像素点的灰度值。

1.能量梯度函数(Energy of Gradient,EOG)

将 x 方向和 y 方向的相邻像素的灰度值之差[]的平方和作为每个像素点的梯度值,对所有像素梯度值累加作为清晰度评价函数值,表达式如下所示:

matlab代码如下:

%EOG(Energy Of Grad)
 N1 = 5;      %要处理的图片张数
 A = zeros(1,N1);  %存储每一幅图像清晰度评价值
 X = zeros(1,N1);  %存储做归一化处理后的评价值
tic     %计时
for L=1: N1 
 I=imread([int2str(L),'.jpg']); %连续读取图片
 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=imread([int2str(L),'.jpg']); 
 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;
3.Tenengrad函数

采用Sobel算子提取像素点水平方向和垂直方向的梯度值,Tenengrad函数定义为像素点梯度的平方和,并为梯度设置一个阈值T调节函数的灵敏度。表达式如下式所示:

代码:

%Tenengrad
 N1 =5; 
 A = zeros(1,N1); 
 X = zeros(1,N1); 
 tic
 for L=1: N1 
 I=imread([int2str(L),'.jpg']); 
 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函数

又称梯度滤波器法,只需计算x方向上相差两个像素点的差分,即计算二阶梯度,计算量少,表达式如下所示:

代码:

%Brenner
 N1 = 5;           %N1为要处理的图片张数
 A = zeros(1,N1);   %zeros()定义指定行列的零矩阵;A矩阵用来存储每一幅图像的清晰度原值
 X = zeros(1,N1);   %X用来存储做归一化处理后的函数值
 %------------------------------
 tic
 for L=1: N1        
 I=imread([int2str(L),'.jpg']); %读取图片,将值转换为字符串接受向量和矩阵输入
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=imread([int2str(L),'.jpg']);  
 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算子与图像各个像素点的灰度值进行卷积得到一个梯度矩阵记为,取各像素点梯度的平方和作为评价函数,如下式所示:

代码:

%Laplace 
 N1 = 5; 
 A = zeros(1,N1); 
 X = zeros(1,N1);
 tic
 for L=1: N1 
 I=imread([int2str(L),'.jpg']); 
 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.基于二维离散傅里叶变换的图像清晰度评价函数

 其中,加权系数表示像素到中心像素的距离,其作用为强调频谱中的高频成分。因为图像经过傅里叶变换和移位后,频率分布为从中央到四周边缘从低频向高频扩散;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=imread([int2str(L),'.jpg']); 
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

基于DFT的评价函数灵敏度高,但傅里叶变换系数是复数,计算量大。离散余弦变换DCT对此进行改进,变换系数是实数,计算量减少且同样可以表示图像频率分布信息。对于一幅M*N的图像,基于离散余弦变换DCT变换的清晰度评价函数定义如下:

%DCT
N1 = 5;      %N1要处理的图像张数        
A = zeros(1,N1);  %A向量用来存储每一幅图像的清晰度原值
X = zeros(1,N1);  %X用来存储做归一化处理后的清晰度函数值
%----------------------
tic
for L=1: N1        
I=imread([int2str(L),'.jpg']); 
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=imread([int2str(L),'.jpg']); %读取图片,将值转换为字符串接受向量和矩阵输入
 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=imread([int2str(L),'.jpg']); %读取图片,将值转换为字符串接受向量和矩阵输入
 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=imread([int2str(L),'.jpg']); %读取图片,将值转换为字符串接受向量和矩阵输入
 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
以下是博主的仿真结果:

梯度

频域

信息熵

统计学

 初次接触这方面的内容,不足之处,请谅解。

发布了163 篇原创文章 · 获赞 264 · 访问量 107万+

猜你喜欢

转载自blog.csdn.net/u011555996/article/details/103865614
今日推荐