psnr用matlab读取一幅图像,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:\Users\Administrator\Desktop\noise_image.jpg');

Y= imread('C:\Users\Administrator\Desktop\actruel_image.jpg');

psnr(X, Y)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值