什么叫做PSNR?
Peak Signal to Noise Ratio,峰值信噪比,一般是用于最大值信号和背景噪音之间的一个工程项目。
通常在经过影像压缩之后,输出的影像都会在某种程度上与原始影像不同,为了衡量经过处理后的影像品质,我们通常会参考PSNR值来衡量某个处理程序能否令人满意。它是原图像与被处理图像之间的均方误差相对于
的对数值(信号最大值的平方,n是每个采样点的比特数),它的单位是dB。MATLAB用法的公式如下:
其中,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
]