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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM