首页 文章

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

提问于
浏览
1

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

Before

After

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

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

  • 如果外侧的盒子覆盖3或4个侧面,即使盒子本身远离中心,质心也可能靠近中心 . 也许我应该使用更高阶的时刻来给远离中心的点增加更多的重量?

  • OpenCV没有我所知的集成blob-finding(或连接组件标签)库 . 我可以使用查找轮廓,但对于具有内部部分的6,8或9这样的数字可能不准确 .

6 回答

  • 0
    • 使用以下任一blob计数库... cvBlobslib或使用cvBlob ...两者中的任何一个都基于单扫描标记算法..所以它的速度快

    • 除了组件标签,你可以得到边界框,轮廓,椭圆拟合,blob过滤取决于blob的大小和blob的加法和减法....

  • 0
    • 使用findContours查找blob

    • 用boundingRect获取它们的边界矩形

    • 此时,你可以做你想做的事

  • 0

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

    我会把它分解成:

    • 做区域标签 . 使用维基百科上描述的fast union-find data structuretwo-pass algorithm手动编码很容易(也很有趣!) . 您可以通过OpenCV Mat 界面访问该图像 .

    • 找到距离中心最近的非零像素的位置 . 从一个简单的详尽搜索开始......只有在它太慢的情况下才会考虑优化 .

    • 在区域标记的图像中查找此像素的区域 .

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

  • 0

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

  • 2

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

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

  • 1
    • 编写一个类来进行连通组件标记 . here's the wiki link on it . 您需要创建一个Disjoint Set类才能使其正常工作

    • 找到从像素到图像中心的距离的平均和,而不是找到斑点的质心 . sum(pixel_i - center)/ total_num_pixel_in_the_blob .

相关问题