Пиксели и каналы: картинка как числа

Урок объясняет, в каком виде нейросеть получает изображение — это всегда массив чисел.

Пиксель — наименьшая точка изображения; её цвет задаётся числами яркости по нескольким каналам (обычно красный, зелёный, синий).

Картинка — это таблица чисел

Для человека картинка — это образ. Для компьютера — прямоугольная сетка пикселей. Чёрно-белое изображение 512×512 — это таблица из 512 строк и 512 столбцов, где каждое число от 0 (чёрный) до 255 (белый) задаёт яркость точки.

Цветное изображение хранит три такие таблицы — по одной на каналы R (red), G (green), B (blue). Цвет пикселя — это смесь трёх яркостей. Итого картинка 512×512 в цвете — это 512 × 512 × 3 ≈ 786 тысяч чисел.

w, h, channels = 512, 512, 3
total = w * h * channels
print("Чисел в картинке:", total)
print("Это примерно", round(total / 1000), "тысяч значений")

Вывод:

Чисел в картинке: 786432
Это примерно 786 тысяч значений

Диапазон значений

Обычно яркость хранят как целое 0–255 (один байт на канал). Перед подачей в нейросеть числа часто нормализуют — приводят к диапазону 0..1 или -1..1, чтобы сети было удобнее считать. Это та же картинка, просто в другом масштабе чисел.

pixel = [200, 128, 64]  # яркости R, G, B
normalized = [round(v / 255, 3) for v in pixel]
print("Было:", pixel)
print("Стало (0..1):", normalized)

Вывод:

Было: [200, 128, 64]
Стало (0..1): [0.784, 0.502, 0.251]

Как работает под капотом

В коде такую сетку чисел называют тензором — многомерным массивом. Для картинки это тензор формы (высота, ширина, каналы) или, в порядке многих библиотек, (каналы, высота, ширина). Нейросеть никогда не «видит» картинку — она перемножает и складывает эти числа. Всё, что вы изучали в «Компьютерном зрении» про свёртки, тоже работает именно с этими тензорами.

Частые ошибки

  • Путать разрешение и «качество». 512×512 — это размер сетки, а не резкость. Картинка может быть большой, но мутной.
  • Забыть про нормализацию. Если подать сети значения 0–255 там, где она ждёт 0–1, результат будет мусором.
  • Считать, что у изображения всегда 3 канала. Бывает 1 канал (серое), 4 канала (с прозрачностью, RGBA).

Разрешение и вес картинки

Число пикселей растёт как квадрат размера стороны: картинка 1024×1024 содержит вчетверо больше точек, чем 512×512, а не вдвое. Это прямо влияет на стоимость генерации — большие картинки требуют больше памяти и времени на каждом шаге диффузии. Поэтому почти всегда генерируют в умеренном «родном» размере модели, а увеличивают результат отдельным инструментом-апскейлером уже после.

for side in [256, 512, 1024]:
    px = side * side
    print(f"{side}x{side}: {px} пикселей")

Вывод:

256x256: 65536 пикселей
512x512: 262144 пикселей
1024x1024: 1048576 пикселей

Виден квадратичный рост: переход с 512 на 1024 учетверяет число точек. Эту арифметику стоит держать в голове, выбирая размер генерации.

Итог

  • Изображение для компьютера — это тензор чисел (высота × ширина × каналы).
  • Цвет задаётся яркостями каналов R, G, B, обычно 0–255.
  • Перед нейросетью числа нормализуют в удобный диапазон (0..1 или -1..1).
Проверьте себя
1. Сколько чисел хранит цветная картинка 512×512 в формате RGB?
A512
B262144
C786432
D3
2. Зачем перед подачей в нейросеть пиксели нормализуют в диапазон 0..1?
AЧтобы уменьшить размер файла
BЧтобы сети было удобнее и стабильнее считать
CЧтобы убрать цвет
DЭто обязательное требование формата JPEG