使用Matlab批量处理数据

最近接到任务,需要批量分割灰度图像,并保存为.mat文件。图像文件保存在若干个子文件夹中。代码如下:

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
maindir='sparkydogx/cityscape/val';
subdir=dir(maindir);
for i =1:length( subdir )
if( isequal( subdir( i ).name, '.' )||isequal( subdir( i ).name, '..')||(~subdir( i ).isdir))
continue; %subdir的前两个元素是../和./
end
subdirpath = fullfile( maindir, subdir( i ).name, '*.png' ); %subdirpath为字符串,用于描述文件位置和类型
dat = dir( subdirpath ); %dat为所有满足条件的文件路径
for j = 1 : length( dat )
datpath = fullfile( maindir, subdir( i ).name, dat( j ).name);
A=double(imread(['',datpath])); %灰度图像读取后为uint8格式,将其转换为double
for k = 1:43
h{k}=A(:,656*(k-1)+1:656*k);
if k<=15
cmd=['X.val.',subdir(i).name,'(',num2str(j),').BeliefMap(',num2str(k),')=h(',num2str(k),');'];
eval(cmd);
else
cmd=['X.val.',subdir(i).name,'(',num2str(j),').PAF(',num2str(k-15),')=h(',num2str(k),');'];
eval(cmd);
end
end

end
end
save('/spardogx/val.mat','X','-v7.3');

涉及到的点:

  1. 文件夹的遍历,在上面的代码中通过dir实现
  2. eval函数的使用,eval可以执行字符串中的指令,使用子文件夹名作为structure的字段,十分方便。
  3. '-v7.3' 最初在执行时遇到错误:
    Warning: Variable 'X' cannot be saved to a MAT-file whose version is older than 7.3. To save this variable, use the -v7.3 switch.
    原因是Matlab在7.3版本之前不支持大个数据的存储(2GB以上),在7.3版本后添加了这一支持。

2017-10-25 更新:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
maindir='/data2/source/cityscapes'
outputDir='/data2/dest/heatmaps'
subdir_1=dir(maindir);
for i=1:length(subdir_1);
if( isequal( subdir_1( i ).name, '.' )||isequal( subdir_1( i ).name, '..')||(~subdir_1( i ).isdir))
continue;
end
subdir_2=dir(fullfile(maindir,subdir_1(i).name));
for j=1:length(subdir_2)
if( isequal( subdir_2( j ).name, '.' )||isequal( subdir_2( j ).name, '..')||(~subdir_2( j ).isdir))
continue;
end
subdir_3=dir(fullfile(maindir,subdir_1(i).name,subdir_2(j).name));
for x=1:length(subdir_3)
if( isequal( subdir_3(x).name, '.' )||isequal( subdir_3( x ).name, '..')||(~subdir_3( x ).isdir))
continue;
end
finalpath=fullfile(maindir,subdir_1(i).name,subdir_2(j).name,subdir_3(x).name,'*.png')
dat=dir(finalpath);
for idx =1:length(dat)
imgId=dat(idx).name(1:length(dat(idx).name)-13);
datpath=fullfile(maindir,subdir_1(i).name,subdir_2(j).name,subdir_3(x).name,dat(idx).name);
A=double(imread(['',datpath]));
for k = 1:43
h{k}=A(:,656*(k-1)+1:656*k);
if k<=15
hmfullfile=fullfile(outputDir,subdir_1(i).name,subdir_2(j).name,[imgId,'_bm.mat']);
pafname=fullfile(outputDir,subdir_1(i).name,subdir_2(j).name,[imgId,'_paf.mat']);
% cmd=['X.val.',subdir(i).name,'.',dat(j).name,'.BeliefMap(',num2str(k),')=h(',num2str(k),');'];
cmd1=['heatmap.imageID=''',imgId,''';'];
cmd2=['heatmap.BeliefMap(',num2str(k),')=h(',num2str(k),');'];
cmd3=['save(''',hmfullfile,''',''heatmap'');'];
eval(cmd1);
eval(cmd2);
eval(cmd3);
else
% cmd=['X.val.',subdir(i).name,'.',dat(j).name,'.PAF(',num2str(k-15),')=h(',num2str(k),');'];
cmd1=['paf.imageID=''',imgId,''';'];
cmd2=['paf.PAF(',num2str(k-15),')=h(',num2str(k),');'];
cmd3=['save(''',pafname,''',''paf'');'];
% eval(cmd);
eval(cmd1);
eval(cmd2);
eval(cmd3);
end
end



end

end
end
end