批量处理文件夹图像并提取纹理特征

对图像特征提取之前,需要整理图像,同时,如果处理图像较多,该怎样批量处理呢?

1 . u i g e t d i r ( ) 函数

用以打开文件夹选择对话框, s e l p a t h = u i g e t d i r 打开一个模态对话框,显示当前工作目录中的文件夹并返回用户从对话框中选择的路径。 s e l p a t h = u i g e t d i r ( p a t h ) 指定对话框打开时定位到的初始路径。如果 p a t h 为空或不是有效路径,对话框将在当前工作目录中打开。 s e l p a t h = u i g e t d i r ( p a t h , t i t l e ) 指定对话框的标题。

2 . c d ( ) 命令

c d 命令,最初接触到 c d 在 c m d 窗口,使用 c d 进入退出文件夹。 c d ( n e w F o l d e r ) ,进入文件夹当中。

3 . d i r ( ) 命令

d i r n a m e 列出与 n a m e 匹配的文件和文件夹。如果 n a m e 为文件夹, d i r 列出该文件夹的内容。使用绝对或相对路径名称指定 n a m e 。 n a m e 参数的文件名可以包含 * 通配符,路径名称可以包含 * 和 * * 通配符。与 * * 通配符相邻的字符必须为文件分隔符。

1
2
3
4
5
6
7
8
9
10
示例一:
mkdir myfolder %新建文件夹
movefile myfile1.m myfolder %在新建文件夹中创建m文件
movefile myfile2.m myfolder
movefile myfile3.m myfolder
dir myfolder %列出 myfolder 中的文件。
cd myfolder
dir *my*.m %列出myfolder中符合条件的文件
MyFolderInfo = dir('myfolder') %获取 myfolder 中文件的列表。MATLAB 以结构体数组形式返回
MyFolderInfo(3).name %创建结构体索引以访问特定项目
1
2
3
4
5
6
7
8
9
示例二:
mkdir myfolder1 %新建文件夹
mkdir myfolder1/myfolder2
mkdir myfolder1/myfolder2/myfolder3
movefile myfile1.m myfolder1
movefile myfile2.m myfolder1/myfolder2
movefile myfile3.m myfolder1/myfolder2/myfolder3
cd myfolder1
dir **/*.m %列出 myfolder1 中和 myfolder1 的子文件夹中扩展名为 .m 的所有文件。

4 . s t r u c t 2 c e l l ( ) 函数

s t r u c t 2 c e l l && c e l l 2 s t r u c t 是 M A T L A B 的两个内建函数:把结构体数组转换成元胞数 组 的 s t r u c t 2 c e l l 把 元 胞 数 组 转 换 为 结 构 体 数 组 ( 或 者 叫 结 构 体 向 量 ) 的c e l l 2 s t r u c t 。

1
2
3
4
5
6
7
8
Ac1={'first';1:3};Ac2={'Second';[1,2;3,4]};
>> Ac=[Ac1,Ac2]
Ac =
'first' 'Second'
[1x3 double] [2x2 double]
>> size(Ac)
ans =
2 2

由下述代码可以看出, A c( 2 , 1) 意思是取第二行第一列的元素, A c { 2 , 1 } 意思是取值:

1
2
3
4
5
6
7
8
9
10
11
12
13
>>Ac(2,1)
ans =
[1x3 double]
>> Ac{2,1}
ans =
1 2 3
>> As1.f1='first' %给类似于C、java里的属性赋值,对象任意
As1 =
f1: 'first'
>> As1.f2=1:3
As1 =
f1: 'first'
f2: [1 2 3]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 >> As2.f1='Second';As2.f2=[1,2;3,4]
As2 =
f1: 'Second'
f2: [2x2 double]

>> As=[As1;As2]
As =
2x1 struct array with fields:
f1
f2

>> size(As)
ans =
2 1

>> As(1) %取出第一个数组
ans =
f1: 'first'
f2: [1 2 3]

>> Bs=struct2cell(As) %将结构体转化为元胞数组(元胞数组没有域)
Bs =
'first' 'Second'
[1x3 double] [2x2 double]

>> Cs=cell2struct(Bs,{'c1','c2'},1) %将元胞数组转化为结构体(有两个域值)1代表一维
Cs =
2x1 struct array with fields:
c1
c2

5. 批量处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
clc
clear all
tic
srcDir=uigetdir('Choose source directory.'); %获得选择的文件夹
cd(srcDir);%进入到文件夹中
allnames=struct2cell(dir('*.jpg')); %只处理8位的JPG文件
[k,len]=size(allnames); %获得bmp文件的个数
for ii=1:len
name=allnames{1,ii};
tu=imread(name); %读取文件
%**************************************************************************
%然后在此处添加你的图像处理程序即可
%**************************************************************************
end
toc

在 m a t l a b 中测试一次,文件夹中有33张图像:

Snipaste_2024-04-18_20-43-26.png

使用此程序运行提取纹理图像特征,花费 1 8秒 。

提取特征参量如下:

Snipaste_2024-04-18_20-43-41.png