opencv 从栅格文件中的斑点中查找线(python)

m1m5dgzv  于 2022-11-15  发布在  Python
关注(0)|答案(1)|浏览(128)

我有一个二进制光栅文件,想在python中找到连接几个点的直线。这些直线应该是直线连接点,但可以改变直线的Angular 。下面是一个二进制光栅的例子,我在其中搜索连接线:

我认为有一个很好的机会用一个python库来帮助它。到目前为止,我只找到了像RANSAC或线性回归这样的东西,但我不想为所有的点只找到一条线,也不想在生成线之前手动分组几个点(认为错过可能性的机会太高了)。
我考虑过构建斑点的质心,然后将合适的质心连接到直线上。在这一点上,我的两个主要问题是:
1.如何分割斑点并获得它们的质心
1.如何以有效的模式迭代质心,而不必担心错过或出现双线
对于1。我尝试使用opencvs' findcontour,但我收到一个错误,告诉我不能使用多波段图像(我正在使用tif)

bweufnob

bweufnob1#

这里有一个“蛮力”方法的想法。我还没有想太多关于它可能需要多长时间,或者暂时并行化它。

  • 使用findContours()找到所有的斑点和它们的质心。
  • 使用cv2.connectedComponents()执行 “连通分量” 分析,以便每个斑点的所有像素都被分配相同的标签。我的意思是左上角斑点的所有像素都将是1,下一个斑点的所有像素都将是2,下一个斑点的所有像素都将是3。使此类型为np.uint16,以容纳最多32个像素,767个斑点(我们将在一分钟内再添加32,768个)
  • 按如下方式迭代所有斑点质心
  • 在所有Angular 0..179上迭代,在测试期间可能使用5度步长,在生产期间可能使用1度步长
  • 使用scikit-image drawLine()生成一条线的坐标,该线以该Angular 从该质心开始并延伸到图像边界之外-这些是从质心辐射的 “射线”
  • 将32,768添加到此射线上的所有像素
  • np.unique()求出图像中唯一值的个数。如果减去斑点的个数,你会得到这条线在这个Angular 与质心相交的斑点的个数。
  • 如果超过阈值,比如说3(意味着它与3个斑点相交),保存它。

这里有一个更具体的例子...
假设你有10个斑点。第一个斑点的所有像素将被标记为0。第二个斑点的所有像素将被标记为1,以此类推。你的标记图像将有10个唯一的值,或者可能有11个背景值。现在从第一个斑点的质心开始,从0..179的每个Angular 生成线条。对于每条线条,求出这条线上所有点的坐标,并将这些点加上32768。2现在计算图像中唯一值的个数。3如果这条线与斑点5相交,那么图像中的值将是32768+5。4如果这条线与斑点8相交,图像中会有新的值32768+8,所以现在图像中唯一值的数量是原来的10加上两个新值(32768+5和32768+8),所以你会知道这条线与两个斑点相交。

相关问题