如何在二进制图片中找到“线”? [关闭]

问题描述 投票:-1回答:1
如果所有这些看起来都令人困惑,请先道歉。我试图使它尽可能清晰。

我班上的一个挑战性问题是编写一个程序,该程序可以在黑白图像上找到线段。线条将始终为一个像素宽,在白色背景上为黑色,没有灰度或其他颜色。每个图像最多包含2行。我的程序的输出应该是每个线段的起点和终点的坐标(如果有的话)。坐标将始终是整个像素坐标。

图像将由文本文件表示。文件中的一行是图像的一行。该行中的每个字符均为一个像素。一个像素的值可以为0或1。0表示该像素不是线的一部分(白色)。 1表示此像素是线条的一部分(黑色)。通常,在表示图像时,左上像素具有(0,0)坐标。 X轴向右增加,而Y轴向下增加。

在常规输入集中,线不会相互接触或相交。

程序的输出对于每个图像应该有一行。该行应以图像的文件名开头,然后是端点的坐标。每个坐标都应该用括号括起来。每个坐标的第一个值应为X位置,第二个为Y位置。值应以逗号分隔。坐标应以空格分隔。同一行的两个端点在输出中应该彼此跟随。

所以我也得到了一组由1和0组成的'图片'。基本上如下图所示:

the 'binary picture'?

我完全不知道如何开始这种问题。甚至还有一个奖励部分,他们要求您使该程序能够找到彼此接触的线

非常感谢你们!

这里是我得到的一张“照片”的样本。它实际上是一个txt文件,因为里面的所有内容都是0和1s

000000000000000000000000000000100000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000010000100000000000000000000000000000000000000000100001000000000000000000000000000000000000000001000010000000000000000000000000000000000000000010000100000000000000000000000000000000000000000100001000000000000000000000000000000000000000001000010000000000000000000000000000000000000000100100000000000000000000000000000000000000000100100000000000000000000000000000000000000000100100000000000000000000000000000000000000000100100000000000000000000000000000000000000000100100000000000000000000000000000000000000001000000000000000000000000000000000000000001000000000000000000000000000000000000000001000000000000000000

python c++ swift computer-vision
1个回答
1
投票
可能的解决方案是:

    在行上重复,直到找到“ 1”(假设它具有坐标x1,y1)。
  • 在下一行中,在x = x1或x = x1-1或x = x1 + 1处应该有一个“ 1”。这些x值中只有一个应为“ 1”,否则两个线相交。
  • [当您找到第二个“ 1”时,您应该能够计算出线的斜率并反复(从上到下)检查是否存在“ 1”在对应于线的坡度和起点的坐标中。执行此操作,直到达到“ 0”。您看到的最后一个“ 1”是该行的端点。
  • 现在再次开始该过程,但忽略您已经看到的“ 1”值。
  • 编辑:

    我实现了这个主意。基本上,这是一个为您提供直线起点和终点的功能。然后“删除它”,以便您可以再次运行它并找到下一行。

    # data = ["00..00", # ..., # "00..00"] # data is list of lines data = [[int(c) for c in l] for l in data] found_a_line = False for i in range(len(data)): if found_a_line: if not(data[i][last_j] + data[i][last_j+1] + data[i][last_j-1]): line_end = (i-1, last_j) break else: data[i-1][last_j] = 0 last_j = data[i][last_j]*last_j + data[i][last_j+1]*(last_j+1) + data[i][last_j-1]*(last_j-1) else: for j in range(len(data[i])): if data[i][j]: found_a_line = True last_j = j line_start = (i,j) break # You should edit the output print(line_start, line_end)

  • © www.soinside.com 2019 - 2024. All rights reserved.