花開終贁落 发表于 2019-12-16 15:47:23

matlab实现PSNR


1.PSNR原理
PSNR,峰值信噪比,通常用来评价一幅图像压缩后和原图像相比质量的好坏,当然,压缩后图像一定会比原图像质量差的,所以就用这样一个评价指标来规定标准了。PSNR越高,压缩后失真越小。这里主要定义了两个值,一个是均方差MSE,另一个是峰值信噪比PSNR,公式如下:

这里的MAX通常是图像的灰度级,一般就是255了。

2.PSNR的matlab实现代码
将图像缩小再放大比较一下,下面是代码:
close all;
clear all;
clc;

img=imread('lena.jpg');
=size(img);
imgn=imresize(img,);
imgn=imresize(imgn,);
img=double(img);
imgn=double(imgn);

B=8;                %编码一个像素用多少二进制位
MAX=2^B-1;          %图像有多少灰度级
MES=sum(sum((img-imgn).^2))/(h*w);   %均方差
PSNR=20*log10(MAX/sqrt(MES));         %峰值信噪比
PSNR越高,图像和原图越接近。

3.针对彩色图像的PSNR的matlab代码
(a)可以将分别计算R,G,B三个通道总和,最后MSE直接在原公式上多除以3就行(opencv官方代码是这么做的,与matlab直接计算结果是一样的)。
(b)将R,G,B格式转换为YCbCr,只计算Y分量(亮度分量),结果会比直接计算要高几个dB。
贴代码,这里是将图片格式转成YCbCr(只计算Y分量):
function = psnr(X, Y)
%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 计算峰值信噪比PSNR
% 将RGB转成YCbCr格式进行计算
% 如果直接计算会比转后计算值要小2dB左右(当然是个别测试)
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%
if size(X,3)~=1   %判断图像时不是彩色图,如果是,结果为3,否则为1
   org=rgb2ycbcr(X);
   test=rgb2ycbcr(Y);
   Y1=org(:,:,1);
   Y2=test(:,:,1);
   Y1=double(Y1);%计算平方时候需要转成double类型,否则uchar类型会丢失数据
   Y2=double(Y2);
else            %灰度图像,不用转换
   Y1=double(X);
   Y2=double(Y);
end

if nargin<2   
   D = Y1;
else
if any(size(Y1)~=size(Y2))
    error('The input size is not equal to each other!');
end
D = Y1 - Y2;
end
MSE = sum(D(:).*D(:)) / numel(Y1);
PSNR = 10*log10(255^2 / MSE);

然后写主函数
X= imread('C:\Users\Administrator\Desktop\noise_image.jpg');
Y= imread('C:\Users\Administrator\Desktop\actruel_image.jpg');
psnr(X, Y)

sakiny 发表于 2019-12-16 17:10:39

很好例子,感谢分享!
页: [1]
查看完整版本: matlab实现PSNR