低光增强评价指标

  • Post author:
  • Post category:其他


什么叫做PSNR?

Peak Signal to Noise Ratio,峰值信噪比,一般是用于最大值信号和背景噪音之间的一个工程项目。

通常在经过影像压缩之后,输出的影像都会在某种程度上与原始影像不同,为了衡量经过处理后的影像品质,我们通常会参考PSNR值来衡量某个处理程序能否令人满意。它是原图像与被处理图像之间的均方误差相对于
(2^n-1)^2
的对数值(信号最大值的平方,n是每个采样点的比特数),它的单位是dB。MATLAB用法的公式如下:

PSNR = 10*log((2^n-1)^2/MSE)

其中,MSE是原图像与处理图像之间的均方误差。

Peak就是指8bits表示法的最大值255.MSE指MeanSquareError,I(角标n)指原始影像第n个pixel值,P(角标n)指经处理后的影像第n个pixel值。PSNR的单位为db,所以PSNR的值越大,就代表噪声所占的比重越小,就代表失真越小。

通常用来评价一幅图像做变换后和原图像相比质量的好坏,注意这里必须有原图像才可以。

PSNR越高,说明失真的效果越小,越接近于原图。

PSNR对输入的两幅图像由什么要求没有?

可以输入灰度图像和彩色图像,都可以:


1.灰度图像

:灰度图像比较好计算,只有一个灰度值。


2.彩色图像


(a)

可以将分别计算R,G,B三个通道总和,最后MSE直接在原公式上多除以3就行(

opencv官方代




是这么做的,与

matlab直接计算结果

是一样的)。


(b)

将R,G,B格式转换为YCbCr,只计算Y分量(亮度分量),结果会比直接计算要高几个dB。

不过需要注意的是,两幅图像的大小必须一致,否则程序不能运行。

如何用MATLAB实现PSNR的算法?

MATLAB自带这个代码,因此一行代码的事

X= imread('E:\Documents\Desktop\效果图\白天\01.Input.jpg');
Y= imread('E:\Documents\Desktop\效果图\白天\02.LIME_new.jpg');
psnr(X, Y)

但是需要注意的是,在对m文件进行命令的时候,不可以命名为psnr.m,这样的话,会造成命令调用的失败。

什么是SSIM?

SSIM(structural similarity index),

结构相似性

,是一种衡量两幅图像相似度的指标。该指标首先由德州大学奥斯丁分校的图像和视频工程实验室(Laboratory for Image and Video Engineering)提出。SSIM使用的两张图像中,一张为未经压缩的无失真图像,另一张为失真后的图像。

给定两个图像X和Y,两张图片的结构相似性可按照下面的方式求出

结构相似性的范围为0-1,当两张图片一模一样时,SSIM的值等于1.

作为结构相似性理论的实现,结构相似度指数从图像组成的角度将结构信息定义为独立于亮度、对比度的,反映场景中物体结构的属性,并将失真建模为亮度、对比度和结构三个不同因素的组合。用均值作为亮度的估计,标准差作为对比度的估计,协方差作为结构相似度程度的度量。

MATLAB实现SSIM?

X= imread('E:\Documents\Desktop\效果图\白天\02.LIME_new.jpg');
Y= imread('E:\Documents\Desktop\效果图\白天\04.DHECI_new.jpg');

s = ssim(X, Y)

什么叫做MSE?

Mean Squared Error,均方误差是指参数估计值与参数真值之差平方的期望值;

MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。

反映了增强后图像与Ground truth之间的差距,其值越小说明增强后图像越接近原始正常光照图像。

均方根误差在图像的质量评价中相当于一个中间的评价指标,很多后续的评价指标都是沿用均方根误差。均方根误差主要是评价已知图像和退化图像之间误差大小。

MATLAB实现MSE?

一行代码的事

err1 = immse(X,Y)

什么叫做LOE?

lightness order error,LOE反映的图像的自然保持能力,其值越小说明图像具有更好的亮度顺序,看起来更自然。

如何用MATLAB实现LOE?

自定义一个m文件

clc, clear, close all

I = imread('E:\Documents\Desktop\效果图\白天\01.Input.jpg'); % original image
Ie = imread('E:\Documents\Desktop\效果图\白天\02.LIME.jpg'); % enhanced image

