最近在做图像分割需要制作样本,Matlab自带的ImageLabeler工具就能方便地进行样本的标记,不过它只能将输出的样本数据保存为mat文件,为了方便在其他地方也能轻松使用这些样本,需要把mat文件转化为图片进行保存。
对于低版本的matlab,下面这个博客已经给出了很详细的说明https://blog.csdn.net/tsyccnh/article/details/50812632,然而我使用的是Matlab2018a中的ImageLabeler工具,与之前低版本的工具相比做了一定的改动,查了一些资料后终于操作成功,下面就详细讲述下心得。
在Matlab的APP工具中打开Image Labeler
点击New Session新建一个会话
点击load下的Add Images from folder添加要制作样本的图像
加载图像后,点击Define New ROI Label新建一个类别可进行样本标记
填写该类别的名称,选择Rectangle则以矩形框的方式制作训练样本
制作样本完成后,点击Save下的Session as保存当前会话,可以使用Load Session打开保存的会话进行继续编辑。
另外还需要点击Export Labels把制作的样本保存为mat文件
在试验中我共选取了两个类别的样本,名称为building何notbuilding,输出的label_2_classes_train.mat文件保存在当前目录下,接下来就具体分析如何使用mat文件。
首先加载mat文件:
load('label_2_classes_train.mat')
可以看到显示的变量名称为gTruth,类型为groundTruth对象。通过gTruth.LabelData返回存放样本数据的table。
gTruth.LabelData
output:
1×2 table
building notbuilding
_____________ _____________
[28×4 double] [30×4 double]
这个table的大小为1x2,通过它的Properties操作可以获取table的一些属性。例如要获取table中变量的名称:
gTruth.LabelData.Properties.VariableNames
output:
1×2 cell 数组
{‘building’} {‘notbuilding’}
我们要获取table中的元素,可以用{}进行索引操作:
gTruth.LabelData{1,1}
output:
1×1 cell 数组
{28×4 double}
返回的是gTruth.LabelData中的第1行第1列的元素,类型为cell数组,这个cell数组中的元素为一个28x4的double型数组。我们要获取这个cell中的元素,可以用{}进行索引操作。
gTruth.LabelData{1,1}{1,1}
output:
ans =
353 25 14 12
560 16 12 9
返回的数组中的每一行表示一个矩阵框选样本的位置(xmin,ymin,width,height),这个与Imcrop(img,rect)中的rect中的格式一致。
获取一个样本的位置操作为:
gTruth.LabelData{1,1}{1,1}(1,:)
output:
ans =
353 25 14 12
这样一来我们就成功的获取了所需要的数据。
下面是将mat文件转化为图片的函数:
function SaveImagesFromImageLabeler(img_path,mat_filepath,save_dir)
%UNTITLED 将使用ImageLabeler标记的样本的mat文件转化为tiff格式的图片保存
%parameters:
%--img_path:
%meaning:用来制作样本的图像的路径
%type:string
%--mat_filepath:
%meaning:使用Export Labels输出的mat文件的路径,如‘1.mat’
%type:string
%--save_dir:
%meaning:保存图像的文件夹
%type:string
%%
img=imread(img_path);
load(mat_filepath);
table=gTruth.LabelData;
%获取table的变量名,即类别名称,返回一个cell
class_name=table.Properties.VariableNames;
%判断存放图像的文件夹是否存在,不存在则创建
n_class=size(class_name,2);
for i=1:n_class
savepath=fullfile(save_dir,class_name{1,i});
disp(savepath);
if exist(savepath,'dir')==0
mkdir(savepath);
end
end
%遍历table中的每一类别的cell
for i=1:n_class
%获得每一类中的样本图片数目
class_array=table{1,i}{1,1};
num_img=size(class_array,1);
%遍历每一类的所有图片
for j=1:num_img
img_sample=imcrop(img,class_array(j,:));
img_sample_savepath=fullfile(save_dir,class_name{1,i},[num2str(j),'.tiff']);
disp(img_sample_savepath);
imwrite(img_sample,img_sample_savepath);
end
end
end
主函数为:
%保存训练样本和测试样本图片
%%
%保存训练样本图片
train_img_path='1.tif';
train_mat_filepath='label_2_classes_train.mat';
train_save_dir='data\train';
SaveImagesFromImageLabeler(train_img_path,train_mat_filepath,train_save_dir);
disp('保存训练样本图片结束');