function dPSNR = psnr(imA,imB,iMax) %% -------------------------------------------------------------------- %% % Function: Calculates the PSNR (Peak Signal to Noise Ratio) % From: % Argument: dPSNR: PSNR % imA: ImageA % imB: ImageB % MaxGray: 理论应为max(max(imA),max(imB)) % Demo: psnr(imA,imB); % Version: 2.01.20090510,1.07.20061215 % Email: weiweimin@hotmail.com % Web: http://www.TrueMark.cn %% -------------------------------------------------------------------- %% dPSNR = 0; % 参数预处理 if( ~exist('imA') ) imA = loadimg(); end if isempty(imA); return; end; if( ~exist('imB') ) imB = loadimg(); end if isempty(imB); return; end; % 格式转换 imA = double(imA); imB = double(imB); % MaxGray一般应为max(max(imA),max(imB)) if( ~exist('iMax') ) iMax = max(max(imA(:)),max(imB(:))); % iMax = 255; end % 判断两个图像是否匹配 if (size(imA) ~= size(imB)) error('Images must be the same size.'); return; end % 判断两个图像是否完全一样 if imA == imB error('Images are identical: PSNR has infinite value.'); return; end [iH iW iL] = size(imA); % iH=Height,iW=Width % 如果是彩色则取三个通道的均值 dMSE = sum(abs((imA(:) - imB(:))).^2)/iL + eps; dPSNR = 10*log10((iH*iW*(iMax^2))/dMSE); disp(['PSNR = ',num2str(dPSNR,'%5.2f dB')]); %% -------------------------------------------------------------------- %%