【MATLAB】关于bwconncomp连通分量的BoundingBox问题

【MATLAB】关于bwconncomp连通分量的BoundingBox问题

by 今天不飞了

最近越来越懒了,能找到现成的就绝不手撸……
而在做连通域分割的过程中,计算结果始终与预计的有出入。经过测试才弄明白BoundingBox输出的含义。总结分享一波


一、试一试

我们创建一个图像,计算连通分量并获取外框

clear; close all; clc

% 初始化2D
img = zeros(100);
img(20:50,45:60) = 1; # 白色区域 行20~50,列45~60

% 获取Boundingbox
CC = bwconncomp(img);
A = regionprops(CC,'Area','BoundingBox');
range = A.BoundingBox; % 注意注意注意!由于该图只有一个连通分量才能这么写哈

% 输出
disp(range)

我想象中的结果是[20,45,50,60](两点式)或[20,45,30,15](起点增量式),结果却是(如下)
在这里插入图片描述
没一个数字一样,还有小数……直接给我正懵逼了。


二、解释

测试了几组数据才弄明白了。
首先,MATLAB使用的起点增量式
其次,为了完美把目标Box住,将结果扩大了0.5个像素
最后,它输出的是(x,y)格式的坐标,而非矩阵的(r,c)行列索引
对应关系为[x,y,dx,dy] ==> [c,r,dc,dr]

下图为矩阵索引与坐标的关系
在这里插入图片描述


三、使用

1. 获取索引

如果你是想通过这种方式将目标区域提取出来(比如为了减小内存),那么你需求对结果进行如下

% 代码接上面
range = uint16(range); % 先取整
Row1 = range(2);
Row2 = range(1);
Col1 = range(2)+range(4)-1;
Col2 = range(1)+range(3)-1;
% 提取目标区域
obj = img(Row1:Row2,Col1:Col2);

2. 绘制BoundingBox

如果你的目的是可视化显示目标范围,那就啥都不用做了,
它的格式就是为这个而生的,直接使用rectangle()函数

% 代码接上面
imshow(img),hold on
rectangle('Position',range, 'EdgeColor','r', 'LineWidth',2)

效果如下
在这里插入图片描述


其他

  1. bwconncomp()函数还可以对三维二值图进行连通域分析,格式类似不再赘述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值