Matlab2018a 将ImageLabeler输出的mat文件转为图片保存

最近在做图像分割需要制作样本,Matlab自带的ImageLabeler工具就能方便地进行样本的标记,不过它只能将输出的样本数据保存为mat文件,为了方便在其他地方也能轻松使用这些样本,需要把mat文件转化为图片进行保存。
对于低版本的matlab,下面这个博客已经给出了很详细的说明https://blog.csdn.net/tsyccnh/article/details/50812632,然而我使用的是Matlab2018a中的ImageLabeler工具,与之前低版本的工具相比做了一定的改动,查了一些资料后终于操作成功,下面就详细讲述下心得。

1.制作样本并输出为mat文件

在Matlab的APP工具中打开Image Labeler
在这里插入图片描述
点击New Session新建一个会话
在这里插入图片描述
点击load下的Add Images from folder添加要制作样本的图像
在这里插入图片描述
加载图像后,点击Define New ROI Label新建一个类别可进行样本标记
在这里插入图片描述
填写该类别的名称,选择Rectangle则以矩形框的方式制作训练样本
在这里插入图片描述
制作样本完成后,点击Save下的Session as保存当前会话,可以使用Load Session打开保存的会话进行继续编辑。
另外还需要点击Export Labels把制作的样本保存为mat文件
在这里插入图片描述

2.将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('保存训练样本图片结束');
发布了37 篇原创文章 · 获赞 6 · 访问量 5417

猜你喜欢

转载自blog.csdn.net/qq_37891889/article/details/84780495
今日推荐