1

给定一个带有少量(1-3)斑点的阈值图像,我想选择最靠近中心的斑点,我希望它是一个数字:

前 后

我想将红色矩形提取为单独的 Mat,因为它最靠近中心(绿点)。我的第一个想法是遍历图像中的所有斑点,并从其质心到图像中心的像素距离最小的斑点。但是,我不熟悉绝大多数 OpenCV 函数(而且有很多!)所以我想知道是否有更好的方法。

不过,我已经看到了一些问题:

  1. 如果外面的盒子覆盖了 3 或 4 条边,即使盒子本身并不靠近中心,质心也可能靠近中心。也许我应该使用更高阶的时刻来赋予远离中心的点更多的权重?
  2. 据我所知,OpenCV 没有集成的 blob 查找(或连接组件标记)库。我可以使用查找轮廓,但这对于像 6、8 或 9 这样带有内部部分的数字可能不准确。
4

6 回答 6

2
  1. 使用 findContours 查找 blob
  2. 使用 boundingRect 获取他们的边界矩形
  3. 此时,你可以做你想做的事
于 2012-09-25T01:18:13.700 回答
1

在您的示例图像中,质心将不起作用,因为其他区域的质心比 6 的质心更靠近图像中心。相反,您应该寻找包含离图像中心最近的像素的区域。

我将其分解为:

  1. 做区域标注。使用快速联合查找数据结构和Wikipedia 上描述的两遍算法手动编码很容易(也很有趣!) 。您可以通过 OpenCVMat界面访问图像。
  2. 找到离中心最近的非零像素的位置。从一个简单的详尽搜索开始……只有在太慢时才考虑优化。
  3. 在您的区域标记图像中查找此像素的区域。

如果这还不够好,您可以查看某种加权质心,其中靠近图像中心的像素具有更高的权重。

于 2012-09-24T18:00:48.600 回答
0

没有 OpenCV 函数可以找到质心最接近特定点的 blob。无论如何,对于 1-3 个 blob,循环遍历所有这些将是一个快速操作。

于 2012-09-24T16:49:02.150 回答
0
  1. 使用以下任一 blob 计数库... cvBlobslib 或使用cvBlob ...两者都基于单扫描标记算法..
  2. 除了组件标签之外,您还可以获得边界框、轮廓、椭圆拟合、斑点过滤,具体取决于斑点的大小以及斑点的加法和减法....
于 2012-09-25T00:59:42.343 回答
0

您可以使用包含孔的区域的 findContour/drawContour 提取连接的组件并计算标签图像。文档中有一个代码示例可以做到这一点,尽管如果速度是一个问题,您可以实现一个专用方法。

要找到最接近图像中心的 CC,您不应依赖质心,因为您的区域具有复杂的形状。您可以从中心开始以越来越远的距离扫描标签图像,并查看您首先落在哪个连接组件上。

于 2012-09-25T21:38:05.513 回答
0
  1. 编写一个类来进行连通分量标注。这是它的wiki链接。您需要创建一个Disjoint Set类才能使其工作
  2. 不是找到斑点的质心,而是找到从像素到图像中心的距离的平均总和。总和(pixel_i - 中心)/total_num_pixel_in_the_blob。
于 2012-10-02T06:38:25.100 回答