# теория · шаг 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, разные распределения ошибок
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
распределённая 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 байта. Это объём после выбранной дискретизации, ещё до кодирования коэффициентов.
Главное
Числовая ошибка, заметность и стоимость хранения - разные измерения одного решения. Явно задай шкалу и допустимую потерю, прежде чем сравнивать кодировщики или трактовать название настройки качества как обещание точности.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий