基于局部对比度的质量评价隶属于全参考的图片质量评估,是将图片分块后求加权均值和方差最后利用提出的公式计算QILV的一共方法,原文:《Image Quality Assessment Based on Local Variance,Santiago A.F.》
步骤:对原图像和参考图像
1.将原始图像转化为灰度图像后,转化为若干个M*N大小的图像分块。利用同等大小的二维高斯函数获得每个像素对应的权值;
maxi=max(m,n);
mini=min(m,n);
sig=randi([mini,maxi]);
w_x=(1-floor(n/2):n-floor(n/2));%为与图像大小相同 mn互换
w_y=(1-floor(m/2):m-floor(m/2));
[X,Y]=meshgrid(w_x,w_y);
W=exp(-(X.^2+Y.^2)./sig.^2);%生成二维高斯函数,用于计算块内每个的像素的权值
W即为高斯函数
2.加权求每个(第k个)分块的均值和方差;
3.求原图像的总均值和方差( len(mean)表示分了多少个子图像)
4.对于两个图像I J 分别得到miu和kesi后,求基于局部对比的相似度:
5.根据一下公式求最后的QILV:
代码:
function [avg,var]=get_every_image(I)%返回子图象的加权均值和方差
[m,n]=size(I);
maxi=max(m,n);
mini=min(m,n);
sig=randi([mini,maxi]);
w_x=(1-floor(n/2):n-floor(n/2));%为与图像大小相同 mn互换
w_y=(1-floor(m/2):m-floor(m/2));
[X,Y]=meshgrid(w_x,w_y);
W=exp(-(X.^2+Y.^2)./sig.^2);%生成二维高斯函数,用于计算块内每个的像素的权值
avg=0;
var=0;
for i=1:m
for j=1:n
avg=avg+W(i,j)*I(i,j);
end
end
avg=avg/sum(sum(W));%计算均值
for i=1:m
for j=1:n
var=var+((I(i,j)-avg)^2)*W(i,j);
end
end
var=var/sum(sum(W));%计算方差
end
function [miu,kesi,I_comp]=getcompI(I,lenx,leny)%返回图像的总Miu和kesi
[m,n]=size(I);
co_m=floor(m/lenx);%一块的长度
co_n=floor(n/leny);
I_comp=zeros(lenx*leny,2);%存储每一块的均值和方差
num=0;
kesi=0;
for i=1:lenx
for j=1:leny
I_del=I(1+(i-1)*co_m:i*co_m,1+(j-1)*co_n:j*co_n);
num=num+1;
[I_comp(num,1),I_comp(num,2)]=get_every_image(I_del);
end
end
miu=mean(I_comp(:,2));
for i=1:size(I_comp,1)
kesi=kesi+(I_comp(i,2)-miu)^2;
end
kesi=kesi/(size(I_comp,1)-1);
kesi=sqrt(kesi);
end
主函数入口:
I1 = imread("xxx.jpg");
I2 = imread("yyy.jpg");
qilv(I1, I2)
function[QILV]=qilv(I1,I2)
I1=double(rgb2gray(I1));
I2=double(rgb2gray(I2));
lenx=8;%一行分为多少个
leny=7;%一列分为多少个
[miu1,kesi1,I_comp1]=getcompI(I1,lenx,leny);
[miu2,kesi2,I_comp2]=getcompI(I2,lenx,leny);
kesi=0;
for i=1:lenx*leny
kesi=kesi+(I_comp1(i,2)-miu1)*(I_comp2(i,2)-miu2);%对比度
end
kesi=kesi/(lenx*leny-1);
QILV=abs(4*miu1*miu2*kesi1*kesi2*kesi/((miu1^2+miu2^2)*(kesi1^2+kesi2^2)*kesi1*kesi2));
end