如何识别和存储网格中点的中心位置?

How to identify and store center locations of dots in grid?

好的,为此我正在寻找关于下一步应该做什么以及如何实施我目前正在进行的步骤的建议。

首先是上下文: 我正在从事一个项目,该项目涉及找到已放入网格中的圆心。原始图像为 1260x683px,图像内部的网格中有 27x15 个点。图像存储为文本文件。在文本文件中,0 表示不属于任何点的像素,1 表示属于点的像素。

我想找出一种方法来识别每个点的中心坐标。下面我做了几个图来展示我想做的事情。

值得注意的是,如果有偶数个 1 的行,我想确定两个中心值中正确的一个(图 0a。),如果有偶数个 1,我想确定列想将底部的那个作为中心(图 0b.)

图 0a.
0001111000
..........^.......

图 0b.
0
0
0
1
1
1 <--
1
0
0
0

图 1.
00011111100000000111111000...
00111111110000001111111100...
01111111111000011111111110...
01111111111000011111111110...
01111111111000011111111110...
01111111111000011111111110...
01111111111000011111111110...
01111111111000011111111110...
00111111110000001111111100...
00011111100000000111111000...

图 2.
00011111100000000111111000...
00111111110000001111111100...
01111111111000011111111110...
01111111111000011111111110...
01111111111000011111111110...
01111111111000011111111110...
01111111111000011111111110...
01111111111000011111111110...
00111111110000001111111100...
00011111100000000111111000...

图 3.
00011111100000000111111000...
00111111110000001111111100...
01111111111000011111111110...
01111111111000011111111110...
01111111111000011111111110...
01111111111000011111111110。 ..
01111111111000011111111110...
01111111111000011111111110...
00111111110000001111111100...
00011111100000000111111000...

图 4.
00011111100000000111111000...
00111111110000001111111100...
01111111111000011111111110...
01111111111000011111111110...
01111111111000011111111110...
01111111111000011111111110...
01111111111000011111111110...
01111111111000011111111110...
00111111110000001111111100...
00011111100000000111111000...

总的来说,我需要找到一种方法来确定 27x15 网格中每个点的中心,然后将这些中心的坐标存储到单独的数组中。我希望这是有道理的,但我很乐意回答任何问题以说明我的意思。

我走了另一条路,通过对像素值求和并重新归一化来对图像进行卷积,直到图片不发生变化。我的大胆假设是,您剩下的候选中心点是:

from numpy import array, max, where

img = """00011111100000000111111000
00111111110000001111111100
01111111111000011111111110
01111111111000011111111110
01111111111000011111111110
01111111111000011111111110
01111111111000011111111110
01111111111000011111111110
00111111110000001111111100
00011111100000000111111000"""

img = array([[int(i) for i in row] for row in img.split("\n")], int)

print(img)
print()

def convolute(img):
    s_x, s_y = img.shape
    result = array(img)
    for dx in (-1, 0, 1):
        for dy in (-1, 0, 1):
            result[1:s_x - 2, 1:s_y - 2] += img[1 + dx: s_x - 2 + dx,
                                                1 + dy: s_y - 2 + dy]

    # focus on the centers
    result[result<max(result)] = 0
    result[result > 0] = 1
    return result
    
while True:
    img2 = convolute(img)
    if (img2 == img).all():
        break
    img = img2
    print(img)
    print()
    
indices = where(img)
for x, y in zip(indices[0], indices[1]):
    print(x, y)

在这种情况下,您将得到一个坐标列表:

4 5
4 6
4 19
4 20
5 5
5 6
5 19
5 20

前四位为左点,后四位为右点。

编辑:假设只剩下最大 2x2 的点,现在应该可以了:

# now filter out all but bottom right corners
img[:-1,:-1] &= 1 - (img[1:,:-1] | img[:-1, 1:])

一个像素只有在底部或右邻点不亮时才会存在。