LOE = loe(I,Ie)

function LOE = loe(I,Ie)


[N M n] = size (I);

L = max(I,[],3);
Le = max(Ie,[],3);

r = 50 / min (M,N);
Md = round(M*r);
Nd = round(N*r);
Ld =imresize(L,[Nd Md]);
Led =imresize(Le,[Nd Md]);

RD = zeros (Nd,Md);
size (RD);

for y = 1:Md
    for x = 1:Nd

        E = xor((Ld(x,y)>=Ld(:,:)),(Led(x,y)>=Led(:,:)));
        RD(x,y) = sum(E(:));

    end
end

LOE = sum(RD(:))/(Md*Nd)

end

如何得到一张图片的光照图?

如何得到一张图片的热力图?

clc, clear, close all
RGB = imread('1.jpg'); % 一定要是单通道图
figure('Name', 'RGB');imshow(RGB);
HSV = rgb2hsv(RGB);
V = HSV(:,:,3);

figure('Name', 'V');imshow(V);
colormap(default); % jet是matlab自带彩色方法,也其他方法,或自定义

注意这里输入的图片应该是单通道图片。

如何生成图片的直方图?

MATLAB有现成的代码,因此一行代码的事:

I = imread('1.jpg');
imhist(I);

MATLAB如何构建数组?

filename=["01.Input.jpg"
"02.LIME.jpg"
"02.LIME_new.jpg"
"03.BPDHE.jpg"
"04.DHECI.jpg"
"04.DHECI_new.jpg"
"05.DONG.jpg"
"06.HE.jpg"
"07.Retinex-Net.jpg"
"08.MSR.jpg"
"09.SSR.jpg"
"10.RR.jpg"
"11.MF.jpg"
"12.NPE.jpg"
"13.SRIE.jpg"
"14.BIMEF.jpg"
"15.JED.jpg"
"16.Ours.jpg"
]
filename(1)

MATLAB批量计算图像的PSNR,并将结果写到TXT文本中?

clc, clear, close all

filename=["01.Input.jpg"
"02.LIME.jpg"
"03.BPDHE.jpg"
"04.DHECI.jpg"
"05.DONG.jpg"
"06.HE.jpg"
"07.Retinex-Net.jpg"
"08.MSR.jpg"
"09.SSR.jpg"
"10.RR.jpg"
"11.MF.jpg"
"12.NPE.jpg"
"13.SRIE.jpg"
"14.BIMEF.jpg"
"15.JED.jpg"
"16.Ours.jpg"
];


A = imread('01.Input.jpg');
result=[]
for i = 1:1:16
    filename(i)
    B = imread(filename(i));
    result(i) = psnr(A,B)
end


mat2txt(result,'PSNR_result.txt')





% 把矩阵 matrix 保存成任意后缀的文件
% 转换成 .txt 举例:mat2txt( data, 'filename.txt');
% 转换成 .corr 举例:mat2txt( data, 'filename.corr');

function back = mat2txt(matrix,file_Name) 
fop = fopen( file_Name, 'wt' );
[M,N] = size(matrix);
for m = 1:M
    for n = 1:N
        fprintf( fop, ' %s', mat2str( matrix(m,n) ) );
    end
    fprintf(fop, '\n' );
end
back = fclose( fop ) ;
end


MATLAB批量计算图像的SSIM,并将结果写到TXT文本中?

clc, clear, close all

filename=["01.Input.jpg"
"02.LIME.jpg"
"03.BPDHE.jpg"
"04.DHECI.jpg"
"05.DONG.jpg"
"06.HE.jpg"
"07.Retinex-Net.jpg"
"08.MSR.jpg"
"09.SSR.jpg"
"10.RR.jpg"
"11.MF.jpg"
"12.NPE.jpg"
"13.SRIE.jpg"
"14.BIMEF.jpg"
"15.JED.jpg"
"16.Ours.jpg"
];


A = imread('01.Input.jpg');
result=[]
for i = 1:1:16
    filename(i)
    B = imread(filename(i));
    result(i) = ssim(A,B)
end


mat2txt(result,'SSIM_result.txt')





% 把矩阵 matrix 保存成任意后缀的文件
% 转换成 .txt 举例:mat2txt( data, 'filename.txt');
% 转换成 .corr 举例:mat2txt( data, 'filename.corr');

