给定10幅带有噪声的图像,它们的变量名分别是im1
、im2
、……、im10
。要求编写一个程序,通过平均法进行图像降噪,并输出一幅降噪后的图像。
% read image
im=imread('cameraman.tif');
figure(1),imshow(im); title('Original image');% generate noisy images
im = double(im);
n = 10;
for i = 1:n;istr = ['im' num2str(i) ' = im + randn(size(im)) * 20;'];eval(str);figure(2);str1 = ['imshow(im' num2str(i) ',[]);'];eval(str1);title('Noisy image');
end
思路
首先,定义一个变量im_sum
为第一幅噪声图像im1
。然后,通过一个循环,将剩余的噪声图像依次加到im_sum
上。在循环内部,使用了eval
函数来动态地构造和执行代码字符串,这个字符串实现了将当前噪声图像加到im_sum
上的操作。在每次循环结束后,都会显示当前的im_sum
图像。
循环结束后,将im_sum
除以图像的数量n
,得到平均图像im_avg
,这就是去噪后的图像。然后,显示这个去噪后的图像,并将其标题设置为’Denoised image’。
最后,将去噪后的图像im_avg
的值范围缩放到0到1之间,然后将其写入到’cameraman.jpg’这个文件中。
代码
% read image
im=imread('cameraman.tif');
figure(1),imshow(im); title('Original image');% generate noisy images
im = double(im);
n = 10;
for i = 1:n;istr = ['im' num2str(i) ' = im + randn(size(im)) * 20;'];eval(str);figure(2);str1 = ['imshow(im' num2str(i) ',[]);'];eval(str1);title('Noisy image');
end% average noisy images
im_sum = im1;
n = 10;
for i = 2:n;istr = ['im_sum = im_sum + im' num2str(i) ';']eval(str);figure(3);imshow(im_sum, []);title('Average noisy images');
endim_avg = im_sum / n;
figure(4);
imshow(im_avg, []);
title('Denoised image');im_avg = rescale(im_avg, 0, 1);
imwrite(im_avg, 'cameraman.jpg');