首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab -在循环中剪切2d图像映射并将其存储在单个变量中。

Matlab -在循环中剪切2d图像映射并将其存储在单个变量中。
EN

Stack Overflow用户
提问于 2013-11-26 11:35:54
回答 1查看 962关注 0票数 0

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

我刚开始使用matlab所以这听起来很愚蠢..。问题是,我无法将不同的裁剪图像存储在同一个变量中,因为matlab似乎将已经存在的图像和新裁剪的图像的末端合并,也就是说,它正在存储两个裁剪图像之间的完整映射,就像我所看到的那样:/

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

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

我试着使用一个大小数组,大小等于所产生的标签的总数,但结果是一样的。另外,在循环的每一次迭代之后,我尝试了清除输出令牌映像ltoken,但这没有帮助。

那么,有没有可能显示单个裁剪的图像。此外,裁剪图像的数量可能有数千张,所以我想使用一个循环来编码它们的裁剪机制。

这是附加代码的一部分。(预先谢谢;)

代码语言:javascript
复制
for h=1:labelcount
    for i=1:r
        for j=1:c

             if labelledmap(i,j)==h
                    if i<ltop
                        ltop=i;
                    end
                    if i>lbottom
                        lbottom=i;
                    end
                    if j<lleft
                        lleft=j;
                    end
                    if j>lright
                        lright=j;
                    end
             end

        end
    end

    if ltop>5
        ltop=ltop-5;
    end
    if lbottom<r-5
        lbottom=lbottom+5;
    end
    if lleft>5
        lleft=lleft-5;
    end
    if lright<c-5
        lright=lright+5;
    end

    lwidth=lright-lleft;
    lheight=lbottom-ltop;

    ltoken=imcrop(input,[lleft ltop lwidth lheight]);
    figure('Name', 'Cropped Token'), imshow(ltoken);
    clearvars ltoken;
end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-26 12:55:59

  1. 您需要为label h的每次迭代初始化ltoplbottomlleftlright。我认为这就是为什么你把剪裁的图像“粘”在一起的原因。
  2. 检查每个标签的所有像素都是非常低效的。特别是当你有很多标签的时候。 使用regionprops获取每个标签的'BoundingBox'属性。

下面是一个例子

代码语言:javascript
复制
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

您的代码显式地遍历所有像素,只是为了找到搜索框,我仍然有些震惊。这不是matlab做事情的方式。

如果您坚持不使用regionprops,下面是查找ii-th边界框的一种更简单的方法:

代码语言:javascript
复制
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' );

在图像坐标上没有循环。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20216003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档