matlab实现PSNR

Posted xiegaosen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab实现PSNR相关的知识,希望对你有一定的参考价值。

@

1.PSNR原理

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

2.PSNR的matlab实现代码

将图像缩小再放大比较一下,下面是代码:

close all;
clear all;
clc;

img=imread('lena.jpg');
[h w]=size(img);
imgn=imresize(img,[floor(h/2) floor(w/2)]);
imgn=imresize(imgn,[h w]);
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, MSE] = 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:UsersAdministratorDesktop
oise_image.jpg');
 Y= imread('C:UsersAdministratorDesktopactruel_image.jpg');
 psnr(X, Y)

以上是关于matlab实现PSNR的主要内容,如果未能解决你的问题,请参考以下文章

关于matlab里的PSNR问题

MATLAB教程案例24基于matlab的有参图像质量评价仿真与分析,包括MSE,PSNR,NK,AD,SC,MD,NAE

MATLAB中psnr函数如何使用?或者说,有直接可调用的psnr函数吗?像snr函数一样

m基于matlab的图像方块编码仿真,输出编码后PSNR图像质量指标

基于SPIHT小波变换的图像解压缩matlab仿真,输出PSNR值评价图像解压后质量

通过matlab对比CS_CoSaMP,CS_GBP,CS_IHT,CS_IRLS,CS_OMP,CS_SP六种压缩感知图像重构算法的PSNR性能