OpenCV - 找到最接近图像中心的斑点

时间:2012-09-24 16:43:09

标签: image-processing opencv

鉴于其中有一个小数(1-3)斑点的阈值图像,我想选择最接近中心的斑点,我希望它是一个数字:

Before After

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

我已经看到了一些问题,但是:

  1. 如果外侧的盒子覆盖3或4个侧面,则质心可能会 即使盒子本身不在附近,也要靠近中心 中心。也许我应该用更高阶的时刻来提供更多 重量到远离中心的点?
  2. 我知道OpenCV没有集成的blob-finding(或连接组件标签)库。我可以使用查找轮廓,但对于带有内部部分的数字,如6,8或9,这可能不准确。

6 个答案:

答案 0 :(得分:2)

  1. 使用findContours查找blob
  2. 使用boundingRect
  3. 获取其边界矩形
  4. 此时,你可以做你想做的事

答案 1 :(得分:1)

在您的示例图像中,质心将无法工作,因为其他区域的质心比6的质心更接近图像中心。相反,您应该查找包含与图像中心最近的像素的区域。

我会把它分解为:

  1. 进行区域标记。使用维基百科上描述的fast union-find data structuretwo-pass algorithm手动编码很容易(也很有趣!)。您可以通过OpenCV Mat界面访问该图像。
  2. 找到距离中心最近的非零像素的位置。从一个简单的详尽搜索开始......如果它太慢,只考虑优化。
  3. 在区域标记的图像中查找此像素的区域。
  4. 如果这还不够好,你可以查看某种加权质心,其中靠近图像中心的像素具有更高的权重。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

  1. 使用以下任一blob计数库... cvBlobslib 或者使用cvBlob ...两者中的任何一个基于单个扫描标记算法......所以它快速
  2. 除了组件标签,你可以得到边界框,轮廓,椭圆拟合,blob过滤取决于blob的大小和blob的加减......(

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

  1. 编写一个类来进行连接组件标记。 here's the wiki link on it。您需要创建一个Disjoint Set类才能使其正常工作
  2. 找到从像素到图像中心的距离的平均和,而不是找到斑点的质心。 sum(pixel_i - center)/ total_num_pixel_in_the_blob。