给定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');
运行效果




