2

I have an original image and a distorted image of the original one. I want to calculate the PSNR of the distorted image, so that I can measure the distortion in dB. Image type is colored jpeg.

Ömer Faruk Gül
  • 965
  • 1
  • 10
  • 22

2 Answers2

5

I dont know what you have used before but you can use the following code to calculate the PSNR of changed image:

I = imread('original.jpg');
Ihat = imread('changed.jpg');

% Read the dimensions of the image.
[rows columns ~] = size(I);

% Calculate mean square error of R, G, B.   
mseRImage = (double(I(:,:,1)) - double(Ihat(:,:,1))) .^ 2;
mseGImage = (double(I(:,:,2)) - double(Ihat(:,:,2))) .^ 2;
mseBImage = (double(I(:,:,3)) - double(Ihat(:,:,3))) .^ 2;

mseR = sum(sum(mseRImage)) / (rows * columns);
mseG = sum(sum(mseGImage)) / (rows * columns);
mseB = sum(sum(mseBImage)) / (rows * columns);

% Average mean square error of R, G, B.
mse = (mseR + mseG + mseB)/3;

% Calculate PSNR (Peak Signal to noise ratio).
PSNR_Value = 10 * log10( 255^2 / mse);
sersem1
  • 466
  • 1
  • 4
  • 10
4

Here is a vectorized implementation:

mse = mean(mean((im2double(I) - im2double(K)).^2, 1), 2);
psnr = 10 * log10(1 ./ mean(mse,3));

It should work for integer and floating-point images, both grayscale and color images.

I am using the following PSNR definition:

mse

psnr

Amro
  • 123,847
  • 25
  • 243
  • 454