文章目录
- 前言
- 一、为什么要进行批处理
- 二、具体步骤
- 1.选择输入图像所在路径
- 2.选择输出图像保存路径
- 3.批量读取图像、处理,输出(以提取边缘特征为例)
- 4.完整代码
- 三、实验演示
- 总结
- 参考博客
前言
最近在复现论文,其中有一个环节是对图像进行特征提取,因为图像太多所以需要进行批处理。
一、为什么要进行批处理
在大部分图像处理任务中,第一步是对所需算法进行研究,在这一过程往往只针对一张或者少量图像进行处理,研究算法是否可行。完成算法的编写后,需要研究算法的普适性,这就要对大量的图像进行实验,在这一过程的往往需要对上百张、上千张图片分别进行处理,如果一张一张地修改路径,那么会耗费很多时间,耗时耗力。因此为了提高图像处理的效率就需要编写批处理代码。
二、具体步骤
1.选择输入图像所在路径
代码如下:
%选择输入的图像路径
selpath = uigetdir(path);
if ~isequal(selpath,0)
pathname_old=selpath;
%app.foldnameEditField.Value=selpath;
else
warndlg('selpath fail','warning');
return
end
2.选择输出图像保存路径
代码如下:
%选择输出的图像路径
selpath = uigetdir(path);
if ~isequal(selpath,0)
pathname_new=selpath;
%app.foldnameEditField.Value=selpath;
else
warndlg('selpath fail','Warning');
return
end
3.批量读取图像、处理,输出(以提取边缘特征为例)
代码如下
%批量读取、处理,并输出
fileList=dir(fullfile(pathname_old,'*.bmp'));%以bmp图像为例
nn=length(fileList);
gx=[-1,0,1;-1,0,1;-1,0,1]; %具体算子
gy=[1,1,1;0,0,0;-1,-1,-1];
for num=1:nn
filename_old=fileList(num).name;
filename_new=strcat(filename_old(1:end-4),"_processed",".bmp");
A=imread(fullfile(pathname_old,filename_old));
f=double(rgb2gray(A)); %转为灰度图像
[row,col]=size(f);
f1=zeros(row,col); %新建画布
for i=2:row-1
for j=2:col-1
fx=[f(i-1,j-1),f(i-1,j),f(i-1,j+1);f(i,j-1),f(i,j),f(i,j+1);f(i+1,j-1),f(i+1,j),f(i+1,j+1)];
fy=[f(i-1,j-1),f(i-1,j),f(i-1,j+1);f(i,j-1),f(i,j),f(i,j+1);f(i+1,j-1),f(i+1,j),f(i+1,j+1)];
fz=[f(i-1,j-1),f(i-1,j),f(i-1,j+1);f(i,j-1),f(i,j),f(i,j+1);f(i+1,j-1),f(i+1,j),f(i+1,j+1)];
Gx=gx.*fx;
Gy=gy.*fy;
%xy融合
%A=abs(abs(sum(Gx(:)))+abs(sum(Gy(:))));
%x方向
%A=abs(abs(sum(Gx(:))));
%y方向
A=abs(abs(sum(Gy(:))));
if A>=100
f1(i,j)=255;
end
end
end
pathfilename_new=fullfile(pathname_new,filename_new);
imwrite(uint8(f1),pathfilename_new);
end
disp("finish");
4.完整代码
clc
%选择输入的图像路径
selpath = uigetdir(path);
if ~isequal(selpath,0)
pathname_old=selpath;
%app.foldnameEditField.Value=selpath;
else
warndlg('selpath fail','warning');
return
end
%选择输出的图像路径
selpath = uigetdir(path);
if ~isequal(selpath,0)
pathname_new=selpath;
%app.foldnameEditField.Value=selpath;
else
warndlg('selpath fail','Warning');
return
end
%批量读取、处理,并输出
fileList=dir(fullfile(pathname_old,'*.bmp'));%以bmp图像为例
nn=length(fileList);
gx=[-1,0,1;-1,0,1;-1,0,1];
gy=[1,1,1;0,0,0;-1,-1,-1];
for num=1:nn
filename_old=fileList(num).name;
filename_new=strcat(filename_old(1:end-4),'_processed','.bmp');
A=imread(fullfile(pathname_old,filename_old));
f = double(rgb2gray(A));
[row,col]=size(f);
f1=zeros(row,col);
for i=2:row-1
for j=2:col-1
fx=[f(i-1,j-1),f(i-1,j),f(i-1,j+1);f(i,j-1),f(i,j),f(i,j+1);f(i+1,j-1),f(i+1,j),f(i+1,j+1)];
fy=[f(i-1,j-1),f(i-1,j),f(i-1,j+1);f(i,j-1),f(i,j),f(i,j+1);f(i+1,j-1),f(i+1,j),f(i+1,j+1)];
Gx=gx.*fx;
Gy=gy.*fy;
A=abs(abs(sum(Gx(:)))+abs(sum(Gy(:))));
if A>=110
f1(i,j)=255;
end
end
end
pathfilename_new=fullfile(pathname_new,filename_new);
imwrite(uint8(f1),pathfilename_new);
end
disp('finish');
三、实验演示
运行程序
选择输入图像所在文件夹
选择输出图像保存文件
输入文件夹
输出文件夹
总结
以上就是本篇文章要讲的内容,简单介绍了如何实现图像的批处理,并且以边缘特征提取为例,也许有不正确的地方,欢迎批评指正,谢谢。
参考博客
【MATLAB】图像批处理:批量读取图像—>批量处理—>批量写入文件夹 边缘检测(Sobel与Prewitt)Matlab实现