做图像处理实验,一般要对多张数据集进行读取、处理、以及数据和图像的保存。 本文列出具体代码的功能如下:
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矩阵处理优势,加快速度。等有时间我再出一个代码,大家可以自己尝试一下)
如果对大家有帮助,点个赞留个来过的痕迹^ _ ^