from PIL import Image
import numpy as np
from collections import Counter
===== ПАРАМЕТРЫ =====
IMAGE_PATH = “IMG_8874.jpeg” # имя файла с твоей постройкой
PIXELS_PER_BLOCK = 8 # размер одного блока в пикселях
===== СРЕДНИЕ ЦВЕТА СТАНДАРТНЫХ БЛОКОВ =====
MINECRAFT_BLOCKS = {
“Камень”: (125, 125, 125),
“Булыжник”: (121, 121, 121),
“Гладкий камень”: (161, 161, 161),
“Каменные кирпичи”: (142, 142, 142),
“Обсидиан”: (19, 18, 43),
“Гравий”: (136, 126, 126),
“Глина”: (158, 164, 176),
“Песок”: (219, 211, 160),
“Красный песок”: (169, 88, 33),
“Земля”: (134, 96, 67),
“Подзол”: (122, 85, 53),
“Дубовые доски”: (162, 131, 79),
“Берёзовые доски”: (193, 175, 122),
“Еловые доски”: (114, 85, 50),
“Тропические доски”: (154, 110, 77),
“Акациевые доски”: (174, 92, 57),
“Тёмный дуб”: (72, 57, 38),
“Кирпичи”: (152, 85, 67),
“Адский кирпич”: (44, 22, 26),
“Кварцевый блок”: (236, 233, 226),
“Бетон белый”: (207, 213, 214),
“Бетон чёрный”: (8, 10, 15),
“Бетон красный”: (142, 33, 33),
“Бетон синий”: (45, 47, 142),
“Бетон жёлтый”: (241, 175, 21),
“Бетон зелёный”: (73, 91, 36),
“Бетон розовый”: (213, 101, 142),
“Бетон фиолетовый”: (100, 31, 156),
“Шерсть белая”: (234, 236, 237),
“Шерсть чёрная”: (22, 22, 26),
“Шерсть красная”: (161, 39, 34),
“Шерсть синяя”: (44, 46, 143),
“Шерсть жёлтая”: (249, 198, 40),
“Шерсть зелёная”: (85, 110, 28),
“Шерсть розовая”: (232, 131, 150),
“Шерсть фиолетовая”: (114, 47, 156),
“Угольная руда”: (115, 115, 115),
“Железная руда”: (136, 130, 127),
“Золотая руда”: (145, 140, 123),
“Алмазная руда”: (129, 140, 151),
“Изумрудная руда”: (121, 144, 114),
“Лазуритовая руда”: (106, 117, 143),
“Редстоуновая руда”: (153, 104, 97)
}
===== ФУНКЦИИ =====
def color_distance(c1, c2):
return sum((a - b) ** 2 for a, b in zip(c1, c2))
def closest_block(color):
return min(MINECRAFT_BLOCKS, key=lambda block: color_distance(color, MINECRAFT_BLOCKS[block]))
Загружаем картинку
image = Image.open(IMAGE_PATH).convert(“RGB”)
arr = np.array(image)
h, w, _ = arr.shape
Режем на блоки и определяем цвета
block_colors =
for y in range(0, h - PIXELS_PER_BLOCK + 1, PIXELS_PER_BLOCK):
for x in range(0, w - PIXELS_PER_BLOCK + 1, PIXELS_PER_BLOCK):
block = arr[y:y+PIXELS_PER_BLOCK, x:x+PIXELS_PER_BLOCK]
avg_color = tuple(np.mean(block.reshape(-1, 3), axis=0).astype(int))
block_colors.append(closest_block(avg_color))
Считаем только реально встречающиеся блоки
counts = Counter(block_colors)
print(“Блоки, найденные в постройке (по убыванию количества):”)
for block, count in counts.most_common():
print(f"{block}: {count}")