Matlab样本制作程序修正

在学习使用Matlab制作训练样本集的过程中,看到过一篇介绍训练样本的博客,该博客对样本制作程序已经有较为详细的介绍,不过稍有一些不足之处,本文在此对其稍作完善。原文博客为:https://blog.csdn.net/tina_ttl/article/details/51034800
该博客对如何使用Matlab中的trainingImageLabeler小工具快速制作我们所需要的训练样本,在应用工具之后,使用训练样本制作程序对工具截出的感兴趣区进行统一制作,应用程序主要分为三部分(程序出自原博客):
(1)第一个运行的程序(SamplesMaker)
%% 该程序实现对第一幅子图的截图
% 调用matlab的样本制作函数(在运行该函数之前运行)
% trainingImageLabeler

%% 读取改组截图所对应的原始图像
% 截图的原始图像的名字(路径已经加入了)
imgName = positiveInstances.imageFilename;
%{
(上面这一段程序主要是将导出的感兴趣区源文件读入到imgName中,改语句赋值给imgName数据为cell类型,如果不修改之后的语句imread语句会出错,因为imread无法读入cell类型数据,因此需要将positiveInstances.imageFilename修改为positiveInstances.imageFilename{1},这样读取出来的就是positiveInstances.imageFilename这个元胞数据之中的元素,在该程序中为char元素。)
%}
% read the image
imgInput= imread(imgName); %读入图像
% convert to the gray image
if ndims(imgInput)==3
imgInput = rgb2gray(imgInput);
end

%% 得到改组截图的所有ROI的参数rectPosition(每一行元素为每个ROI的左上角坐标和该矩形的长宽)
rectPosition=positiveInstances.objectBoundingBoxes;
%{
(此处是要读取之前使用的小工具中截取的感兴趣的个数,感兴趣区的个数是从objectBoundingBoxes的行数读取出来的,该语句positiveInstances.objectBoundingBoxes应该修改为positiveInstances.objectBoundingBoxes{1},否则赋值给rectPosition是一个1X1的cell类型的变量,并不是想要的感兴趣区个数的矩阵)
%}
NumROI=size(rectPosition,1);%ROI个数
img=cell(NumROI,1);%存放每个image子图的元胞
for k=1:NumROI
%左上角(x0,y0),x方向长度xl,y方向长度yl
x0=fix(rectPosition(k,1));y0=fix(rectPosition(k,2));xl=rectPosition(k,3);yl=rectPosition(k,4);
% 第k个ROI所对应子图
img{k}=imgInput(y0:y0+yl-1,x0:x0+xl-1);
% 保存第k个ROI所对应子图
imwrite(img{k},[num2str(k),’.jpg’],’jpg’);
end

%% 将该目标图像的所有ROI信息保存在元胞rectPositionCell的第k个元胞中(k表示该目标图像是第几个图像)
numImg=1;%本程序的目标图像即为第一个图像
sampleData.rectPositionCell{numImg}=rectPosition;
%% 将该目标提取到的所有ROI对应的子图保存在元胞imgCell的第k个元胞中(k表示该目标图像是第几个图像)
sampleData.imgCell{numImg}=img;
save(‘sampleData.mat’,’sampleData’)

(2)第二个运行的程序
%% 该程序是对SamplesMaker的补充
%{
SamplesMaker实现的是单一图像的子图截取,现在需要对另外一幅对象进行子图截取,并需要将截图结果与上一幅截图结果保存在一起,所以,需要对程序进行改进对于第二幅以后的子图截图,应该利用本程序。
%}

%% 调用matlab的样本制作函数(在运行该函数之前运行)
% trainingImageLabeler

%% 读取该组截图所对应的原始图像
% 截图的原始图像的名字(路径已经加入了)
imgName = ROI_0906.imageFilename{1};%注释同程序一
% read the image
imgInput= imread(imgName); %读入图像
% convert to the gray image
if ndims(imgInput)==3
imgInput = rgb2gray(imgInput);
end

%% 载入以前的截图数据
load(‘sampleData.mat’);
numImg_before=size(sampleData.rectPositionCell,2);
numImg=numImg_before+1;%该次截图对应的图像编号
% 该次截图之前已具有的ROI个数
numRO_before=0;
for i=1:numImg_before
numRO_before=numRO_before+size(sampleData.rectPositionCell{i},1);
end

%% 提取该次截图的所有子图,并保存所有子图
% 当前截图得到的ROI个数
rectPosition= ROI_0906.Roi{1};
%{
如下图显示的是将ROI_0906.{1}和将ROI_0906赋值给rectPosition储存空间的区别,一个是将被访问者作为一个cell即一个整体赋值给该储存空间,另一个是将被访问者中的内容提取出来赋值给该储存空间。
}%Matlab样本制作程序修正_第1张图片
numROI=size(rectPosition,1);
for k=1:numROI
%左上角(x0,y0),x方向长度xl,y方向长度yl
x0=fix(rectPosition(k,1));y0=fix(rectPosition(k,2));xl=rectPosition(k,3);yl=rectPosition(k,4);
% 第k个ROI所对应子图
img{k}=imgInput(y0:y0+yl-1,x0:x0+xl-1);
% 保存第k个ROI所对应子图
imwrite(img{k},[num2str(numRO_before+k),’.jpg’],’jpg’);
end
%% 将本次的ROI数据保存在元胞rectPositionCell中
sampleData.rectPositionCell{numImg}= ROI_0906.Roi{1};
sampleData.imgCell{numImg}=img;
save(‘sampleData.mat’,’sampleData’)

(3) 第三个运行的程序
%% 本程序将所有截取的img整合为一个数据组imgData(元胞,每一个元胞存放一个图像)

%% 载入以前的截图数据
load(‘sampleData.mat’);
% 总子样本截取的源图像个数
numImg=size(sampleData.rectPositionCell,2);
% 总采样图像个数
numSamples=0;
for i=1:numImg
% 第i个截图源图像包含的采样子图个数
n=size(sampleData.rectPositionCell{i},1);
% 保存第第i个截图源图像包含的采样子图
for k=1:n
imgData(numSamples+k)=sampleData.imgCell{i}(k,1);
end
%{
对于循环中的语句,可以将其认为为访问元胞中的元胞。经验证后访问即sampleData.img{i}(k,1)返回来的是一个元胞其中包含了我们想要的内容,sampleData.imgCell{1}{k,1}访问返回来的就是元胞中的内容。
%}
% 总采样图像个数
numSamples=numSamples+n;
end
imgLabels=ones(numSamples,1);

save(‘imgData.mat’,’imgData’,’imgLabels’);
最后,所有截取的样本图像保存在元胞imgData中,
标签保存在imgLabels中。
在本文最后,考虑一下cell数组访问的问题,我们可以从以下几幅示意图考虑这个问题。
Matlab样本制作程序修正_第2张图片Matlab样本制作程序修正_第3张图片Matlab样本制作程序修正_第4张图片Matlab样本制作程序修正_第5张图片
这里写图片描述
Matlab样本制作程序修正_第6张图片Matlab样本制作程序修正_第7张图片
Matlab样本制作程序修正_第8张图片

你可能感兴趣的:(Matlab样本制作程序修正)