Содержание статьи +
- Кратко
- Почему это важно
- Что SSIM на самом деле измеряет
- Три сравнения: яркость, контраст, структура
- Разобранный пример: смотрим, как три члена складываются
- От одного окна к одному числу: карта SSIM и среднее SSIM
- Чтение оценки SSIM: шкала 0–1 и форма в дБ
- Почему SSIM лучше PSNR
- Как вычислить SSIM с помощью FFmpeg
- Где SSIM всё ещё врёт
- MS-SSIM в одном абзаце
- PSNR против SSIM против VMAF: когда что брать
- Частые ошибки с SSIM
- Где здесь Фора Софт
- Ключевые выводы
- Что почитать дальше
Кратко
Structural Similarity Index, почти всегда записываемое как SSIM, – это full-reference-метрика качества, которая задаёт более умный вопрос, чем пиксельная ошибка: не «сколько значений пикселей изменилось?», а «уцелела ли структура картинки?». Она сравнивает искажённый кадр с оригиналом по трём вещам, которые на самом деле важны глазу, – яркости, контрасту и структуре, – перемножает их в одно число от 0 до 1 и выдаёт 1 только тогда, когда кадры идентичны. Поскольку человеческое зрение создано читать структуру, SSIM отслеживает воспринимаемое качество гораздо лучше, чем PSNR, – именно поэтому оно стало второй метрикой, которую учит каждый инженер. Эта статья показывает три сравнения и их математику, проговаривает разобранный пример вслух, объясняет, как покадровая оценка становится одним числом, и точно называет, где SSIM всё ещё вводит вас в заблуждение.
Почему это важно
Если PSNR – первое число качества, которое вы встречаете, то SSIM – первое, что было построено под глаз. Оно встречается в выводе FFmpeg, в логах кодировщиков, в режимах --tune ssim, в академических таблицах и в каждом споре «PSNR против SSIM», который вы прочтёте, – обычно без объяснения, что оно измеряет и почему два инструмента выдают разные значения SSIM на одном клипе. Эта статья даёт такое объяснение: структурную идею за метрикой, математику, показанную один раз, ожидаемый диапазон оценок и контент, где SSIM врёт. Это мост между метриками пиксельной ошибки и обученными на восприятии метриками, которые идут следом, прежде всего VMAF.
Что SSIM на самом деле измеряет
Начнём с идеи, которая делает SSIM другим, потому что из неё следует всё остальное. PSNR измеряет ошибку: насколько каждый пиксель отклонился от оригинала, суммарно. SSIM измеряет структуру: уцелели ли узоры картинки – края, текстуры, отношения между соседними пикселями.
Разница важна из-за того, как работает зрение. Ваш глаз эволюционировал не считать пиксельные ошибки, а извлекать структуру из сцены – находить край тигра на фоне травы. Авторы SSIM встроили эту идею прямо в метрику: исходя из того, что зрение сильно адаптировано к чтению структурной информации, они предложили измерять качество как деградацию структуры, а не как видимость ошибок (Wang, Bovik, Sheikh и Simoncelli, IEEE Transactions on Image Processing, 2004).
Вот аналогия, которую стоит унести. Если PSNR – это проверка орфографии, считающая неверные буквы, то SSIM читает форму написанного. У документа с десятью опечатками, разбросанными в сносках, и у документа с десятью опечатками, искажающими заголовок, одинаковое число ошибок, но читается по-прежнему только один. SSIM создан замечать разницу: он спрашивает, уцелел ли смысл – структура, – а не просто сколько символов изменилось.
Как и PSNR, SSIM нужен чистый оригинал для сравнения, кадр в кадр. Это делает его full-reference-метрикой – той, что оценивает искажённое видео против полного несжатого мастера. Если оригинала нет на диске, SSIM вообще нельзя вычислить – то же ограничение, что исключает full-reference-метрики для прямых трансляций и пользовательского контента (три схемы опоры разобраны в статье full-reference, reduced-reference, no-reference метрики).
Три сравнения: яркость, контраст, структура
SSIM не оценивает целый кадр сразу. Оно скользит небольшим окном по изображению – патчем 11×11 пикселей в оригинальной статье – и в каждой позиции сравнивает оригинальное окно x с искажённым окном y по трём отдельным вопросам. Каждый вопрос становится числом от 0 до 1, и три перемножаются.
Три сравнения используют лишь четыре простые статистики каждого окна: среднее (средняя яркость, обозначается μ), дисперсию (насколько пиксели разбросаны вокруг этого среднего, обозначается σ², где σ – стандартное отклонение) и ковариацию между двумя окнами (насколько они меняются вместе, обозначается σ_xy). Всё ниже построено из них.
Сравнение яркости – совпала ли яркость? Сравнивает среднюю яркость двух окон:
l(x,y) = ( 2·μx·μy + C1 ) / ( μx² + μy² + C1 )Возвращает 1, когда у окон одинаковая средняя яркость, и падает к 0 по мере их расхождения. C1 – маленькая константа, удерживающая формулу устойчивой, когда средние близки к нулю (о константах ниже).
Сравнение контраста – совпал ли диапазон света и тени? Сравнивает дисперсии – разброс значений пикселей, – поэтому ловит картинку, которая стала плоской и выцветшей или жёсткой и срезанной:
c(x,y) = ( 2·σx·σy + C2 ) / ( σx² + σy² + C2 )Возвращает 1, когда у обоих окон одинаковый контраст, и снижается, когда одно становится площе или жёстче другого.
Сравнение структуры – уцелел ли узор? Это сердце SSIM. После удаления яркости и контраста остаётся форма сигнала – узор света и тени относительно локального среднего. Структурный член измеряет, насколько эти узоры совпадают, используя ковариацию:
s(x,y) = ( σ_xy + C3 ) / ( σx·σy + C3 )По сути это корреляция между двумя окнами после вынесения яркости и контраста. Возвращает 1, когда узоры совпадают идеально, падает к 0 при их декорреляции и может стать отрицательной, когда структура инвертируется. Это член, который замечает блочность, ringing и размытие – искажения, перекраивающие структуру картинки, а не просто сдвигающие её яркость.
Объединённый индекс. Три сравнения перемножаются, каждое возведено в свой вес (α, β, γ), задающий его важность:
SSIM(x,y) = [ l(x,y) ]^α · [ c(x,y) ]^β · [ s(x,y) ]^γВ стандартной форме, которой все пользуются, все три веса равны 1, а при удобном выборе C3 = C2/2 всё сворачивается в одну компактную формулу:
( 2·μx·μy + C1 )( 2·σ_xy + C2 )
SSIM(x,y) = ----------------------------------------
( μx² + μy² + C1 )( σx² + σy² + C2 )Именно это выражение вы увидите в статьях и в инструментах. Но в голове стоит держать версию из трёх частей, потому что она говорит, какой именно урон сбил оценку: низкий член яркости означает сдвиг яркости, низкий член контраста – что картинка сплющилась, а низкий структурный член – что сломались сами узоры.
Константы и окно
Две детали превращают формулы выше в числа, которые реально печатает инструмент. Во-первых, стабилизирующие константы C1 и C2 существуют лишь для того, чтобы дроби не взрывались на почти плоском окне (средние или дисперсии близки к нулю). Они определены из диапазона пикселей L – 255 для 8-битного видео – и двух малых множителей по умолчанию, K1 = 0.01 и K2 = 0.03:
C1 = (K1·L)² = (0.01·255)² = 6.5025
C2 = (K2·L)² = (0.03·255)² = 58.5225
C3 = C2 / 2 = 29.26Во-вторых, окно. Оригинальная статья не использует жёсткий квадрат; она взвешивает каждое окно 11×11 круговым гауссианом (стандартное отклонение 1.5 пикселя), так что пиксели у центра считаются больше, – это убирает блочные артефакты в итоговой карте. Окно сдвигается на один пиксель за раз по всему изображению. Удержите факт: окно и константы – это выбор, а не законы природы; разные инструменты выбирают по-разному, и это источник самой частой ловушки SSIM, разобранной ниже.
Разобранный пример: смотрим, как три члена складываются
Числа делают это осязаемым. Возьмём одно окно оригинала и соответствующее окно сжатой версии и допустим, что мы измерили такие статистики:
- Оригинальное окно: среднее μx = 120, стандартное отклонение σx = 20 (дисперсия 400).
- Искажённое окно: среднее μy = 115, стандартное отклонение σy = 18 (дисперсия 324).
- Ковариация между ними: σ_xy = 330.
Подставим в три сравнения, используя C1 = 6.5025, C2 = 58.5225, C3 = 29.26:
яркость l = (2·120·115 + 6.5025) / (120² + 115² + 6.5025)
= 27606.5 / 27631.5 = 0.999
контраст c = (2·20·18 + 58.5225) / (400 + 324 + 58.5225)
= 778.5 / 782.5 = 0.995
структура s = (330 + 29.26) / (20·18 + 29.26)
= 359.26 / 389.26 = 0.923Перемножим:
SSIM = 0.999 · 0.995 · 0.923 = 0.917Прочтите, что говорит арифметика. Яркость почти не сдвинулась (0.999), контраст держится хорошо (0.995), но структурный член, 0.923, наносит весь урон – узоры в окне сместились достаточно, чтобы глаз заметил. Одно объединённое SSIM 0.917 не сказало бы почему окно выглядит хуже; разбивка на три члена прямо говорит, что это структурная проблема, а не яркостная. Эта диагностическая сила – тихое преимущество SSIM над одним числом пиксельной ошибки.
От одного окна к одному числу: карта SSIM и среднее SSIM
Окно даёт локальное SSIM в каждой позиции, а значит, метрика выдаёт не одно число – она выдаёт целую карту, по одному значению SSIM на позицию пикселя. Эта карта полезна сама по себе: светлая там, где структура уцелела, тёмная там, где сломалась, она показывает, где в кадре приземлился урон, чего одно дБ-число никогда не сможет.
Чтобы получить то самое одно число, карту усредняют. Среднее всех локальных значений SSIM – это среднее SSIM, часто записываемое как MSSIM, и именно его инструмент сообщает как «SSIM» кадра. Усреднение – это выбор пулинга, и, как любой выбор пулинга, оно может что-то прятать: кадр, безупречный везде, кроме одной сильно сломанной области, всё равно может выдать высокое среднее SSIM, потому что хорошие окна перевешивают плохое. Когда локальный артефакт важен, смотрите карту или низкий перцентиль, а не только среднее, – тот же урок, что относится к каждой метрике, разобран в статье пулинг: из покадровых оценок в одно число.
Чтение оценки SSIM: шкала 0–1 и форма в дБ
SSIM идёт от 0 до 1 для реального контента (математика допускает до −1 при инверсии структуры, но на обычном сжатии вы редко увидите отрицательные значения). Больше – лучше; 1 означает идентичность. Стоит знать грубые, зависящие от контента полосы: выше примерно 0.99 разница почти невидима большинству зрителей; 0.95–0.99 – нормальный диапазон хорошего сжатия стримингового уровня; 0.90–0.95 начинает показывать видимую деградацию при внимательном просмотре; ниже примерно 0.90 урон обычно очевиден. Относитесь к этому как к ориентиру, а не к закону – как выглядит данное SSIM, зависит от контента и условий просмотра, и правильно проведённый субъективный тест – единственная истина в последней инстанции.
Есть и вторая тонкость: поскольку качественный контент жмётся в узкую полосу у 1.0, малые различия SSIM наверху читать тяжело. Инструменты решают это децибельной формой, которая растягивает этот тесный верх:
SSIM (дБ) = 10 · log₁₀ ( 1 / (1 − SSIM) )FFmpeg печатает её рядом с линейной оценкой. Форму легко запомнить: каждая лишняя «девятка» добавляет 10 дБ. SSIM 0.9 – это 10 дБ, 0.99 – 20 дБ, 0.999 – 30 дБ. Наш разобранный пример 0.917 – это 10·log₁₀(1 / 0.083) = 10.8 дБ. Форма в дБ не добавляет информации; она лишь делает различия у потолка проще для чтения и сравнения.
Почему SSIM лучше PSNR
Теперь главное утверждение, сделанное точно. SSIM лучше PSNR в той единственной работе, что важна, – предсказании, насколько хорошо видео выглядит для человека, – по конкретной, структурной причине.
Вспомните слепую зону PSNR: оно суммирует пиксельную ошибку и понятия не имеет, где приземлилась ошибка и что она сделала с картинкой. Два искажения с одинаковой суммарной ошибкой получают одинаковое PSNR, даже если одно – невидимая дымка, а другое уродует лицо. SSIM закрывает этот разрыв, потому что его структурный член реагирует на то, какой урон случился, а не только сколько его. Размытие, блочность и ringing перекраивают локальную структуру, поэтому сильно роняют структурный член – ровно как реагирует глаз. Небольшой ровный сдвиг яркости почти не трогает структуру, поэтому SSIM его прощает – снова как глаз.
Выигрыш виден, когда оцениваешь каждую метрику против человеческого мнения. Каждая объективная метрика – это прокси, чья ценность измеряется тем, насколько хорошо она коррелирует с субъективными Mean Opinion Scores, по статистикам из ITU-T P.1401 (корреляция Пирсона, ранговая корреляция Спирмена, RMSE). В этом тесте SSIM стабильно обходит PSNR: на стандартных базах качества изображений SSIM отслеживает человеческие оценки ближе, чем PSNR, – это и есть вся причина, по которой его приняли. Честная оговорка: «ближе» зависит от базы, а новые обученные на восприятии метрики вроде VMAF в свою очередь обходят SSIM – прогрессия такова: PSNR измеряет ошибку, SSIM измеряет структуру, VMAF учится напрямую на человеческих оценках, каждая – лучший прокси, чем предыдущая. Как метрики валидируют против глаза – тема статьи как объективные метрики валидируют против человеческих оценок.
Как вычислить SSIM с помощью FFmpeg
Сами формулу вы будете писать почти никогда. Повседневный инструмент – FFmpeg, чей фильтр ssim принимает два входа (сначала искажённый клип, затем опорный) и печатает покомпонентное и общее SSIM плюс форму в дБ:
# SSIM между искажённым кодированием и его опорным мастером.
# Печатает SSIM Y, U, V, All и All в дБ в консоль.
ffmpeg -i distorted.mp4 -i reference.mp4 \
-lavfi ssim -f null -Чтобы сохранить значение на каждый кадр – полезно для поиска худших моментов, а не только среднего, – пишите файл статистики:
# Покадровое SSIM в ssim.log (n, Y, U, V, All, дБ).
ffmpeg -i distorted.mp4 -i reference.mp4 \
-lavfi "ssim=stats_file=ssim.log" -f null -Команда кодирует full-reference-контракт: без обоих файлов она не запустится. Если вам нужны PSNR, SSIM и VMAF за один проход, фильтр libvmaf может выдать все три – этот процесс с выбором модели и разбором вывода разобран в статье измерение качества с FFmpeg и libvmaf, а быстрый справочник со стороны кодировщика живёт в шпаргалке по FFmpeg раздела Video Encoding.
Чтобы математика стала осязаемой прямо на рабочем столе, мы собрали небольшой скрипт с минимумом зависимостей, который вычисляет SSIM между двумя файлами изображений или кадров с нуля – три сравнения, окно, карту SSIM и среднее, – печатая члены яркости, контраста и структуры, чтобы вы видели, как именно строится оценка. Скачайте SSIM-калькулятор «с нуля» (Python) и запустите его на своих кадрах.
Ловушка реализации: SSIM – не одно число
Вот ошибка, которая кусает команды чаще всего, и она следует прямо из того, что окно и константы – это выбор. Единого «SSIM» не существует – есть семейство реализаций, которые расходятся. Оригинальная статья использует гауссово окно 11×11, сдвигаемое на один пиксель. Фильтр FFmpeg, сделанный ради скорости на видео, использует окно 8×8 с шагом 4 пикселя. Другие библиотеки по умолчанию берут другие окна, другие константы, цветовые пространства и правила даунсэмплинга. Подайте те же два клипа двум реализациям – и получите два разных числа SSIM, иногда во втором знаке, иногда сильнее.
Практическое правило строгое: сравнение SSIM валидно лишь тогда, когда все числа получены одним инструментом, одной версией, одними настройками и по одной цветовой компоненте. Сравнить SSIM вашего кодирования из FFmpeg с SSIM другого кодирования из scikit-image – бессмысленно, та же дисциплина «яблоки к яблокам», которой требует PSNR. Когда приводите SSIM, называйте инструмент и версию – «FFmpeg 7.x фильтр ssim, luma», – а не просто «SSIM 0.98».
Где SSIM всё ещё врёт
SSIM – лучший перцептивный прокси, чем PSNR, но не идеальный. Назвать его слепые зоны – цена честного использования.
Во-первых, обычно оно вычисляется только по luma. Большинство конвейеров считают SSIM по каналу яркости и игнорируют цвет, так что артефакт только в chroma – растекание цвета, проблема субдискретизации chroma – может оставить приводимое вами SSIM почти нетронутым, хотя картинка явно выглядит неверно. Если вопрос в цвете, SSIM по luma его не поймает.
Во-вторых, оно пространственное и покадровое. Обычное SSIM оценивает каждый кадр по отдельности, поэтому слепо к временным проблемам – джиттеру, мерцанию, рывку в движении, – которые существуют лишь между кадрами. Видео, прекрасно набирающее кадр за кадром, всё равно может играть плохо.
В-третьих, оно насыщается у 1. Когда контент уже хорош, SSIM жмётся в тонкую полосу у 1.0, где малые различия трудно интерпретировать, – отчасти поэтому и существуют форма в дБ и обученные на восприятии метрики.
В-четвёртых, оно одношкальное. SSIM при одном размере окна предполагает одну дистанцию просмотра и разрешение экрана. Поменяйте их – и «правильная» шкала меняется. Решение – MS-SSIM, которое оценивает структуру на нескольких шкалах.
В-пятых, среднее прячет локальные сбои, как уже показала карта SSIM. И, как любую объективную метрику, SSIM можно обмануть: кодировщик, настроенный на максимизацию SSIM, может научиться угождать метрике способами, не угождающими глазу. Где каждая объективная метрика вводит в заблуждение, контент за контентом, каталогизировано в статье где врут объективные метрики.
MS-SSIM в одном абзаце
Поскольку обычное SSIM измеряет структуру на одной шкале, естественное расширение – измерять её на нескольких. MS-SSIM (многошкальное SSIM) прогоняет сравнения контраста и структуры по изображению, затем многократно низкочастотно фильтрует и уменьшает его – пять шкал в стандартной схеме – и комбинирует результаты по шкалам с фиксированными весами (0.0448, 0.2856, 0.3001, 0.2363, 0.1333), подобранными против человеческих суждений (Wang, Simoncelli и Bovik, 2003). Результат стабильнее к дистанции просмотра и разрешению экрана, чем одношкальное SSIM, и именно за ним тянется большинство современных конвейеров, когда хотят число на основе структуры. Полный разбор, включая когда MS-SSIM стоит дополнительной цены, – в статье MS-SSIM: многошкальное структурное сходство.
PSNR против SSIM против VMAF: когда что брать
SSIM – середина из трёх метрик, которые вы будете встречать постоянно. Быстрейший способ удержать их в голове – поставить рядом, со столбцами, которые реально важны: что каждая измеряет и где каждая врёт.
| Метрика | Шкала | Что измеряет | Где врёт (слепая зона) | Лучше всего для |
|---|---|---|---|---|
| PSNR | дБ (≈20–50, ∞ если идентично) | Средняя пиксельная ошибка vs оригинал | Игнорирует, где ошибки; одинаковая оценка для очень разных искажений | Сравнение на одном кодеке, RDO, ворота регрессии, проверки безпотерьности |
| SSIM | 0–1 (больше лучше) | Структурное сходство: яркость, контраст, структура | Только luma, покадрово, одношкально; зависит от реализации | Перцептивный прокси лучше PSNR; покадровая структура; карты качества |
| VMAF | 0–100 (больше лучше) | Слитое, обученное на восприятии качество (зависит от модели) | Бессмысленно без названной модели; обманывается резкостью | Предсказание воспринимаемого стримингового качества в масштабе |
Таблица 1. Три full-reference-метрики с одного взгляда. Всем нужен оригинал; они различаются тем, насколько близко подбираются к глазу и что пропускают. Выбирайте строку под задачу – и всегда называйте условия: инструмент и версию для SSIM, модель для VMAF.
Это глубокий разбор средней строки. Версия всех трёх «на один экран» для оператора кодировщика живёт в статье метрики качества раздела Video Encoding; если вы выбираете метрику под конкретную задачу, как выбрать правильную метрику – это гид по решению.
Частые ошибки с SSIM
«Ошибка: сравнивать SSIM между разными инструментами или реализациями. SSIM из FFmpeg (8×8, шаг 4) и SSIM из статьи (11×11 гаусс) – разные числа для одного клипа. Сравнивайте только SSIM, вычисленное одним инструментом, версией, настройками и компонентой. «SSIM 0.98» без названного инструмента неоднозначно.»
«Ошибка: доверять одному среднему SSIM. Высокое среднее может прятать одну сильно сломанную область, потому что хорошие окна перевешивают плохие. Когда локальный артефакт важен, читайте карту SSIM или низкий перцентиль, а не только среднее, – пулинг решает, что прячет одно число.»
«Ошибка: приводить luma-SSIM на цветовой проблеме. SSIM обычно считают только по яркости, так что артефакт chroma может оставить его почти неизменным. Если вопрос в цвете, SSIM по luma – не тот свидетель.»
«Ошибка: считать SSIM истиной в последней инстанции. SSIM – прокси, валидированный против человеческих оценок, а не сама истина. Когда SSIM и аккуратный субъективный тест расходятся, побеждает глаз, а метрика провалилась на этом контенте.»
Где здесь Фора Софт
Фора Софт делает видеософт с 2005 года – стриминг, WebRTC-конференции, OTT, e-learning, телемедицину и видеонаблюдение – и SSIM – метрика, к которой мы тянемся, когда подсчёта пикселей у PSNR мало, но полная перцептивная модель – больше, чем требует вопрос. Мы используем её там, где она сильна: как структурно-осознанную проверку кодирования и особенно ради её карты, которая показывает, где в кадре сломалось качество, а не только насколько. Мы строги к её пределам – называем инструмент и версию на каждом числе SSIM, никогда не сравниваем между реализациями и переходим к VMAF с названной моделью, когда вопрос «как хорошо это выглядит для зрителя». Наша методология бенчмарков фиксирует, какая метрика дала каждое число и почему именно она была правильной для того сравнения.
Ключевые выводы
- SSIM измеряет, уцелела ли структура, а не сколько пикселей изменилось – ближе к работе глаза.
- Оно сравнивает яркость, контраст и структуру по окнам, затем перемножает их в оценку 0–1.
- Структурный член и делает SSIM перцептивным; низкий структурный член означает, что узоры сломались.
- SSIM лучше PSNR, потому что реагирует на то, что сделал урон, и лучше коррелирует с оценками людей.
- Единого SSIM нет – реализации различаются; сравнивайте только один инструмент, версию и настройки.
- Оно только по luma, покадровое, одношкальное и насыщается у 1 – называйте слепую зону под ваш контент.