matlab代码之图像批量读取、处理、保存

it2024-08-04  36

做图像处理实验,一般要对多张数据集进行读取、处理、以及数据和图像的保存。 本文列出具体代码的功能如下:

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矩阵处理优势,加快速度。等有时间我再出一个代码,大家可以自己尝试一下) 如果对大家有帮助,点个赞留个来过的痕迹^ _ ^

最新回复(0)