写一个基于Matlab的函数来测量两个灰度之间的峰值信噪比(PSNR) 图像在dB。对于峰值,使用255。
时间: 2024-10-15 20:16:55 浏览: 31
psnr.rar_PSNR_psnr matlab_信噪比psnr_图像信噪比_峰值信噪比
当你需要在Matlab中编写一个函数来计算两个灰度图像的峰值信噪比(Peak Signal-to-Noise Ratio,简称PSNR),你可以参考以下步骤和代码实现:
```matlab
function psnr = compute_psnr(img1, img2)
% 首先,确保输入的是双精度灰度图像
if ~isnumeric(img1) || ~isnumeric(img2) || ~isequal(size(img1), size(img2))
error('Both inputs must be numeric grayscale images of the same size.');
end
% 将像素值范围从0-255映射到0-1范围内
img1_normalized = im2double(img1);
img2_normalized = im2double(img2);
% 计算均值和方差
mu1 = mean(img1_normalized(:));
sigma1 = std(img1_normalized(:));
mu2 = mean(img2_normalized(:));
sigma2 = std(img2_normalized(:));
% 如果标准差接近于0,PSNR将发散,这里设置一个小阈值防止除以0
if sigma1 < eps && sigma2 < eps
sigma1 = eps;
sigma2 = eps;
end
% 计算PSNR(dB)
psnr = 10 * log10(255^2 / (sigma1^2 + eps)); % Peak value is assumed to be 255
psnr = psnr - 10 * log10(255^2 / (sigma2^2 + eps)); % Subtract noise from target image
% 返回PSNR结果
psnr = max(psnr, 0); % Ensure PSNR is non-negative
end
```
在这个函数中,我们首先检查输入是否为灰度图像,并调整其范围。然后,计算每个图像的均值和方差,最后使用公式PSNR(dB) = 10 * log10(peak^2 / (noise^2)) 计算PSNR。注意,为了处理零噪声情况下的分母为零问题,我们在计算中加入了一个很小的正数`eps`。
阅读全文