Arrays Matlab-循环裁剪2d图像贴图并存储在单个变量中
我有一个代码,可以通过从二值图像的带标签映射labelledmap([labelledmap,labelcount]=bwlabel(HVEdge,8);)中找到边界条件来裁剪输入图像input的连接组件 我是matlab新手,所以这听起来可能很愚蠢。。 问题是,我无法在同一变量中存储不同的裁剪图像,因为matlab似乎将现有图像和新裁剪图像的末端合并,即,它正在存储两个裁剪图像之间的完整地图,我认为:/ 这是使用不同变量存储裁剪图像的输出(我想要的输出类型) 这是通过将裁剪后的图像存储在同一个变量中得到的输出(没有帮助) 我试着使用一个数组,其大小等于生成的标签总数,但结果相同。。我还尝试了clearvars在循环的每次迭代后清除输出标记图像ltoken,但没有任何帮助 那么,是否有任何可能的方式来显示单个裁剪的图像。。此外,裁剪图像的数量可能有数千个,因此我想使用一个循环来编码它们的裁剪机制 这是所附代码的一部分。。提前感谢;) h=1时的Arrays Matlab-循环裁剪2d图像贴图并存储在单个变量中,arrays,matlab,image-processing,Arrays,Matlab,Image Processing,我有一个代码,可以通过从二值图像的带标签映射labelledmap([labelledmap,labelcount]=bwlabel(HVEdge,8);)中找到边界条件来裁剪输入图像input的连接组件 我是matlab新手,所以这听起来可能很愚蠢。。 问题是,我无法在同一变量中存储不同的裁剪图像,因为matlab似乎将现有图像和新裁剪图像的末端合并,即,它正在存储两个裁剪图像之间的完整地图,我认为:/ 这是使用不同变量存储裁剪图像的输出(我想要的输出类型) 这是通过将裁剪后的图像存储在同
:标签计数
对于i=1:r
对于j=1:c
如果标签映射(i,j)=h
如果伊尔巴顿
lbottom=i;
结束
如果正确的话
lright=j;
结束
结束
结束
结束
如果ltop>5
ltop=ltop-5;
结束
如果lbottom5
lleft=lleft-5;
结束
如果正确的话
对于标签h
的每次迭代,您需要初始化ltop
lbottom
lleft
和lright
。我想这就是为什么你把裁剪过的图像“粘”在一起的原因
遍历每个标签的所有像素是非常低效的。尤其是当你需要有很多标签时。
用于获取每个标签的'BoundingBox'
属性
这里有一个例子
st = regionprops( labelledmap, 'BoundingBox' );
imlist = cell( 1, numel(st) ); % pre-allocate
for ii=1:numel(st)
r = st(ii).BoundingBox;
% I understand you want to increase the BB by 5 pixels at each side:
r(1:2) = r(1:2) - 5; % start point moves -5
r(3:4) = r(3:4) + 10; % width and height increases by 10
imlist{ii} = imcrop( input, r );
end
我仍然对你的代码感到有点震惊,它显式地循环所有像素,只是为了找到bouding box。这不是matlab的做事方式。
如果您坚持不使用regionprops
,这里有一种更像Matlab的方法来查找ii
-th边界框:
imsk = (labeledmap == ii); % create a binary map with True for ii-th region
xFlat = any(imsk,1); % "flattening" imsk on the x-axis
lleft = find( xFlat, 1, 'first' );
lright = find( xFlat, 1, 'last' );
yFlat = any(imsk, 2);
ltop = find( yFlat, 1, 'first' );
lbottom = find( yFlat, 1, 'last' );
图像坐标上没有循环。尝试使用单元格数组。用imlist={}
初始化,用imlist{end+1}=…
@gagan顺便说一句,这是最好的。@DanielR在这种情况下,他提前知道imlist
中的元素数量-他应该预先分配,而不是在循环中创建imlist
GOR-这是一种糟糕的做法。你说得对imlist=cell(labelcount,1)
。不知什么原因,我错过了外环。
imsk = (labeledmap == ii); % create a binary map with True for ii-th region
xFlat = any(imsk,1); % "flattening" imsk on the x-axis
lleft = find( xFlat, 1, 'first' );
lright = find( xFlat, 1, 'last' );
yFlat = any(imsk, 2);
ltop = find( yFlat, 1, 'first' );
lbottom = find( yFlat, 1, 'last' );