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)
效果如下
其他
- bwconncomp()函数还可以对三维二值图进行连通域分析,格式类似不再赘述