使用 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
的目的是获取每个块中心的像素,这很有用,因为图像并不完美,块边界上的像素不太可靠
我正在创建一个使用 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
的目的是获取每个块中心的像素,这很有用,因为图像并不完美,块边界上的像素不太可靠