文章目录

  • 前言
  • 一、为什么要进行批处理
  • 二、具体步骤
  • 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');

三、实验演示

运行程序

图像特征提取opencv 图像特征提取matlab代码_图像处理

选择输入图像所在文件夹

图像特征提取opencv 图像特征提取matlab代码_批处理_02

选择输出图像保存文件

图像特征提取opencv 图像特征提取matlab代码_算法_03

输入文件夹

图像特征提取opencv 图像特征提取matlab代码_图像处理_04

输出文件夹

图像特征提取opencv 图像特征提取matlab代码_算法_05


总结

以上就是本篇文章要讲的内容,简单介绍了如何实现图像的批处理,并且以边缘特征提取为例,也许有不正确的地方,欢迎批评指正,谢谢。

参考博客

【MATLAB】图像批处理:批量读取图像—>批量处理—>批量写入文件夹 边缘检测(Sobel与Prewitt)Matlab实现