查看: 138|回复: 6|关注: 0

[已解决] MATLAB PNSR函数如何计算不同分辨率遥感图像的峰值信噪比

[复制链接]

新手

9 麦片

财富积分


050


2

主题

10

帖子

0

最佳答案
在尺度上推的过程中,需要对图像进行评价,我选用了峰值信噪比作为评价方法,尺度上推前是10m分辨率的图像,栅格大小为600*600,尺度上推后是100m分辨率的图像,栅格大小为60*60,我在网上查阅了部分资料,但是都说pnsr这个函数只能计算格式相同的图像,有没有大神能指导一下我如何才能让60*60的图像与600*600的图像进行计算?

MATLAB 基础讨论
版块优秀回答者

入门

274 麦片

财富积分


50500


20

主题

501

帖子

40

最佳答案
  • 关注者: 2
发表于 6 天前 | 显示全部楼层
psnr(X, Y) 你可把省略Y得到X的,分别计算2副图的的
% 计算峰值信噪比PSNR、均方根误差MSE
% 如果输入Y为空,则视为X与其本身来计算PSNR、MSE

新手

9 麦片

财富积分


050


2

主题

10

帖子

0

最佳答案
 楼主| 发表于 6 天前 | 显示全部楼层
onlye_caisA 发表于 2020-3-26 18:06
psnr(X, Y) 你可把省略Y得到X的,分别计算2副图的的
% 计算峰值信噪比PSNR、均方根误差MSE
% 如果输入Y为空 ...

对不起,我没太明白您说的那个省略y得到X的做法,如果我把10m分辨率的内容省略了,应该会对结果有影响的吧?

MATLAB 基础讨论
版块优秀回答者

入门

274 麦片

财富积分


50500


20

主题

501

帖子

40

最佳答案
  • 关注者: 2
发表于 6 天前 | 显示全部楼层
Richardyang1 发表于 2020-3-26 18:11
对不起,我没太明白您说的那个省略y得到X的做法,如果我把10m分辨率的内容省略了,应该会对结果有影响的 ...

你不是要比较峰值信噪比吗?而且两副图像大小不一样,你可分别求出每副图像的信噪比,再比较呀。

新手

9 麦片

财富积分


050


2

主题

10

帖子

0

最佳答案
 楼主| 发表于 6 天前 | 显示全部楼层
onlye_caisA 发表于 2020-3-26 18:13
你不是要比较峰值信噪比吗?而且两副图像大小不一样,你可分别求出每副图像的信噪比,再比较呀。 ...

