参考:
https://blog.csdn.net/xiaxiazls/article/details/47952611
https://blog.csdn.net/majinlei121/article/details/46779125
https://blog.csdn.net/xiaohaijiejie/article/details/48053595 ssim 和psnr
代码
PSNR 是最普遍,最广泛使用的评鉴画质的客观量测法,不过许多实验结果都显示,PSNR 的分数无法和人眼看到的视觉品质完全一致,有可能 PSNR 较高者看起来反而比 PSNR 较低者差。这是因为人眼的视觉对于误差的敏感度并不是绝对的,其感知结果会受到许多因素的影响而产生变化(例如:人眼对空间频率较低的对比差异敏感度较高,人眼对亮度对比差异的敏感度较色度高,人眼对一个区域的感知结果会受到其周围邻近区域的影响)。
其中,MSE表示当前图像X和参考图像Y的均方误差(Mean Square Error),H、W分别为图像的高度和宽度;n为每像素的比特数,一般取8,即像素灰阶数为256. PSNR的单位是dB,数值越大表示失真越小
PSNR的差异:
1.灰度图像:灰度图像比较好计算,只有一个灰度值。
2.彩色图像:
(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)
SSIM的差异:同上,如果直接不转换成YCbCr格式,结果会偏高很多(matlab中,SSIM提出者【1】,代码)。opencv里面是分别计算了R,G,B三个分量的SSIM值(官方代码)。最后我将3个值取了个平均(这个值比matlab里面低很多)。
以下代码主要是参考原作者修改的,源代码是直接没有进行格式转换,直接RGB格式,下面我是将他转换成YCbCr计算图片的SSIM
function [mssim, ssim_map] = ssim(img1, img2, K, window, L) %======================================================================== %SSIM Index, Version 1.0 %Copyright(c) 2003 Zhou Wang %All Rights Reserved. % %The author is with Howard Hughes Medical Institute, and Laboratory %for Computational Vision at Center for Neural Science and Courant %Institute of Mathematical Sciences, New York University. % %---------------------------------------------------------------------- %Permission to use, copy, or modify this software and its documentation %for educational and research purposes only and without fee is hereby %granted, provided that this copyright notice and the original authors' %names ap pearon all copies and supporting documentation. This program %shall not be used, rewritten, or adapted as the basis of a commercial %software or hardware product without first obtaining permission of the %authors. The authors make no representations about the suitability of %this software for any purpose. It is provided "as is" without express %or implied warranty. %---------------------------------------------------------------------- % %This is an implementation of the algorithm for calculating the %Structural SIMilarity (SSIM) index between two images. Please refer %to the following paper: % %Z. Wang, A. C. Bovik, H. R. Sheikh, and E. P. Simoncelli, "Image %quality assessment: From error visibility to structural similarity" %IEEE Transactios on Image Processing, vol. 13, no. 4, pp.600-612, %Apr. 2004. % %Kindly report any suggestions or corrections to zhouwang@ieee.org % %---------------------------------------------------------------------- % %Input : (1) img1: the first image being compared % (2) img2: the second image being compared % (3) K: constants in the SSIM index formula (see the above % reference). defualt value: K = [0.01 0.03] % (4) window: local window for statistics (see the above % reference). default widnow is Gaussian given by % window = fspecial('gaussian', 11, 1.5); % (5) L: dynamic range of the images. default: L = 255 % %Output: (1) mssim: the mean SSIM index value between 2 images. % If one of the images being compared is regarded as % perfect quality, then mssim can be considered as the % quality measure of the other image. % If img1 = img2, then mssim = 1. % (2) ssim_map: the SSIM index map of the test image. The map % has a smaller size than the input images. The actual size: % size(img1) - size(window) + 1. %