Arrays Matlab-循环裁剪2d图像贴图并存储在单个变量中

Arrays Matlab-循环裁剪2d图像贴图并存储在单个变量中,arrays,matlab,image-processing,Arrays,Matlab,Image Processing,我有一个代码,可以通过从二值图像的带标签映射labelledmap([labelledmap,labelcount]=bwlabel(HVEdge,8);)中找到边界条件来裁剪输入图像input的连接组件 我是matlab新手,所以这听起来可能很愚蠢。。 问题是,我无法在同一变量中存储不同的裁剪图像,因为matlab似乎将现有图像和新裁剪图像的末端合并,即,它正在存储两个裁剪图像之间的完整地图,我认为:/ 这是使用不同变量存储裁剪图像的输出(我想要的输出类型) 这是通过将裁剪后的图像存储在同

我有一个代码,可以通过从二值图像的带标签映射labelledmap([labelledmap,labelcount]=bwlabel(HVEdge,8);)中找到边界条件来裁剪输入图像input的连接组件

我是matlab新手,所以这听起来可能很愚蠢。。 问题是,我无法在同一变量中存储不同的裁剪图像,因为matlab似乎将现有图像和新裁剪图像的末端合并,即,它正在存储两个裁剪图像之间的完整地图,我认为:/

这是使用不同变量存储裁剪图像的输出(我想要的输出类型)

这是通过将裁剪后的图像存储在同一个变量中得到的输出(没有帮助)

我试着使用一个数组,其大小等于生成的标签总数,但结果相同。。我还尝试了clearvars在循环的每次迭代后清除输出标记图像ltoken,但没有任何帮助

那么,是否有任何可能的方式来显示单个裁剪的图像。。此外,裁剪图像的数量可能有数千个,因此我想使用一个循环来编码它们的裁剪机制

这是所附代码的一部分。。提前感谢;)

h=1时的
:标签计数
对于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' );