麻烦您看一下我这个计算pnsr的代码,我是想要100m分辨率的图像和10m的图像进行对比计算,分别求他们的信噪比我不太明白这个如何操作
  1. function [peaksnr, snr] = psnr(A, ref, peakval)
  2. %PSNR Peak Signal-To-Noise Ratio.
  3. %   PEAKSNR = PSNR(A, REF) calculates the peak signal-to-noise ratio for
  4. %   the image in array A, with the image in array REF as the reference. A
  5. %   and REF can be N-D arrays, and must be of the same size and class.
  6. %
  7. %   PEAKSNR = PSNR(A, REF, PEAKVAL) uses PEAKVAL as the peak signal value
  8. %   for calculating the peak signal-to-noise ratio.
  9. %
  10. %   [PEAKSNR, SNR] = PSNR(A, REF, __) also returns the simple
  11. %   signal-to-noise in SNR, in addition to the peak signal-to-noise ratio.
  12. %
  13. %   Example
  14. %   ---------
  15. %   This example shows how to compute PSNR for noisy image given the
  16. %   original reference image.
  17. %
  18. %   ref = imread('pout.tif');
  19. %   A = imnoise(ref,'salt & pepper', 0.02);
  20. %
  21. %   [peaksnr, snr] = psnr(A, ref);
  22. %
  23. %   fprintf('\n The Peak-SNR value is %0.4f', peaksnr);
  24. %   fprintf('\n The SNR value is %0.4f \n', snr);
  25. %
  26. %   Class Support
  27. %   -------------
  28. %   Input arrays A and REF must be one of the following classes: uint8,
  29. %   int16, uint16, single, or double. Both A and REF must be of the same
  30. %   class. They must be nonsparse. PEAKVAL is a scalar of any numeric
  31. %   class. PEAKSNR and SNR are scalars of class double, unless A and REF
  32. %   are of class single in which case PEAKSNR and SNR are scalars of class
  33. %   single.
  34. %
  35. %   See also IMMSE, MEAN, MEDIAN, SSIM, SUM, VAR.

  36. %   Copyright 2013-2015 The MathWorks, Inc.
  37. checkImages(A,ref);

  38. if nargin < 3
  39.     peakval = diff(getrangefromclass(A));
  40. else
  41.     checkPeakval(peakval, A);
  42.     peakval = double(peakval);
  43. end

  44. if isempty(A) % If A is empty, ref must also be empty
  45.     peaksnr = zeros(0, 'like', A);
  46.     snr     = zeros(0, 'like', A);
  47.     return;
  48. end

  49. err = immse(A,ref);

  50. peaksnr = 10*log10(peakval.^2/err);

  51. if nargout > 1
  52.     if isinteger(ref)  
  53.         ref = double(ref);
  54.     end                     
  55.     snr = 10*log10(mean(ref(:).^2)/err);
  56. end

  57. end

  58. function checkImages(A, ref)
  59. validImageTypes = {'uint8','uint16','int16','single','double'};
  60. validateattributes(A,validImageTypes,{'nonsparse'},mfilename,'A',1);
  61. validateattributes(ref,validImageTypes,{'nonsparse'},mfilename,'REF',2);

  62. if ~isa(A,class(ref))
  63.     error(message('images:validate:differentClassMatrices','A','REF'));
  64. end   
  65. if ~isequal(size(A),size(ref))
  66.     error(message('images:validate:unequalSizeMatrices','A','REF'));
  67. end

  68. end

  69. function checkPeakval(peakval, A)

  70. validateattributes(peakval,{'numeric'},{'nonnan', 'real', ...
  71.     'nonnegative','nonsparse','nonempty','scalar'}, mfilename, ...
  72.     'PEAKVAL',3);
  73. if isinteger(A) && (peakval > diff(getrangefromclass(A)))
  74.     warning(message('images:psnr:peakvalTooLarge', 'A', 'REF'));
  75. end

  76. end
复制代码

MATLAB 基础讨论
版块优秀回答者

入门

274 麦片

财富积分


50500


20

主题

501

帖子

40

最佳答案
  • 关注者: 2
发表于 6 天前 | 显示全部楼层 |此回复为最佳答案
Richardyang1 发表于 2020-3-26 18:27
麻烦您看一下我这个计算pnsr的代码,我是想要100m分辨率的图像和10m的图像进行对比计算,分别求他们的信 ...

你用这个
function [PSNR, MSE] = psnr(X, Y)
% 计算峰值信噪比PSNR、均方根误差MSE
% 如果输入Y为空,则视为X与其本身来计算PSNR、MSE

if nargin<2
    D = X;
else
    if any(size(X)~=size(Y))
        error('The input size is not equal to each other!');
    end
    D = X-Y;
end
MSE = sum(D(:).*D(:))/prod(size(X));
PSNR = 10*log10(255^2/MSE);
display(MSE);
display(PSNR);

新手

9 麦片

财富积分


050


2

主题

10

帖子

0

最佳答案
 楼主| 发表于 6 天前 | 显示全部楼层
onlye_caisA 发表于 2020-3-26 18:42
你用这个
function  = psnr(X, Y)
% 计算峰值信噪比PSNR、均方根误差MSE

谢谢您的耐心解答!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表