matlab中两幅不同大小图像的峰值信噪比

matlab中两幅不同大小图像的峰值信噪比,matlab,image-processing,matrix,interpolation,Matlab,Image Processing,Matrix,Interpolation,我在256*256图像(img)上执行了双三次插值 我得到了一张511*511的图像,我想计算一张512*512的图像(原始)和“dest”图像的峰值信噪比,如下所示 original = double(original); dest = double(dest); [M N] = size(original); error = original - dest; MSE = sum(sum(error .* error)) / (M * N); if(MSE > 0) PSNR = 10

我在256*256图像(img)上执行了双三次插值

我得到了一张511*511的图像,我想计算一张512*512的图像(原始)和“dest”图像的峰值信噪比,如下所示

original = double(original);
dest = double(dest);
[M N] = size(original);
error = original - dest;
MSE = sum(sum(error .* error)) / (M * N);

if(MSE > 0)
PSNR = 10*log(255*255/MSE) / log(10);
disp(['PSNR = ', num2str(PSNR)])
else
PSNR = 99;
disp(['PSNR = ', num2str(PSNR)])
end 

但是由于矩阵维数不匹配,我得到了一个错误。如何避免这个错误。可以计算不同大小图像的峰值信噪比吗?请帮助

我相信你要做的是将图像的大小减小2倍,然后插值回去,这样你就可以恢复原始图像的大小。您希望通过计算重建之间的峰值信噪比来检查重建的质量

但是,我强烈建议不要使用
interp2
调整图像大小<代码>interp2适用于一般2D信号。如果要调整图像大小,请改用。它是专门为调整图像大小而设计的,可以处理一些情况,例如尝试插值超出边界的像素以及在
interp2
中使用时会很头疼的其他边缘情况

使用
imresize
,您可以精确指定所需的尺寸。在这种情况下,您可以将大小增加2倍,也可以直接指定512 x 512。这样,您就不会得到511 x 511不一致的图像大小错误,并且能够正常计算PSNR,因为两个图像的大小相同

假设
dest
是256 x 256的缩小图像,则应执行以下操作:

%// Cast for precision
original = double(original);
dest = double(dest);

%// Increase size of image
dest_resized = imresize(dest, [512 512], 'bicubic');

%// Compute your stuff
[M N] = size(original);
err = original - dest_resized;
MSE = sum(sum(err .* err)) / (M * N);
PSNR = 10*log(255*255/MSE) / log(10);
小调:您的PSNR不太正确。这里不需要
日志(10)
分区。有关更多详细信息,请参阅PSNR定义:


但是,如果您死心塌地地想使用
interp2
,如果您想恢复原始大小,则需要根据
interp2
的原始图像大小定义一个坐标网格,该网格的步长为0.5。这样,您将得到一个512 x 512的图像。但是,在某些情况下,您可能会尝试插值网格中未定义的值。因此,您需要用插补值替换任何无效的值。。。说
0

因此,您需要执行以下操作:

[X,Y] = meshgrid(1:size(dest,2), 1:size(dest,1));
[X2,Y2] = meshgrid(0.5:0.5:size(dest,2), 0.5:0.5:size(dest,1));
dest = double(dest);
dest_resized = interp2(X, Y, dest, X2, Y2, 'bicubic');
dest_resized(isnan(dest_resized)) = 0;

你确定你必须插值然后计算PSNR吗?也许你们可以给图像添加一个噪声,然后计算PSNR。根据,PSNR是为有噪和无噪图像计算的,而不是插值图像。@Kamtal-收缩图像然后调整其大小可以视为有噪信号。增加图像大小时会出现插值伪影。在比较不同的图像插值算法时,这实际上是一件常见的事情,在这些算法中,您有意缩小和调整图像大小,并查看重建与原始图像的接近程度。有些算法的重建质量很差,而有些则更好。
[X,Y] = meshgrid(1:size(dest,2), 1:size(dest,1));
[X2,Y2] = meshgrid(0.5:0.5:size(dest,2), 0.5:0.5:size(dest,1));
dest = double(dest);
dest_resized = interp2(X, Y, dest, X2, Y2, 'bicubic');
dest_resized(isnan(dest_resized)) = 0;