用于构建最小尺寸边界框/凸包的顶点

问题描述 投票:1回答:1

我有一个来自灰度图像的数据数组,其中有一些来自某些强度值的连续点的分段集。

[当前,我正在执行一个简单的边界框例程,在其中找到最小和最大(x,y)[行,列]点。显然,这无法提供包含一组点的最小框,而这可以通过简单地旋转矩形来证明,因此最长轴不再与主轴对齐。

我想做的是找到最小尺寸的定向边界框。使用称为旋转卡尺的算法似乎可以实现这一点,但是该算法的实现似乎依赖于您要拥有一组顶点的想法。有关此算法的一些详细信息:https://www.geometrictools.com/Documentation/MinimumAreaRectangle.pdf

我的主要问题是在当前数据中找到顶点。我认为我至少需要找到候选顶点,以减少执行的迭代次数,因为点的数量相对较大,如果我想出一种方法可以将内部点视为顶点,则不需要不包括它们。

这是我正在使用的一些示例数据:

Non-rotated scene

这是使用朴素算法的分割场景,在该场景中,由于对象大多与图像轴对齐,因此可以较好地分割出中心对象:

“分段的连续区域边界框</p

用红色,您可以看到我正在使用2个顶点绘制的当前边界框:找到的点组的左上角和右下角。

旋转部分是我当前方法失败的地方,因为我仅使用两个点定义边界框,任何旋转且未轴向对齐的东西都将占据比封装点更多的面积。

以下是场景中旋转对象的示例:Rotated objects

这是该场景上当前的天真分割效果,它比旋转对象周围的必要框大:

Rotated segmented objects

理想情况下,结果是将边界框与要分割的点的最长轴对齐,这是我在实现时遇到的麻烦。

这是一张图片,粗略显示了我真正想要实现的目标:

Ideal segmentation example

[您还可能会注意到在边框周围的图像中进行了不必要的分割,以及一些小的分割,应使用我尚未开发的其他启发式方法将其删除。我也乐于接受其他分割算法的建议,这些建议可以对我感兴趣的对象提供更可靠的检测。

我不确定这个问题是否会完全清楚,因此我会尽力澄清我所要问的内容是否不明显。

image-processing geometry computational-geometry image-segmentation bounding-box
1个回答
0
投票

已经晚了,但这可能仍然有帮助。这是您需要做的:

  1. 展开像素以使小段连接较大的物体
  2. 找到连接的物体
  3. 从每个主体中选择一个像素样本
  4. find the MBR(所选集合的[定向]最小边界矩形] >>

第一步,您可以执行dilation。就像DBSCAN聚类一样。对于步骤3,您可以简单地从均匀分布中选择随机像素。显然,保留的像素越多,MBR越准确。我在MATLAB中对此进行了测试:

% import image as a matrix of 0s and 1s
oI = ~im2bw(rgb2gray(imread('vSb2r.png'))); % original image
% expand pixels
dI = imdilate(oI,strel('disk',4)); % dilated
% find connected bodies of pixels
CC = bwconncomp(dI);
L = labelmatrix(CC) .* uint8(oI); % labeled 
% mark some random pixels
rI = rand(size(oI))<0.3;
sI = L.* uint8(rI) .* uint8(oI); % sampled
% find MBR for a set of connected pixels
for i=1:CC.NumObjects
   [Y,X] = find(sI == i);
   mbr(i) = getMBR( X, Y );
end

enter image description here

您还可以使用更多处理和形态学操作来去除一些无效像素:

  1. remove holes
  2. 查找界限
  3. find skeleton

在MATLAB中:

I = imfill(I, 'holes');
I = bwmorph(I,'remove');
I = bwmorph(I,'skel');
© www.soinside.com 2019 - 2024. All rights reserved.