Разрешение и битность: сколько информации в картинке

Разрешение задаёт, сколько у нас пикселей, а битность — сколько оттенков может принять каждый.

Разрешение — число пикселей по ширине и высоте (например, 1920×1080). Битовая глубина — сколько бит отведено на один пиксель/канал, то есть сколько разных значений он может принять.

Разрешение

Разрешение — это размер сетки пикселей. Чем больше пикселей, тем больше деталей и тем тяжелее картинка. Фото 4000×3000 (12 мегапикселей) содержит 12 миллионов пикселей. Для нейросетей это проблема: чем больше вход, тем больше вычислений. Поэтому перед подачей в сеть картинки почти всегда уменьшают — типичные размеры 224×224 или 256×256.

Важно различать разрешение картинки и плотность пикселей экрана (DPI/PPI): для CV значимо именно число пикселей, а не физический размер.

Битовая глубина

Один байт на канал (8 бит) даёт 2**8 = 256 значений: 0..255. Этого хватает для большинства фото. Но в специальных областях нужно больше оттенков:

Битность каналаГрадацийГде
1 бит2 (чёрный/белый)факсы, штрихкоды, маски
8 бит256обычные фото, JPEG/PNG
10–12 бит1024–4096RAW с камеры, HDR
16 бит65536медицина (КТ), научные снимки

Посчитаем число градаций для разной битности — это просто степени двойки:

for bits in [1, 2, 8, 10, 16]:
    levels = 2 ** bits
    print(f"{bits:2} бит -> {levels} градаций")

Вывод:

 1 бит -> 2 градаций
 2 бит -> 4 градаций
 8 бит -> 256 градаций
10 бит -> 1024 градаций
16 бит -> 65536 градаций

Почему битность важна

Если оттенков мало, плавные переходы (небо, тени) рассыпаются на видимые «ступеньки» — это называют постеризацией (banding). А вот в медицине 12–16 бит критичны: КТ-снимок различает тысячи уровней плотности тканей, и сжатие до 256 уровней потеряло бы важные нюансы между нормой и патологией.

Сколько весит несжатая картинка

Оценим «сырой» объём (без сжатия): пиксели × каналы × байт на канал.

width, height = 1920, 1080
channels = 3          # RGB
bytes_per_channel = 1 # 8 бит

raw_bytes = width * height * channels * bytes_per_channel
print("Пикселей:", width * height)
print("Байт (сырых):", raw_bytes)
print("Мегабайт:", round(raw_bytes / 1024 / 1024, 2))

Вывод:

Пикселей: 2073600
Байт (сырых): 6220800
Мегабайт: 5.93

Почти 6 МБ на один Full HD кадр без сжатия! Поэтому форматы вроде JPEG так важны: они ужимают это в десятки раз, жертвуя незаметными деталями.

Итог

  • Разрешение — число пикселей; для CV картинки обычно уменьшают (224×224 и т.п.).
  • Битность — число градаций на канал: 2**bits.
  • 8 бит хватает для фото, но медицина и HDR требуют 12–16 бит.
  • Мало оттенков → постеризация (видимые ступеньки на плавных переходах).
Проверьте себя
1. Сколько оттенков серого даёт 8-битный канал?
A8
B128
C256
D65536
2. Почему перед подачей в нейросеть картинки обычно уменьшают до 224×224?
AИначе их нельзя классифицировать
BЧем больше пикселей на входе, тем больше вычислений — уменьшение экономит ресурсы
CСеть работает только с квадратными картинками
DТак требует формат JPEG
3. Что такое постеризация (banding)?
AСжатие картинки в JPEG
BПоявление видимых «ступенек» на плавных переходах из-за нехватки градаций
CПоворот изображения на 90 градусов
DПеревод цвета в серый
Поддержать проект