目录
1.PSNR 原理
2.PSNR 的 matlab 实现代码
3. 针对彩色图像的 PSNR 的 matlab 代码
@
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)
来源: https://www.cnblogs.com/xiegaosen/p/12004629.html