我班上的一个挑战性问题是编写一个程序,该程序可以在黑白图像上找到线段。线条将始终为一个像素宽,在白色背景上为黑色,没有灰度或其他颜色。每个图像最多包含2行。我的程序的输出应该是每个线段的起点和终点的坐标(如果有的话)。坐标将始终是整个像素坐标。
图像将由文本文件表示。文件中的一行是图像的一行。该行中的每个字符均为一个像素。一个像素的值可以为0或1。0表示该像素不是线的一部分(白色)。 1表示此像素是线条的一部分(黑色)。通常,在表示图像时,左上像素具有(0,0)坐标。 X轴向右增加,而Y轴向下增加。
在常规输入集中,线不会相互接触或相交。
程序的输出对于每个图像应该有一行。该行应以图像的文件名开头,然后是端点的坐标。每个坐标都应该用括号括起来。每个坐标的第一个值应为X位置,第二个为Y位置。值应以逗号分隔。坐标应以空格分隔。同一行的两个端点在输出中应该彼此跟随。
所以我也得到了一组由1和0组成的'图片'。基本上如下图所示:
我完全不知道如何开始这种问题。甚至还有一个奖励部分,他们要求您使该程序能够找到彼此接触的线
非常感谢你们!
这里是我得到的一张“照片”的样本。它实际上是一个txt文件,因为里面的所有内容都是0和1s
000000000000000000000000000000100000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000010000100000000000000000000000000000000000000000100001000000000000000000000000000000000000000001000010000000000000000000000000000000000000000010000100000000000000000000000000000000000000000100001000000000000000000000000000000000000000001000010000000000000000000000000000000000000000100100000000000000000000000000000000000000000100100000000000000000000000000000000000000000100100000000000000000000000000000000000000000100100000000000000000000000000000000000000000100100000000000000000000000000000000000000001000000000000000000000000000000000000000001000000000000000000000000000000000000000001000000000000000000
编辑:
我实现了这个主意。基本上,这是一个为您提供直线起点和终点的功能。然后“删除它”,以便您可以再次运行它并找到下一行。# 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)