找到所有圆圈尺寸的快速方法是什么?

时间:2015-06-04 01:54:12

标签: c# image algorithm geometry

给定完全黑白图片(因此唯一的颜色是黑色或白色没有灰色阴影),它上面有很多不同大小的圆圈(黑色),找到中心坐标的快速方法是什么圈子的大小和圆圈的大小,并将它们存储为词典条目?当我的意思是快速时,我的意思是,如果我将这个圆圈发现功能称为每秒10或20次,它就不会滞后太多。我也做了一些研究,发现我可以通过在圆圈上取三个点来找到圆心或半径的中心,这有帮助吗?

Picture

3 个答案:

答案 0 :(得分:2)

首先想到的是逐像素扫描图像,寻找黑色像素。当你找到一个,开始填充洪水。一旦Flood填充完成测量左,右,顶部和底部范围,然后通过除以2得出中心点。这假设没有圆圈重叠。我确信可能有一些更优化的方法可以避免泛滥整个圈子。

优化#1: 当您找到第一个黑色像素时,不是填充洪水,而是沿着至少有1个白色邻居的所有8个邻居查找相邻像素。继续关注这些像素,直到再次点击第一个像素。那应该给你一个轮廓,从那里你可以得到宽度,高度和中心点,就像我原来的答案一样。

优化#2 :如果圆圈的最小尺寸,您不必逐像素扫描。您可以扫描以最小尺寸间隔的水平和垂直线,以查找黑色像素。

答案 1 :(得分:2)

我认为您无法避免必须检查所有白色像素,因此算法的复杂性将始终为O(宽度*高度)。但是,您绝对不需要检查所有黑色像素。

找到圆的边缘后,您可以水平走到下一个边缘,然后垂直走到另一个边缘。通过边缘上的这3个点,您可以构建一个与圆相同中心的矩形。然后垂直或水平走动以找到圆的半径。

rectangle inside a circle will have same center as the circle

答案 2 :(得分:0)

您需要一个简单的光线跟踪器,从左到右,从上到下,逐个像素地扫描您的空间。当你遇到黑色像素时,你需要做一些工作。这是一个算法。

  1. 当前像素为白色时,前进到下一个像素(从左到右,或下一行像素)
  2. 当您点击黑色像素时,向下移动一条垂直线直到您点击一个白色像素。这是你的直径,你可以用它来计算你的圆圈大小(无论你的大小是什么意思)。要将此圆圈标记为已访问,请将周边颜色设为绿色(简单边缘检测算法);这样,如果你在巡航时首先击中一个绿色像素,继续在黑色圆圈中巡航,直到你在圆圈的另一个对称面上击中绿色。因此,您无需使用完整的填充算法,只需计算大小或跳过访问圈,其成本只需要一小部分洪水填充算法。
  3. 注意1.屏幕是光栅化的,这意味着您点击的第一个像素不一定是最顶部的像素,它可能是右侧的一个像素,因此您必须左右进行一些导航,因为抗锯齿以确定正确的顶部并从中击落。

    注意2.如果您的圈子重叠,请说明并允许转储此算法并考虑其他内容: - )