@
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)