function back = mat2txt(matrix,file_Name) 
fop = fopen( file_Name, 'wt' );
[M,N] = size(matrix);
for m = 1:M
    for n = 1:N
        fprintf( fop, ' %s', mat2str( matrix(m,n) ) );
    end
    fprintf(fop, '\n' );
end
back = fclose( fop ) ;
end


MATLAB批量计算图像的MSE,并将结果写到TXT文本中?

clc, clear, close all

filename=["01.Input.jpg"
"02.LIME.jpg"
"03.BPDHE.jpg"
"04.DHECI.jpg"
"05.DONG.jpg"
"06.HE.jpg"
"07.Retinex-Net.jpg"
"08.MSR.jpg"
"09.SSR.jpg"
"10.RR.jpg"
"11.MF.jpg"
"12.NPE.jpg"
"13.SRIE.jpg"
"14.BIMEF.jpg"
"15.JED.jpg"
"16.Ours.jpg"
];


A = imread('01.Input.jpg');
result=[]
for i = 1:1:16
    filename(i)
    B = imread(filename(i));
    result(i) = immse(A,B)
end


mat2txt(result,'MSE_result.txt')





% 把矩阵 matrix 保存成任意后缀的文件
% 转换成 .txt 举例:mat2txt( data, 'filename.txt');
% 转换成 .corr 举例:mat2txt( data, 'filename.corr');

function back = mat2txt(matrix,file_Name) 
fop = fopen( file_Name, 'wt' );
[M,N] = size(matrix);
for m = 1:M
    for n = 1:N
        fprintf( fop, ' %s', mat2str( matrix(m,n) ) );
    end
    fprintf(fop, '\n' );
end
back = fclose( fop ) ;
end


MATLAB批量计算图像的LOE,并将结果写到TXT文本中?

clc, clear, close all

filename=["01.Input.jpg"
"02.LIME.jpg"
"03.BPDHE.jpg"
"04.DHECI.jpg"
"05.DONG.jpg"
"06.HE.jpg"
"07.Retinex-Net.jpg"
"08.MSR.jpg"
"09.SSR.jpg"
"10.RR.jpg"
"11.MF.jpg"
"12.NPE.jpg"
"13.SRIE.jpg"
"14.BIMEF.jpg"
"15.JED.jpg"
"16.Ours.jpg"
];


A = imread('01.Input.jpg');
result=[]
for i = 1:1:16
    i
    filename(i)
    B = imread(filename(i));
    result(i) = loe(A,B)
end


mat2txt(result,'LOE_result.txt')





% 把矩阵 matrix 保存成任意后缀的文件
% 转换成 .txt 举例:mat2txt( data, 'filename.txt');
% 转换成 .corr 举例:mat2txt( data, 'filename.corr');

function back = mat2txt(matrix,file_Name) 
fop = fopen( file_Name, 'wt' );
[M,N] = size(matrix);
for m = 1:M
    for n = 1:N
        fprintf( fop, ' %s', mat2str( matrix(m,n) ) );
    end
    fprintf(fop, '\n' );
end
back = fclose( fop ) ;
end





function LOE1 = loe(I,Ie);


[N M n] = size (I);

L = max(I,[],3);
Le = max(Ie,[],3);

r = 50 / min (M,N);
Md = round(M*r);
Nd = round(N*r);
Ld =imresize(L,[Nd Md]);
Led =imresize(Le,[Nd Md]);

RD = zeros (Nd,Md);
size (RD);

for y = 1:Md
    for x = 1:Nd

        E = xor((Ld(x,y)>=Ld(:,:)),(Led(x,y)>=Led(:,:)));
        RD(x,y) = sum(E(:));

    end
end

LOE1 = sum(RD(:))/(Md*Nd);

end

这个需要注意,整个m文件不能保存为LOE,会得不到自己想要的结果,最好保存成其他的名字,因为里面已经有了一个loe的自定义function。

matlab如何实现计算VIF?

H.R. Sheikh and A.C. Bovik, “Image information and visual quality”, IEEE Trans. on Image Processing, vol. 15, pp. 430-444, 2006.

[code:

http://live.ece.utexas.edu/research/Quality/vifvec_release.zip

]



版权声明:本文为u014723479原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。