计算滤波后图像与原图的差异(如PSNR、MSE等),matlab实现
时间: 2024-10-27 14:05:50 浏览: 14
在MATLAB中,计算图像处理后的滤波效果与原始图像之间的差异通常会涉及到一些常用的评价指标,例如 Peak Signal-to-Noise Ratio (PSNR) 和 Mean Squared Error (MSE)。以下是简要的步骤:
**1. PSNR (Peak Signal-to-Noise Ratio)**:
- 首先,对原始图像(`img_original`)和滤波后图像(`filtered_img`)做归一化处理,将像素值范围限制在0到1之间。
- 然后,计算两者之间的均方误差(MSE)。
- 最后,使用公式计算PSNR,公式为:`10 * log10((MAX^2) / MSE)`,其中`MAX`通常是图像的灰度范围上限,例如对于8位灰度图像为255。
```matlab
MAX = 255;
mse = mean((img_original - filtered_img).^2);
psnr = 10 * log10(MAX^2 / mse);
```
**2. MSE (Mean Squared Error)**:
- 直接计算两幅图像像素差的平方和除以像素总数。
```matlab
mse = mean((img_original - filtered_img).^2);
```
**相关问题--:**
1. 如何在MATLAB中生成一幅测试图像并对其进行滤波操作?
2. 对于彩色图像,PSNR和MSE应该如何计算?
3. 使用哪些MATLAB函数可以直接计算PSNR和MSE?
相关问题
分别利用逆滤波和一种改进的逆滤波对大气湍流退化图像进行恢复处理,同屏显示退 化图像和恢复图像,计算恢复图像的峰值信噪比 PSNR。matlab实现
好的,根据您的要求,我将为您回答问题并给出MATLAB代码。
首先,我们需要读入已经退化的图像。在MATLAB中,我们可以使用以下代码读取图像:
```matlab
img_degraded = imread('your_degraded_image.jpg');
```
接下来,我们将使用逆滤波和改进的逆滤波对图像进行恢复。逆滤波是一种基本的恢复方法,但它对噪声非常敏感,往往会产生较差的恢复效果。因此,我们将使用一种改进的逆滤波方法,即维纳滤波,来提高恢复效果。
在MATLAB中,我们可以使用以下代码实现逆滤波和维纳滤波:
```matlab
% 定义大气湍流退化函数
function h = atm_turb_degrad(n, r)
[x, y] = meshgrid(1:n);
center = ceil(n/2);
distance = sqrt((x - center).^2 + (y - center).^2);
h = (1/(pi*r^2)) * (sin(pi*r*distance)./(pi*r*distance));
h(center, center) = 1;
end
% 逆滤波
n = size(img_degraded, 1);
r = 10; % 退化函数半径
h = atm_turb_degrad(n, r);
img_restored_inv = real(ifft2(fft2(img_degraded)./fft2(h)));
% 维纳滤波
snr = 0.01; % 信噪比
h_power_spectrum = abs(fft2(h)).^2;
k = snr / mean(h_power_spectrum(:));
img_restored_wiener = real(ifft2(fft2(img_degraded).*conj(fft2(h))./(abs(fft2(h)).^2 + k)));
% 计算恢复图像的峰值信噪比(PSNR)
mse_inv = mean(mean((img_restored_inv - img_degraded).^2));
psnr_inv = 10*log10(255^2/mse_inv);
mse_wiener = mean(mean((img_restored_wiener - img_degraded).^2));
psnr_wiener = 10*log10(255^2/mse_wiener);
```
最后,我们可以使用以下代码将退化图像和恢复图像显示在同一屏幕上,并显示它们的PSNR:
```matlab
% 显示退化图像和恢复图像
figure;
subplot(1, 3, 1);
imshow(img_degraded);
title('Degraded Image');
subplot(1, 3, 2);
imshow(uint8(img_restored_inv));
title(['Inverse Filter, PSNR = ', num2str(psnr_inv)]);
subplot(1, 3, 3);
imshow(uint8(img_restored_wiener));
title(['Wiener Filter, PSNR = ', num2str(psnr_wiener)]);
```
完整的MATLAB代码如下:
```matlab
% 读取退化图像
img_degraded = imread('your_degraded_image.jpg');
% 定义大气湍流退化函数
function h = atm_turb_degrad(n, r)
[x, y] = meshgrid(1:n);
center = ceil(n/2);
distance = sqrt((x - center).^2 + (y - center).^2);
h = (1/(pi*r^2)) * (sin(pi*r*distance)./(pi*r*distance));
h(center, center) = 1;
end
% 逆滤波和维纳滤波
n = size(img_degraded, 1);
r = 10; % 退化函数半径
h = atm_turb_degrad(n, r);
img_restored_inv = real(ifft2(fft2(img_degraded)./fft2(h)));
snr = 0.01; % 信噪比
h_power_spectrum = abs(fft2(h)).^2;
k = snr / mean(h_power_spectrum(:));
img_restored_wiener = real(ifft2(fft2(img_degraded).*conj(fft2(h))./(abs(fft2(h)).^2 + k)));
% 计算恢复图像的峰值信噪比(PSNR)
mse_inv = mean(mean((img_restored_inv - img_degraded).^2));
psnr_inv = 10*log10(255^2/mse_inv);
mse_wiener = mean(mean((img_restored_wiener - img_degraded).^2));
psnr_wiener = 10*log10(255^2/mse_wiener);
% 显示退化图像和恢复图像
figure;
subplot(1, 3, 1);
imshow(img_degraded);
title('Degraded Image');
subplot(1, 3, 2);
imshow(uint8(img_restored_inv));
title(['Inverse Filter, PSNR = ', num2str(psnr_inv)]);
subplot(1, 3, 3);
imshow(uint8(img_restored_wiener));
title(['Wiener Filter, PSNR = ', num2str(psnr_wiener)]);
```
希望这个回答能够帮助你解决问题!
阅读全文