方法实现 | MATLAB | 如何对图像进行批处理(以提取边缘特征为例)


前言

最近在复现论文,其中有一个环节是对图像进行特征提取,因为图像太多所以需要进行批处理。


一、为什么要进行批处理

在大部分图像处理任务中,第一步是对所需算法进行研究,在这一过程往往只针对一张或者少量图像进行处理,研究算法是否可行。完成算法的编写后,需要研究算法的普适性,这就要对大量的图像进行实验,在这一过程的往往需要对上百张、上千张图片分别进行处理,如果一张一张地修改路径,那么会耗费很多时间,耗时耗力。因此为了提高图像处理的效率就需要编写批处理代码。

二、具体步骤

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实现

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值