1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7

# теория · шаг 1 из 7

Качество изображения: ошибки, цвет и уменьшение цветности

Коротко

Изображение - массив пикселов, но одинаковая числовая ошибка может быть по-разному заметна на лице, тексте и шумной текстуре. Поэтому сравнивай размер, искажение и время обработки при одинаковых входных данных. У серого пиксела один отсчёт, у RGB три компоненты. Переход к яркости и цветности позволяет уменьшить пространственное разрешение цветности. Это уже необратимый шаг. Метрики MSE, максимальная ошибка и PSNR помогают измерять результат, но не заменяют проверку нужного содержания и требований приложения.

Если посчитаешь MSE и размер плоскостей 4:2:0, а также объяснишь, почему одинаковой MSE мало для выбора кодировщика, переходи к «Теперь сам».

Как думаешь, одинаковая ошибка означает одинаковую картинку

На фотографии испортили шестнадцать пикселов: каждый сдвинули на 4 уровня яркости. В другом варианте изменили только один пиксел на 16 уровней. Сумма квадратов ошибок в обоих случаях 256. Средняя квадратичная ошибка тоже одинакова: 16. Но расположение пятна, наличие края и смысл детали в этот подсчёт не входят.

Для архива сканов важна различимость букв. Для предпросмотра важнее быстро узнать сюжет, а для точного измерения по снимку может потребоваться полное сохранение отсчётов. Один список «красивых коэффициентов сжатия» не сравнивает эти задачи. Сначала определи, что именно разрешено изменить и какое время восстановления допустимо.

На что это похоже

Уменьшая бумажную карту, можно сохранить крупные дороги и потерять подписи переулков. Если карта нужна для обзора страны, потеря приемлема. Если нужно найти вход в дом, те же искажения делают её бесполезной. Число затронутых точек не описывает назначение.

Так же различаются классы изображений. Фотография часто содержит плавные переходы, чертёж - резкие контуры и плоские области, палитровая картинка хранит индексы цветов. Числовая разность двух индексов палитры не обязана соответствовать близости цветов: перед измерением искажения нужно интерпретировать индекс через ту же палитру.

Механизм: что именно измеряется

Пусть исходные серые отсчёты xᵢ, восстановленные yᵢ, всего N отсчётов. MSE, средняя квадратичная ошибка, равна Σ(xᵢ−yᵢ)²/N. Квадрат не даёт противоположным ошибкам уничтожиться и сильнее штрафует большие отклонения. Корень из MSE называют RMSE. Максимальная ошибка max|xᵢ−yᵢ| отвечает на другой вопрос: насколько сильно мог испортиться один отсчёт.

PSNR нормирует MSE на максимальный возможный уровень: 10·log₁₀(MAX²/MSE). Для восьмибитных отсчётов MAX=255. Логарифм по основанию 10 переводит отношение мощностей в децибелы; увеличение PSNR означает меньшую MSE при той же шкале MAX. При MSE=0 отношение бесконечно, поэтому точное совпадение условно имеет PSNR=∞. Сравнивать значения с разной разрядностью или разным определением цветовых компонент нельзя.

Битрейт изображения удобно выражать числом битов на пиксел, включая выбранные служебные данные. Коэффициент сжатия - отношение несжатого объёма к полученному. Указывай, что входит в оба объёма: заголовок, палитра и метаданные способны изменить результат на маленькой картинке сильнее, чем работа энтропийного кодера.

Правило

Задай класс изображения и допустимую ошибку, затем сравнивай размер и качество при одинаковой шкале отсчётов. Различай обратимую смену представления, ошибки округления и намеренное удаление данных. Значения MSE и PSNR не гарантируют зрительной эквивалентности, а слово «качество» без определения не задаёт числового контракта.

Для времени отдельно измеряют кодирование и декодирование. У фрактального метода долгий поиск при кодировании и итеративное восстановление, у блочного преобразования другое распределение работы. Приложение, которое сжимает один раз и показывает много раз, может выбрать иной компромисс, чем двусторонняя видеосвязь с ограничением задержки.

Разбор: одна MSE, разные распределения ошибок

image_quality.py
from math import log10


def metrics(original, restored):
    errors = [a - b for a, b in zip(original, restored)]
    mse = sum(e * e for e in errors) / len(errors)
    maximum = max(abs(e) for e in errors)
    psnr = float("inf") if mse == 0 else 10 * log10(255 ** 2 / mse)
    return mse, maximum, psnr


original = [100] * 16
spread = [104] * 16
local = [116] + [100] * 15
for name, picture in [("распределённая", spread), ("локальная", local)]:
    mse, maximum, psnr = metrics(original, picture)
    print(name, "MSE", mse, "максимум", maximum,
          "PSNR", f"{psnr:.2f}")
