Конвертация изображения в код

Здраствуйте ,пишу программу для конвертации 3d моделей в код для постройки mc (библиотека майнкрафта основанная на python).Для удобства разбиваю 3d модель в изображение

Пример изображение

Всё что белое нужно переводить в код , черное пропускается . Т.к. это 3d модель таких изображений может быть от 10 до 150 штук +- (количество уровней)

В чем заключается проблема: Мне нужно найти оптимальный способ строить через библиотеку mc .Там есть прекрасная функция setCuboid , функция принимает 6 параметров (7 , но в данном случае он не важен) x,y,z и x1,y1,z1 . x,y,z начальные координаты , x1,y1,z1 конечные .

Строительство по слайсам ,занимает очень много времени . Как я это делал брал точку (1) и искал ей конец вдоль какой либо координаты (2), заполнял ,получалось что-то вроде этого setCuboid(0,0,0,10,0,0). Но это достаточно медленный процесс, особенно когда таких "слайсов" около 150 штук.

Пример поиска координат

СУТЬ Нужно построить за минимальное время . Для этого я сохранял всё изображения в массив[номер_изображения(он же "y")][x][z]. После пробовал найти быстрый способ через перебор, как это работает у меня. if allpoints[y][x][z] == "1": программа находит пиксель белого цвета,далее добавляет значение 1 к каждой координате и если они тоже белые добавляет ещё и т.д.

for plus in range(300):

`if allpoint[y+plus][x+plus][y+plus] == "1":`

eсли значение равно 0 программа сохраняет в файл такой вывод: setCuboid(x,y,z,x+plus,y+plus,z+plus)

но даже если строить таким способом одиночные пиксели увеличивают количество строк или вовсе пропускают блоки(пиксели)


Ответы (1 шт):

Автор решения: strawdog

Используйте библиотеки PIL и numpy:

from PIL import Image
import numpy as np

img = Image.open("WGadg.png") # имя вашего файла со слайсом
img.load()
slc = np.asarray(img.convert('1'), dtype="int32" )

теперь у вас в slc двумерный массив numpy со значением 0, если точка черная (пустая) и 1, если точка белая. соответственно, к каждой точке можно обратиться по индексу:

print(slc[0][0])
print(slc[10][10])
0
1
→ Ссылка