Power Signal Noise Ratio (PSNR) of colored jpeg im

2020-02-11 08:46发布

问题:

It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center.
Closed 6 years ago.

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.

回答1:

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);


回答2:

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: