做图像处理实验,一般要对多张数据集进行读取、处理、以及数据和图像的保存。 本文列出具体代码的功能如下:
1、从文件夹中读取图像数据(图像统一按顺序命名I1.bmp)2、对图像添加不同方差的高斯噪声噪声,对噪声图像进行保存3、对噪声图像进行非局部均值滤波,用psnr衡量去噪效果,保存数据到I1_psnr.mat文件4、画出不同图像不同噪声下去噪效果的psnr、ssim对比图5、保存figure图像的几种方法6、完整代码
1、从文件夹中读取图像数据(图像统一按顺序命名I1.bmp)
读取两种路径下的文件
%(
1)读取本路径下指定图像
ima
=double(imread(strcat('I1.bmp')));
%ima
=double(imread(strcat(imgName
,'.bmp')));
%(
2)读取子路径
TID文件夹里的图像
%ima
=double(imread(strcat('./TIDGray/',imgName
,'.bmp')));
%imgName应该为字符串类型
2、对图像添加不同方差的高斯噪声噪声,对噪声图像进行保存
添加高斯噪声时要注意图像的范围。 图像读取可以double一下,范围[0-255]; 或者im2double一下,范围[0-1]; 添加高斯噪声的两种方法:
ima
=double(imread(strcat('I1.bmp')));
%mean
=0;sigma
=10;
%方法
1:最后一个参数是方差
%rima
=imnoise(ima
,'gaussian',mean
,sigma
^2);
%方法
2
rima
=ima
+sigma
*randn(size(ima
));
3、对噪声图像进行非局部均值滤波,用psnr衡量去噪效果,保存数据到I1_psnr.mat文件
注意:matlab自带的psnr函数需要输入的两张图像归一化或者转化为uint8类型,将数据保存在该目录下或子文件夹PSNR里
imgDenoise
=imnlmfilt(rima
);
PSNR=psnr(ima
/255,imgDenoise
/255);
save(strcat('I1_psnr.mat'),'PSNR');
save(strcat('TIDNLMresult/result/I1_psnr.mat'),'PSNR');
4、画出不同图像不同噪声下去噪效果的psnr、ssim对比图
matlab有自带的psnr,ssim函数,但是要求数据归一化或者将[0,255]的double类型转为uint8类型 结果图: 如果想得到第二种类型图可以参考这篇文章第四点:matlab代码之plot函数图及灰度图像保存的几种方法
5、保存figure图像的几种方法
plot()函数的figure图像的保存用saveas()、print(); 图像处理后的图像保存用imwrite(); 具体参考:matlab代码之plot函数图及灰度图像保存的几种方法
6、完整代码
clear
;close all
;clc
;
addpath(genpath('TIDGray'))
mkdir('TIDNLMresult')
addpath(genpath('TIDNLMresult'))
for imgID
=1:1:2
%for imgID
=2 % only one image
imgName
=strcat('I',num2str(imgID
));
ima
=im2double(imread(strcat('TIDGray/',imgName
,'.bmp')));
for sigma
=10:5:20
%for sigma
=25
rima
=ima
+sigma
/255*randn(size(ima
)); % 添加噪声
%mean
=0;
%rima
=imnoise(ima
,'gaussian',mean
,(sigma
/255)^2);%注意最后一项是方差
imwrite(uint8(rima
),strcat('TIDNLMresult/NoiseImg/',imgName
,'_',num2str(sigma
),'_noisy.bmp'));
imgDenoise
= imnlmfilt(rima
);
PSNR(sigma
/5-1)=psnr(ima
,imgDenoise
);
SSIM(sigma
/5-1)=ssim(ima
,imgDenoise
);
end
result(1,:)=PSNR; result(2,:)=SSIM;
%保存数据到
.mat文件
save(strcat('TIDNLMresult/result/',imgName
,'result.mat'),'result');
sigma
=10:5:20;
figure
;plot(sigma
,PSNR,'-*');xlabel('sigma');
str1
=num2str(PSNR'
);text(sigma
,PSNR,cellstr(str1
)) ;
hold on
;plot(sigma
,SSIM,'-o');
str2
=num2str(SSIM'
);text(sigma
,SSIM,cellstr(str2
)) ;
title(['image:I',num2str(imgID
)]);
%title(['image:',imgName
]);
legend('PSNR','SSIM');
%保存第i个plot画出来的图
print(imgID
,'-dpng',['TIDNLMresult/result/I',num2str(imgID
),'.png']);
end
文件夹前后对比图:
大家可以根据需要进行添加删减,如果需要调参数可再加循环处理。 (ps:批出处理用for循环会限制速度,目前有个想法,把不同参数放到矩阵里,充分利用matlab矩阵处理优势,加快速度。等有时间我再出一个代码,大家可以自己尝试一下) 如果对大家有帮助,点个赞留个来过的痕迹^ _ ^