MATLAB 均方根誤差MSE、兩圖像的信噪比SNR、峰值信噪比PSNR、結構相似性SSIM


  今天的作業是求兩幅圖像的MSE、SNR、PSNR、SSIM.代碼如下:

clc;
close all;
X = imread('q1.tif');%             讀取圖像
Y=imread('q2.tif');
figure;%                           展示圖像
subplot(1, 3, 1); imshow(X); title('q1');
subplot(1, 3, 2); imshow(Y); title('q2');
%                                  使得圖像每個像素值為浮點型
X = double(X); 
Y = double(Y); 

A = Y-X;
B = X.*Y;
subplot(1,3,3);imshow(A);title('作差');
MSE = sum(A(:).*A(:))/numel(Y);%  均方根誤差MSE,numel()函數返回矩陣元素個數
SNR = 10*log10(sum(X(:).*X(:))/MSE/numel(Y));%信噪比SNR
PSNR = 10*log10(255^2/MSE);%      峰值信噪比PSNR

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%以下為結構相似度SSIM
ux=sum(X(:).*X(:))/numel(X);
uy=sum(Y(:).*Y(:))/numel(Y);
sigmoidx=sum(X(:).*X(:)-ux)/numel(X);
sigmoidy=sum(Y(:).*Y(:)-uy)/numel(Y);
sigmoidxy=sum(B(:).*B(:))/(numel(B)*ux*uy)-ux*uy;
SSIM=(2*ux*uy)*(2*sigmoidxy)/(ux*ux+uy*uy)/(sigmoidx*sigmoidx+sigmoidy*sigmoidy);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

display(MSE);%均方根誤差MSE
display(SNR);%信噪比SNR
display(PSNR);%峰值信噪比PSNR
display(SSIM);%結構相似性SSIM

  接下來,讓我們看一下代碼的輸出。

 

MSE =153.6263

SNR =19.7617

PSNR =26.2661

SSIM =-1.5281e+26

  

 

  根據觀察,兩幅圖像可能來自於連拍,圖片中的內容幾乎完全一致。僅僅是對應的像素點產生了偏移。上圖圖三反應的是兩幅圖像作差以后的結果。根據均方根誤差MSE,我們發現從數據上兩幅圖存在有巨大差異。這顯然不符合我們的觀察。作為圖像質量評價指標,客觀評價MSE與人眼的主觀判斷產生出入,這說明MSE並不是一個合適的指標。原因是:MSE指標的核心在於兩幅圖像相應像素點之間差值的平方和。這直接導致了該指標對於圖像的空間分布沒有“全局”認識,而只是局限於單純的像素“個體”。

  而SNR和PSNR,在本例中取得了較好的效果。不過,個人認為在高熵圖像中容易失效,在具有足夠多中心點的着色過的Vornoi圖和其平移圖像中,SNR和PSNR將會難有成效。

  對於SSIM,SSIM綜合考慮了兩幅圖像的均值、方差,以及他們的協方差,從而在本例中取得了非常好的效果。

2019-03-04

23:14:07


免責聲明!

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



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