Преобразование черно-белого изображения в список списков (0, 1) с использованием Python - PullRequest
0 голосов
/ 21 октября 2019

Я создаю программу, которая решает лабиринты, используя модуль Turtle в Python, чтобы нарисовать его, я использую списки списков, чтобы представлять столбцы и их пробелы через List [y] [x]. Каков был бы оптимальный способ преобразовать изображение, подобное этому 1 , в список списков с двоичными значениями.

1 Ответ

1 голос
/ 21 октября 2019

Вы можете использовать Подушка , чтобы просмотреть пиксели изображения и проверить, являются ли они черными или белыми. Вам не нужно проверять все из них, чтобы оптимизировать процесс, вы можете проверить один пиксель для каждого блока и пропустить остальные, таким образом, вместо проверки 159.201 пикселей (399 x 399, размер изображения),Вы проверяете только 441 пиксель (21 x 21, количество блоков)

enter image description here

Вот пример того, как вы можете читать лабиринт:

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 - взятьпиксель в центре каждого блока, это полезно, потому что, опять же, изображение не является идеальным, и пиксели на границе блока менее надежны

...