Содержание статьи +
TL;DR
Размытие – это потеря высокочастотной детализации: резкие края расплываются в плавные склоны, а тонкая текстура сглаживается, и картинка выглядит так, будто слегка ушла из фокуса. У него три типичные причины, и все они делают одно и то же – выбрасывают мелкую деталь, которую изображение несёт в своих высоких пространственных частотах: грубое квантование высокочастотных коэффициентов преобразования, даунскейл источника до меньшего разрешения и слишком агрессивный шумодав или низкочастотная фильтрация. В отличие от бэндинга, размытие – это настоящая широкополосная попиксельная ошибка, поэтому полнореференсные метрики реагируют на него хорошо: PSNR падает, члены контраста и структуры у SSIM падают, а у VMAF есть feature, созданная ровно для этого, – её Detail Loss Metric. Трудность не в том, чтобы измерить размытие, а в том, чтобы отличить его от мягкости, которую автор поставил намеренно, – а этого не может ни один слепой безреференсный показатель, поэтому честный процесс измеряет резкость, а затем спрашивает человека, была ли мягкость задумана.
Почему это важно
Если ваши кодировки выглядят мягкими, вы теряете ту самую детализацию, от которой картинка кажется дорогой, – текстуру кожи и ткани, читаемость мелкого текста, чёткость края логотипа, – и часто теряете её по причине, которую можно устранить. Размытие – это тихий артефакт: оно редко выглядит «сломанным», как блочность или бэндинг, поэтому уходит в эфир незамеченным, и картинка просто выглядит дёшево, а никто не может сказать почему. Эта статья – для видеоинженера, лида по кодированию или QA-инженера, который видит, что рендер мягкий, но хочет точно знать, куда ушла деталь, ошибка это или выбор, и какая метрика её поймает (а какая нет). Сделаете это правильно – и перестанете пересжимать кадры, которым нужны были биты, и «чинить» мягкость, о которой просил режиссёр.
Как выглядят размытие и потеря детализации
Начнём с внешнего вида, потому что под этим заголовком идут две связанные вещи, и их полезно различать.
Размытие – это то, что происходит с краями. Резкий край – это быстрый скачок от одной яркости к другой: чёрный текст на белой странице переходит из тёмного в светлое за пиксель-другой. Размытие растягивает этот скачок: вместо рывка через один-два пикселя переход плавно нарастает через много, поэтому край выглядит мягким, а границу становится трудно локализовать. Чем шире склон, тем размытее край.
Потеря детализации – это то, что происходит с текстурой. Тонкие, частые узоры – переплетение пиджака, травинки, киноплёночное зерно, поры кожи – живут в высоких пространственных частотах картинки, в быстрых попиксельных колебаниях, которые несут мелкую деталь. Когда их сглаживают, текстура размазывается в восковую, пластиковую поверхность, которая выглядит чистой на стоп-кадре и безжизненной в движении. Расплывание краёв и сглаживание текстуры – две стороны одной потери: высокочастотного содержимого больше нет.
Полезно поставить это рядом с соседями по справочнику артефактов. Блочность добавляет видимую сетку; рингинг добавляет гало рядом с краями. Размытие – это противоположный вид повреждения: оно не добавляет узор, оно убирает деталь. Поэтому его легче всего пропустить: с картинкой всё в порядке, кроме того, что чего-то в ней больше нет.
Куда уходит детализация
Высокочастотную деталь убирают три разных этапа видеопайплайна, и они часто складываются. Понять, какой именно размыл вашу картинку, – значит понять, какую ручку крутить.
Квантование в кодере. Кодек переписывает каждый блок кадра преобразованием – дискретным косинусным (DCT) или похожим, – которое описывает блок как стопку волновых паттернов, от плоского базового тона до тонкой быстрой ряби. Мелкая деталь и резкие края живут в высокочастотных волнах. Затем квантование делит силу каждой волны на шаг и округляет, и малые высокочастотные коэффициенты округляются прямо в ноль. Это тот же механизм, что порождает блочность и рингинг, но видимый результат здесь другой: с пропавшими высокими частотами декодер пересобирает блок только из его грубых, низкочастотных частей, а блок, собранный из грубых частей, – это мягкий блок. Дави на квантователь сильнее ради экономии битов – и картинка смягчается. Деталь со стороны причины – как кодек выбирает этот шаг – лежит в секции Video Encoding; здесь нам нужен только результат: высокие частоты выброшены, деталь потеряна.
Даунскейл в лестнице разрешений. Большинство стриминговых сервисов отдают несколько разрешений и позволяют плееру выбрать одно. Когда мастер 1080p кодируется на нижней ступени – скажем, 540p – картинку уменьшают, а уменьшение выбрасывает отсчёты. Пройдём арифметику. Кадр 1920×1080 содержит 1920 × 1080 = 2 073 600 пикселей. Сожмите его до 960×540, и он будет держать 960 × 540 = 518 400 пикселей – ровно четверть, то есть три из каждых четырёх отсчётов исчезли. Предел самой тонкой детали, которую картинка может представить (предел Найквиста), вдвое снижается по каждому направлению, поэтому всё тоньше примерно четырёхпиксельного (в исходных пикселях) цикла больше не может храниться. Когда плеер масштабирует эти 540p обратно на экран 1080p, пропавшая деталь не возвращается – апскейл умеет только интерполировать, а не выдумывать заново. Идеально чистая кодировка 540p всё равно выглядит мягко на большом экране, и никакая настройка кодера это не меняет, потому что деталь выбросили ещё до того, как кодер её увидел. Выбор правильной ступени – это работа выпуклой оболочки.
Шумодав и предобработка. Перед кодированием пайплайны часто прогоняют шумодав или низкочастотный фильтр, чтобы убрать сенсорный шум и зерно – отчасти ради чистоты картинки, отчасти потому, что шум дорого сжимать. Шумодав не может идеально отделить «шум» от «мелкой детали», потому что для фильтра они выглядят одинаково: и то и другое – высокочастотное. Поверни его слишком сильно – и он сдерёт текстуру вместе с зерном, и получится тот самый восковой, переглаженный вид. Это смягчение происходит до кодека, поэтому оно невидимо для любой метрики, что сравнивает кодировку с отфильтрованным источником, – сам референс уже мягкий.
Трудная задача: намеренная мягкость или артефакт
Вот что отличает размытие от любого другого артефакта в этой галерее и почему ему нужна отдельная статья. Размытая область – не всегда дефект. Режиссёры размывают намеренно, постоянно, и эта мягкость – тот самый вид, которого они хотят.
Малая глубина резкости уводит фон из фокуса, чтобы выделить героя, – кремовый размытый задник за портретом называется боке, и это признак дорогого объектива, а не дешёвой кодировки. Размытие движения (motion blur) – это след, который быстрый объект оставляет за одну выдержку; убери его – и движение станет дёрганым и неестественным. Софт-фокус – намеренная эстетика, для настроения или чтобы польстить лицу. Во всех этих случаях картинка по-настоящему, намеренно мягкая, и её «починка» разрушила бы кадр.
Слепая безреференсная метрика – та, что судит один кадр без нетронутого оригинала для сравнения, – не может отличить ничего из этого от размытия сжатия. Для математики размытая область – это размытая область: низкая высокочастотная энергия, широкие края, какова бы ни была причина. В этом центральная честность измерения размытия: число говорит вам, насколько мягко, но никогда – должна ли эта мягкость там быть. (О том, почему на лайве и пользовательском контенте безреференсный подход – единственный вариант, см. полно-, редуцированно- и безреференсные метрики.)
Поэтому практический процесс – не «измерь размытие, забракуй мягкие кадры». Он такой: измерь резкость по всему клипу, посмотри, где сидит мягкость и как она себя ведёт, и только потом суди. Несколько вопросов почти всегда отделяют замысел от артефакта. Мягок весь кадр или только его часть? Локальная мягкость, что обнимает героя и оставляет фон резким (или наоборот), почти всегда – глубина резкости, а не сжатие: размытие квантования широкое и безразличное к тому, что в кадре. Появляется ли мягкость или усиливается только на низком битрейте и пропадает при его повышении? Это кодер. Существует ли более резкая версия на ступени повыше или в мастере? Тогда мягкая ступень потеряла деталь на даунскейле. Постоянна ли мягкость и привязана ли к работе камеры? Скорее всего, она намеренная.
Как реагируют метрики и где они врут
Теперь хорошая новость, и она настоящая: из всех артефактов этой галереи размытие – тот, с которым полнореференсные метрики справляются лучше всего.
Причина в том, что размытие – это настоящая широкополосная попиксельная ошибка. Когда деталь убрана, очень много пикселей по всему кадру отличаются от оригинала – не на почти невидимое единичное кодовое значение бэндинга, а на существенные величины, разлитые по всей картинке. Поэтому метрика попиксельной ошибки реагирует: число, что сравнивает сжатый кадр с оригиналом попиксельно, называемое PSNR (пиковое отношение сигнал/шум, в децибелах), заметно падает при размытии кадра. Метрика, что сравнивает структурные паттерны, SSIM (структурное сходство, по шкале 0–1), тоже падает, потому что её члены контраста и структуры оба снижаются, когда края смягчаются, а текстура сглаживается.
А VMAF – слитная перцептивная метрика Netflix (Video Multimethod Assessment Fusion, по шкале 0–100) – справляется лучше всех, потому что один из трёх её базовых ингредиентов создан ровно для этого. VMAF сплавляет feature-метрику верности детали, называемую VIF (Visual Information Fidelity), с feature, чьё имя говорит само за себя: ADM, Additive Distortion Metric, ранее называвшаяся Detail Loss Metric (DLM). Как описывает её собственная документация Netflix, Detail Loss Metric измеряет «потерю деталей, которая влияет на видимость содержимого». Когда видеоинженер беспокоится, что кодировка мягкая, VMAF уже следит за этим feature, названной по имени проблемы. (О том, как VMAF сплавляет свои feature, см. VMAF: объяснение.)
Так что размытие – не то место, где полнореференсные метрики слепы. Но они всё равно врут о нём тремя конкретными способами, и все три – про референс и контекст, а не про то, регистрируется ли ошибка.
Первый и главный: метрика не видит низкоразрешающего источника. Закодируйте ступень 540p хорошо и измерьте её против её же референса 540p – и PSNR, и VMAF покажут высоко: кодировка верна тому, что ей дали. Но дали ей уже мягкое. На экране 1080p зритель видит мягкую картинку, а оценка говорит «отлично», потому что оценка никогда не сравнивала с деталью 1080p, выброшенной выше по течению. Это классическая ловушка – судить ступень против её же даунскейленного референса вместо оригинального мастера.
Второй: безреференсная резкость слепа к замыслу, как изложено в прошлом разделе. Слепая метрика помечает боке и софт-фокусный крупный план как «размытые» ровно так же, как голодную кодировку.
Третий – обратная ловушка, и она ведёт прямо к рингингу: резкость можно подделать и обмануть глаз. Прогон фильтра шарпинга преувеличивает контраст прямо у каждого края, что поднимает акутанс – воспринимаемую чёткость края – и может сделать кадр на вид резче и даже подтолкнуть вверх некоторые безреференсные оценки резкости. Но шарпинг не изобретает настоящей детали; он просто добавляет перелёт рядом с краем, а это зерно рингинга. Гонись за кажущейся резкостью слишком далеко – и сменишь мягкое-но-чистое на чёткое-но-звенящее. Размытие и рингинг сидят на противоположных концах одной ручки.
| Метрика | Что измеряет | Нужен референс | Где врёт на размытии и потере детализации |
|---|---|---|---|
| PSNR | Средняя попиксельная ошибка (дБ) | Полнореференсная | Реагирует хорошо – размытие широкополосно; но высоко против даунскейленного референса, даже когда картинка мягкая на экране |
| SSIM | Структурное сходство (0–1) | Полнореференсная | Члены контраста и структуры падают при смягчении; всё равно оценивается против того референса, что вы дали |
| VMAF (+ DLM/VIF) | Слитная перцептивная оценка (0–100) | Полнореференсная | Лучше всех – feature Detail Loss Metric создана для этого; всё равно слепа к низкоразрешающему источнику, измеренному против себя |
| Дисперсия лапласиана | Энергия краёв/детали | Безреференсная | Дешёвый прокси резкости; сильно зависит от контента и шума – валиден только при сравнении версий одного и того же кадра |
| Ширина края / CPBD | Насколько расплылись края | Безреференсная | Создана для размытия; работает на лайве/UGC, но не отличает намеренную мягкость (боке, софт-фокус) от артефакта |
Таблица 1. Как шесть способов измерения трактуют размытие и потерю детализации. Полнореференсные метрики видят размытие хорошо – это настоящая ошибка, – а у VMAF есть feature, названная по имени проблемы. Честные пробелы – это низкоразрешающий источник, измеренный против собственного мягкого референса, и безреференсные метрики, слепые к тому, была ли мягкость задумана.
«Частая ошибка: оценивать низкоразрешающую ступень против её же даунскейленного референса. Дорогая ошибка здесь – закодировать ступень 540p или 720p, измерить её против референса в том же низком разрешении, увидеть, что PSNR или VMAF читаются как «отлично», и отправить в эфир, будто картинка резкая. Она резкая относительно мягкой цели. На большом экране зритель видит мягкость, которую оценка не измеряла. Измеряйте воспринимаемое качество против высокоразрешающего мастера (libvmaf сам апскейлит ступень до референса), чтобы деталь, потерянная на даунскейле, реально шла в минус оценке. Вторая ловушка: не «чините» мягкость фильтром шарпинга и не называйте это выигрышем качества – вы подняли акутанс и посеяли рингинг, а не вернули деталь.»
Как измерить резкость без референса
На лайв-стримах, видеозвонках и пользовательских клипах нет нетронутого оригинала, поэтому полнореференсные метрики выше не применимы и нужен безреференсный показатель резкости. Несколько классических, в порядке возрастания того, насколько хорошо они совпадают с глазом:
Самый простой – дисперсия лапласиана: прогоните оператор, реагирующий на быстрые изменения, и возьмите его дисперсию; чёткий кадр получает высоко, мягкий – низко (Pertuz et al., 2013). Это одна строка кода и по-настоящему полезно для автофокуса или чтобы пометить самый мягкий кадр в пачке, но он так чувствителен к контенту и шуму, что абсолютное значение мало значит – заслуживает доверия только сравнение двух версий одного и того же кадра.
Семейство ширины края измеряет артефакт напрямую: найти сильные края и измерить, за сколько пикселей каждый переход поднимается, потому что размытие – это ровно то, что расширяет этот подъём (Marziliano et al., 2002). Метрика Just Noticeable Blur (JNB) уточнила это перцептивным порогом – ниже определённой ширины края, зависящей от локального контраста, глаз вообще не регистрирует размытие (Ferzli and Karam, 2009), – а CPBD (Cumulative Probability of Blur Detection) объединила покадровые вероятности обнаружения размытия в единую оценку, которая хорошо отслеживает человеческие суждения на гауссовом размытии и сжатых изображениях (Narvekar and Karam, 2011).
Особенно изящен перцептивный показатель размытия Crete-Roffet (2007): поскольку людям трудно увидеть разницу между размытым изображением и тем же изображением, размытым ещё раз, вы повторно размываете кадр и измеряете, насколько падает его локальная вариация. Резкий кадр теряет много вариации от повторного размытия; уже мягкий почти не меняется – поэтому величина падения и есть обратная мера резкости, не требующая референса вовсе.
Со стороны оптики мир камер измеряет резкость как MTF50 и акутанс по тест-таблице с наклонным краем (метод ISO 12233): MTF50 – это пространственная частота, на которой контраст падает до половины, а акутанс взвешивает отклик по функции контрастной чувствительности глаза, поэтому он отслеживает воспринимаемую резкость лучше, чем один MTF50.
Сопутствующий инструмент ниже собирает три из них в одном месте. Скачайте безреференсный детектор размытия и потери детализации – небольшой Python-скрипт, который оценивает один кадр перцептивным показателем размытия Crete-Roffet, средней шириной края и дисперсией лапласиана, а по двум версиям одного и того же кадра сообщает, какая сохранила больше высокочастотной детали. В своём самотесте он читает чёткий синтетический кадр на перцептивном размытии 0,24 с краями ~2,3 пикселя и тот же кадр после низкочастотной фильтрации – на 0,93 с краями ~9,2 пикселя, примерно вчетверо шире, – то есть расплывание краёв с Рисунка 1, превращённое в число. Это инструмент триажа, а не калиброванная метрика, и он не может отличить намеренную мягкость от артефакта – поэтому подтверждайте каждый флаг глазом.
Где здесь Фора Софт
Фора Софт делает видеософт с 2005 года – стриминг, WebRTC-конференции, e-learning, OTT, телемедицина и видеонаблюдение, – и потеря детализации – тот артефакт, чья цена сильнее всего меняется по вертикали. В телемедицинском потоке мягкость может стереть текстуру кожного образования, которое клиницисту нужно увидеть; в видеонаблюдении – размыть номер или лицо, ради которого и велась запись; в e-learning – сделать мелкий текст слайда нечитаемым. Мы относимся к этому как к задаче измерения с ясным методом: никогда не судить даунскейленную ступень против её же мягкого референса – измерять против мастера, чтобы потерянная деталь шла в минус, – а на безреференсных лайв- и UGC-маршрутах оценивать ширину края и высокочастотную энергию, чтобы помечать мягкие кадры, и затем подтверждать глазом, была ли мягкость задумана, прежде чем действовать. Исправления следуют за причиной: больше битов туда, где живёт деталь, шумодав, настроенный беречь текстуру, и правильная ступень разрешения под экран.
Ключевые выводы
- Размытие – это потерянная высокочастотная деталь: края расплываются в мягкие склоны, текстура сглаживается.
- Складываются три причины: квантование высокочастотных коэффициентов, даунскейл источника и переусердствовавший шумодав.
- Потеря на даунскейле необратима – апскейл интерполирует, но не может выдумать выброшенную деталь.
- Размытие – настоящая широкополосная ошибка, поэтому PSNR, SSIM и особенно VMAF (его Detail Loss Metric) ловят его хорошо.
- Ни одна слепая метрика не отличит намеренную мягкость – боке, motion blur, софт-фокус – от артефакта.
- Никогда не оценивайте низкоразрешающую ступень против её же мягкого референса; измеряйте против мастера.