width = height = 8
y = width * height
chroma = (width // 2) * (height // 2)
print("отсчётов 4:4:4:", 3 * y)
print("отсчётов 4:2:0:", y + 2 * chroma)

r, g, b = 100, 50, 20
y = 0.299 * r + 0.587 * g + 0.114 * b
cb = 128 - 0.168736 * r - 0.331264 * g + 0.5 * b
cr = 128 + 0.5 * r - 0.418688 * g - 0.081312 * b
back = [y + 1.402 * (cr - 128),
        y - 0.344136 * (cb - 128) - 0.714136 * (cr - 128),
        y + 1.772 * (cb - 128)]
print("Y,Cb,Cr:", [round(v, 3) for v in [y, cb, cr]])
print("RGB обратно:", [round(v, 3) for v in back])
assert max(abs(a - b) for a, b in zip(back, [r, g, b])) < 0.001
↳  выводpython3 image_quality.py
распределённая MSE 16.0 максимум 4 PSNR 36.09
локальная MSE 16.0 максимум 16 PSNR 36.09
отсчётов 4:4:4: 192
отсчётов 4:2:0: 96
Y,Cb,Cr: [61.53, 104.563, 155.439]
RGB обратно: [100.0, 50.0, 20.0]

В первом случае все ошибки равны 4, во втором максимум 16. MSE и PSNR совпали, максимальная ошибка различилась. Даже набор этих трёх чисел не описывает расположение ошибок: перестановка пикселов сохраняет все три метрики, но может перенести пятно с фона на букву. Поэтому для проверки приложения нужны и типовые изображения, и конкретные требования к содержанию, например сохранность мелкого текста.

Время, память и совместимость тоже измеряются отдельно. Если декодер не поддерживает нужный режим, хороший показатель сжатия сам по себе не сделает файл пригодным. При сравнении фиксируют разрешение, цветовое пространство, разрядность и параметры, а не только названия расширений файлов.

Разбор: что означает 4:2:0

Из RGB можно вычислить яркостную компоненту Y и две компоненты цветности Cb,Cr. Например, приближённая яркость Y=0,299R+0,587G+0,114B сильнее учитывает зелёный. Остальные компоненты описывают отклонение синего и красного от яркости. Это не три названия одной величины. В математической модели с точными вещественными операциями линейное преобразование обратимо; конечная точность требует отдельного учёта.

Для приближённой полнодиапазонной восьмибитной модели используем Cb=128−0,168736R−0,331264G+0,5B, Cr=128+0,5R−0,418688G−0,081312B. Здесь Y - яркостная компонента кодированного цвета, не точная физическая яркость. Обратно: R=Y+1,402(Cr−128), G=Y−0,344136(Cb−128)−0,714136(Cr−128), B=Y+1,772(Cb−128). Коэффициенты приближённые; для точной реализации формат задаёт нужную договорённость и округление. В программе RGB [100,50,20] даёт примерно [61,53;104,563;155,439], а обратный расчёт возвращает исходные значения с учётом точности показанных коэффициентов.

В учебном варианте 4:2:0 для каждого квадрата 2×2 сохраняем четыре значения Y, но только по одному Cb и Cr, полученному усреднением. Для изображения 8×8 получаем 64+16+16=96 восьмибитных отсчётов вместо 192. Потеряны три четверти отсчётов каждой цветовой плоскости, а не три четверти всей картинки. При восстановлении недостающую цветность интерполируют, но исходные четыре значения из одного среднего однозначно не вернуть. Реальные расположения цветовых отсчётов и фильтры зависят от формата; здесь явно выбран простой усредняющий вариант.

Что ломается без этого

Настройку «качество 100» принимают за доказательство отсутствия потерь. Но дискретизация цветности могла уже объединить разные отсчёты, а последующее округление тоже может изменить данные. Название настройки не восстанавливает информацию.

Другая ошибка - выбирать фотографии для проверки алгоритма, предназначенного для двухцветного текста, а затем переносить результат на любой класс данных. Шум, крупные одноцветные области и частая шахматная структура имеют разную избыточность. Набор тестовых изображений должен соответствовать ожидаемой работе.

Зачем это в работе

Ты готовишь хранилище фотографий и сканов. Для предпросмотра разрешено уменьшение цветности, для распознавания мелких символов его нужно отдельно проверить, а оригиналы измерений нельзя заменять визуально похожими версиями. Таблица «байты, метрика, время» позволяет увидеть цену каждого режима, а просмотр ошибок в нужных областях объясняет ограничения метрики.

Теперь сам

Четыре серых отсчёта [10,20,30,40] восстановлены как [12,18,34,36]. Найди MSE и максимальную ошибку. Затем посчитай число восьмибитных отсчётов 4:2:0 для картинки 16×16 без заголовков.

Ответ. Квадраты ошибок 4,4,16,16, значит MSE=40/4=10, максимум 4. Плоскость Y содержит 256 отсчётов, Cb и Cr по 64: всего 384 байта. Это объём после выбранной дискретизации, ещё до кодирования коэффициентов.

Главное

Числовая ошибка, заметность и стоимость хранения - разные измерения одного решения. Явно задай шкалу и допустимую потерю, прежде чем сравнивать кодировщики или трактовать название настройки качества как обещание точности.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.