Вы можете использовать Подушка , чтобы просмотреть пиксели изображения и проверить, являются ли они черными или белыми. Вам не нужно проверять все из них, чтобы оптимизировать процесс, вы можете проверить один пиксель для каждого блока и пропустить остальные, таким образом, вместо проверки 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)
Это берет пиксель (pixels[x + offset, y + offset]
) из блока (x, y) и из него извлекает первый канал цвета RGB, так как он может быть либо черным, либо белым,все 3 канала должны иметь одинаковое значение (например: (0, 0, 0)
для черного или (255, 255, 255)
для белого), но изображение не идеальное, некоторые цвета на самом деле серые, поэтому вместо проверки конкретного значения я использовал< 125
для отделения черных блоков от белых.
Цель offset
- взятьпиксель в центре каждого блока, это полезно, потому что, опять же, изображение не является идеальным, и пиксели на границе блока менее надежны