使用 Python 将黑白图像转换为列表列表 ( 0, 1)

Converting a black and white image to List of Lists ( 0, 1) using Python

我正在创建一个使用 Python 中的 Turtle 模块来解决迷宫的程序,为了绘制它,我使用列表的列表来通过列表 [y][x] 表示列及其空间。将这样的图像 1 转换为具有二进制值的列表列表的最佳方法是什么。

您可以使用 Pillow 遍历图像的像素来检查它们是黑色还是白色。您不需要检查所有这些,为了优化流程,您可以为每个块检查一个像素并跳过其余部分,这样,而不是检查 159.201 个像素(399 x 399,图像的大小),你只检查 441 像素(21 x 21,块数)

这里有一个如何阅读迷宫的例子:

from PIL import Image

BLOCK_SIZE = 19

im = Image.open('maze.jpg')
pixels = im.load()
width, height = im.size
offset = int(BLOCK_SIZE / 2)

maze = [
  [
    int(pixels[x + offset, y + offset][0] < 125)
    for y in range(0, height, BLOCK_SIZE)
  ]
  for x in range(0, width, BLOCK_SIZE)
]

如果在处理后打印 maze 的内容:

for y in range(height / BLOCK_SIZE):
  for x in range(width / BLOCK_SIZE):
    print(maze[x][y]),
  print('')

这是你得到的:

1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1
1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1
1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1
1 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1
1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 1 1 0 1
1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 1
1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1
1 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 1
1 0 1 0 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1
1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1
1 0 1 0 1 0 1 1 1 0 1 0 1 1 1 1 1 0 1 0 1
1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1
1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1
1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1
1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1
1 0 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1
1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

关于代码的几点说明:

int(pixels[x + offset, y + offset][0] < 125)

这从块 (x, y) 中提取一个像素 (pixels[x + offset, y + offset]) 并从中提取 RGB 颜色的第一个通道,因为它可以是黑色或白色,所有 3 个通道都应该具有相同的值(例如:(0, 0, 0) 代表黑色或 (255, 255, 255) 代表白色),但图像并不完美,有些颜色实际上是灰色的,这就是为什么我不检查特定值,而是使用 < 125 将黑色块与白色块分开。

offset的目的是获取每个块中心的像素,这很有用,因为图像并不完美,块边界上的像素不太可靠