Интерполяция цифрового изображения. Основы оцифровки. Типы сканирующих устройств

Сравнение программы RAISR с другими передовыми методами повышения разрешения изображений. Больше примеров см. в сопроводительных материалах к научной статье

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

На практике возможности подобных программ гораздо скромнее. Например, 29 октября 2016 года на GitHub выложили программу Neural Enhance , которая повышает разрешение фотографий с помощью нейросети. Программа сразу вошла в список самых популярных репозиториев за неделю.


Пример работы Neural Enhance


Ещё один пример работы программы Neural Enhance, которая опубликована в открытом доступе на GitHub

Сотрудники Google Research тоже работают в этом направлении - в официальном блоге компании вчера рассказали о методе повышения разрешения, который назвали RAISR (Rapid and Accurate Image Super-Resolution).

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

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

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

В ходе обучения RAISR применялась база одновременно сгенерированых пар изображений в высоком и низком качестве. Использовались пары маленьких фрагментов изображения для стандартной 2х интерполяции, то есть фрагменты 3×3 и 6×6 пикселей. Алгоритм обучения и работы RAISR показан на схеме.

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

Каждый тип фильтра действует для своего типа пикселей: от Р1 до Р4, в соответствии с типами пикселей, которые используются алгоритмом билинейной интерполяции.

В чём-то метод машинного обучения RAISR похож на обучение нейросетей. Но фактически он представляет собой адаптацию различных фильтров стандартной интерполяции для каждого отдельного маленького фрагмента исходного изображения. То есть это та же старая «линейная интерполяции», но как бы на стероидах - без присущих ей артефактов и с адаптацией к содержанию изображения.

Сравнительное тестирование показало, что такой алгоритм во многих случаях работает даже лучше, чем современные методы продвинутой интерполяции, основанные на нейросетях (SRCNN на иллюстрациях).

К тому же, такой метод на основе хэширования гораздо менее ресурсоёмкий и более приемлем на практике, чем обучение и использование нейросети. Разница в производительности настолько большая (10−100 раз), что эту программу можно спокойно запускать даже на обычных мобильных устройствах, и она будет работать в реальном времени. Ничто не мешает внедрить этот фильтр в современные приложения интерполяции изображений на смартфонах, в том числе в приложение камеры на Android, которое выполняет интерполяцию во время цифрового зуммирования. Вполне возможно, что Google именно это собирается сделать в первую очередь. По крайней мере, это пример наиболее массового повсеместного применения интерполяции на миллионах устройств.


Слева: оригинал низкого разрешения. По центру: результат работы стандартного бикубического интерполятора. Справа: результат работы RAISR

Фотографии станут лучше сразу у всех пользователей Android.

Кстати, ещё одно интересное и важное преимущество RAISR - в процессе обучения эту программу можно обучить устранять характерные артефакты сжатия, в том числе JPEG. Например, на мобильном устройстве фотографии могут храниться в сжатом виде с артефактами, а на экране отображаться без артефактов. Или алгоритм можно применить на фотохостинге Google для автоматического улучшения фотографий пользователей, с устранением артефактов JPEG, которые присутствуют практически повсеместно.


Слева: оригинал низкого разрешения с характерными для JPEG артефактами алиасинга. Справа - выдача RAISR

Сотрудников Google Research скоро будет опубликована в журнале IEEE Transactions on Computational Imaging. (Примечание: ведущий автор научной работы был стажёром Google Research во время подготовки статьи, но теперь работает в израильском исследовательском технологическом институте Technion).

Функция изменения размера изображения, предоставленная Emgu (оболочка.net для OpenCV), может использовать любой из четырех методов интерполяции :

  • CV_INTER_NN (по умолчанию)
  • CV_INTER_LINEAR
  • CV_INTER_CUBIC
  • CV_INTER_AREA

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

Причина, по которой я изменяю размер изображения, заключается в уменьшении количества пикселей (они будут повторяться в какой-то момент), сохраняя их репрезентативными. Я упоминаю это, потому что мне кажется, что интерполяция является центральной для этой цели - поэтому правильный тип должен быть очень важным.

Мой вопрос, каковы преимущества и недостатки каждого метода интерполяции? Как они отличаются и какой из них я должен использовать?

4 ответов

Ближайший сосед будет как можно быстрее, но при изменении размера вы потеряете существенную информацию.

Линейная интерполяция менее быстрая, но не приведет к потере информации, если вы не уменьшаете изображение (которое вы есть).

Кубическая интерполяция (вероятно, фактически "Бикубическая") использует одну из многих возможных формул, которые включают в себя несколько соседних пикселей. Это намного лучше для сокращения изображений, но вы по-прежнему ограничены в отношении того, сколько вы можете уменьшить без потери информации. В зависимости от алгоритма вы можете уменьшить свои изображения на 50% или 75%. Основной подход этого подхода заключается в том, что он намного медленнее.

Не уверен, что такое "area" - на самом деле это может быть "Bicubic". По всей вероятности, этот параметр даст лучший результат (с точки зрения потери/появления информации), но за счет самого продолжительного времени обработки.

Используемый метод интерполяции зависит от того, чего вы пытаетесь достичь:

CV_INTER_LINEAR или CV_INTER_CUBIC применяет фильтр нижних частот (средний) для достижения компромисса между визуальным качеством и удалением края (фильтры нижних частот имеют тенденцию удалять края по порядку для уменьшения наложения изображений). Между этими двумя, я бы рекомендовал вам CV_INTER_CUBIC .

Метод CV_INTER_NN на самом деле является ближайшим соседом, это самый базовый метод, и вы получите более резкие края (ни один фильтр нижних частот не будет применяться). Однако этот метод просто напоминает "масштабирование" изображения, отсутствие визуального улучшения.

Алгоритмы: (описания из документации OpenCV)

  • INTER_NEAREST - интерполяция ближайшего соседа
  • INTER_LINEAR - билинейная интерполяция (используется по умолчанию)
  • INTER_AREA - повторная выборка с использованием отношения области пикселей. Это может быть предпочтительный метод для прореживания изображения, поскольку он дает результаты без муара. Но когда изображение масштабируется, оно похоже на метод INTER_NEAREST.
  • INTER_CUBIC - бикубическая интерполяция по окрестности 4x4 пикселей.
  • INTER_LANCZOS4 - интерполяция Lanczos в окрестности 8x8 пикселей

Если вы хотите увеличить скорость, используйте метод Nearest Neighbor.

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

Вообще, это было вступлением к другой статье, но оно затянулось и вылилось в отдельный материал.

Этот человек сидит среди ромашек, чтобы привлечь ваше внимание к статье.

Для наглядного сравнения я буду использовать изображения одинакового разрешения 1920×1280 (одно , второе), которые буду приводить к размерам 330×220, 1067×667 и 4800×3200. Под иллюстрациями будет написано, сколько миллисекунд занял ресайз в то или иное разрешение. Цифры приведены лишь для понимания сложности алгоритма, поэтому конкретное железо или ПО, на котором они получены, не так важно.

Ближайший сосед (Nearest neighbor)

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

Вообще, качество и производительность любого метода уменьшения можно оценить по отношению количества пикселей, участвовавших в формировании конечного изображения, к числу пикселей в исходном изображении. Чем больше это отношение, тем скорее всего алгоритм качественнее и медленнее. Отношение, равное одному, означает что как минимум каждый пиксель исходного изображения сделал свой вклад в конечное. Но для продвинутых методов оно может быть и больше одного. Дак вот, если например мы уменьшаем изображение методом ближайшего соседа в 3 раза по каждой стороне, то это соотношение равно 1/9. Т.е. большая часть исходных пикселей никак не учитывается.




1920×1280 → 330×220 = 0,12 ms
1920×1280 → 1067×667 = 1,86 ms

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

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

Аффинные преобразования (Affine transformations)

Аффинные преобразования - общий метод для искажения изображений. Они позволяют за одну операцию повернуть, растянуть и отразить изображение. Поэтому во многих приложениях и библиотеках, реализующих метод аффинных преобразований, функция изменения изображений является просто оберткой, рассчитывающей коэффициенты для преобразования.

Принцип действия заключается в том, что для каждой точки конечного изображения берется фиксированный набор точек исходного и интерполируется в соответствии с их взаимным положением и выбранным фильтром. Количество точек тоже зависит от фильтра. Для билинейной интерполяции берется 2x2 исходных пикселя, для бикубической 4x4. Такой метод дает гладкое изображение при увеличении, но при уменьшении результат очень похож на ближайшего соседа. Смотрите сами: теоретически, при бикубическом фильтре и уменьшении в 3 раза отношение обработанных пикселей к исходным равно 4² / 3² = 1,78. На практике результат значительно хуже т.к. в существующих реализациях окно фильтра и функция интерполяции не масштабируются в соответствии с масштабом изображения, и пиксели ближе к краю окна берутся с отрицательными коэффициентами (в соответствии с функцией), т.е. не вносят полезный вклад в конечное изображение. В результате изображение, уменьшенное с бикубическим фильтром, отличается от изображения, уменьшенного с билинейным, только тем, что оно еще более четкое. Ну а для билинейного фильтра и уменьшения в три раза отношение обработанных пикселей к исходным равно 2² / 3² = 0.44, что принципиально не отличается от ближайшего соседа. Фактически, аффинные преобразования нельзя использовать для уменьшения более чем в 2 раза. И даже при уменьшении до двух раз они дают заметные эффекты лесенки для линий.

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




1920×1280 → 330×220 = 6.13 ms
1920×1280 → 1067×667 = 17.7 ms
1920×1280 → 4800×3200 = 869 ms

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

Мое скромное мнение, что использование этого способа для произвольного уменьшения изображений попросту является багом , потому что результат получается очень плохой и похож на ближайшего соседа, а ресурсов на этот метод нужно значительно больше. Тем не менее, этот метод нашел широкое применение в программах и библиотеках. Самое удивительное, что этот способ используется во всех браузерах для метода канвы drawImage() (наглядный пример), хотя для простого отображения картинок в элементе используются более аккуратные методы (кроме IE, в нем для обоих случаев используются аффинные преобразования). Помимо этого, такой метод используется в OpenCV, текущей версии питоновской библиотеки Pillow (об этом я надеюсь написать отдельно), в Paint.NET.

Кроме того, именно этот метод используется видеокартами для отрисовки трехмерных сцен. Но разница в том, что видеокарты для каждой текстуры заранее подготавливают набор уменьшенных версий (mip-уровней), и для окончательной отрисовки выбирается уровень с таким разрешением, чтобы уменьшение текстуры было не более двух раз. Кроме этого, для устранения резкого скачка при смене mip-уровня (когда текстурированный объект приближается или отдаляется), используется линейная интерполяция между соседними mip-уровнями (это уже трилинейная фильтрация). Таким образом для отрисовки каждого пикселя трехмерного объекта нужно интерполировать между 2³ пикселями. Это дает приемлемый для быстро движущейся картинки результат за время, линейное относительно конечного разрешения.

Суперсемплинг (Supersampling)

С помощью этого метода создаются те самые mip-уровни, с помощью него (если сильно упростить) работает полноэкранное сглаживание в играх. Его суть в разбиении исходного изображения по сетке пикселей конечного и складывании всех исходных пикселей, приходящихся на каждый пиксель конечного в соответствии с площадью, попавшей под конечный пиксель. При использовании этого метода для увеличения, на каждый пиксель конечного изображения приходится ровно один пиксель исходного. Поэтому результат для увеличения равен ближайшему соседу.

Можно выделить два подвида этого метода: с округлением границ пикселей до ближайшего целого числа пикселей и без. В первом случае алгоритм становится малопригодным для масштабирования меньше чем в 3 раза, потому что на какой-нибудь один конечный пиксель может приходиться один исходный, а на соседний - четыре (2x2), что приводит к диспропорции на локальном уровне. В то же время алгоритм с округлением очевидно можно использовать в случаях, когда размер исходного изображения кратен размеру конечного, или масштаб уменьшения достаточно мал (версии разрешением 330×220 почти не отличаются). Отношение обработанных пикселей к исходным при округлении границ всегда равно единице.




1920×1280 → 330×220 = 7 ms
1920×1280 → 1067×667 = 15 ms
1920×1280 → 4800×3200 = 22,5 ms

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




1920×1280 → 330×220 = 19 ms
1920×1280 → 1067×667 = 45 ms
1920×1280 → 4800×3200 = 112 ms

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

Данный метод используется в функции gdImageCopyResampled() библиотеки GD, входящей в состав PHP, есть в OpenCV (флаг INTER_AREA), Intel IPP, AMD Framewave. Примерно по такому же принципу работает libjpeg, когда открывает изображения в уменьшенном в несколько раз виде. Последнее позволяет многим приложениям открывать изображения JPEG заранее уменьшенными в несколько раз без особых накладных расходов (на практике libjpeg открывает уменьшенные изображения даже немного быстрее полноразмерных), а затем применять другие методы для ресайза до точных размеров. Например, если нужно отресайзить JPEG разрешением 1920×1280 в разрешение 330×220, можно открыть оригинальное изображение в разрешении 480×320, а затем уменьшить его до нужных 330×220.

Свертки (Convolution)

Этот метод похож на аффинные преобразования тем, что используются фильтры, но имеет не фиксированное окно, а окно, пропорциональное масштабу. Например, если размер окна фильтра равен 6, а размер изображения уменьшается в 2,5 раза, то в формировании каждого пикселя конечного изображения принимает участие (2,5 * 6)² = 225 пикселей, что гораздо больше, чем в случае суперсемплинга (от 9 до 16). К счастью, свертки можно считать в 2 прохода, сначала в одну сторону, потом в другую, поэтому алгоритмическая сложность расчета каждого пикселя равна не 225, а всего (2,5 * 6) * 2 = 30. Вклад каждого исходного пикселя в конечный как раз определяется фильтром. Отношение обработанных пикселей к исходным целиком определяется размером окна фильтра и равно его квадрату. Т.е. для билинейного фильтра это отношение будет 4, для бикубического 16, для Ланцоша 36. Алгоритм прекрасно работает как для уменьшения, так и для увеличения.




1920×1280 → 330×220 = 76 ms
1920×1280 → 1067×667 = 160 ms
1920×1280 → 4800×3200 = 1540 ms

Скорость работы этого метода зависит от всех параметров: размеров исходного изображения, размера конечного изображения, размера окна фильтра.

Именно этот метод реализован в ImageMagick, GIMP, в текущей версии Pillow с флагом ANTIALIAS.

Одно из преимуществ этого метода в том, что фильтры могут задаваться отдельной функцией, никак не привязанной к реализации метода. При этом функция самого фильтра может быть достаточно сложной без особой потери производительности, потому что коэффициенты для всех пикселей в одном столбце и для всех пикселей в одной строке считаются только один раз. Т.е. сама функция фильтра вызывается только (m + n) * w раз, где m и n - размеры конечного изображения, а w - размер окна фильтра. И наклепать этих функций можно множество, было бы математическое обоснование. В ImageMagick, например, их 15. Вот как выглядят самые популярные:

Билинейный фильтр (bilinear или triangle в ImageMagick)


Бикубический фильтр (bicubic , catrom в ImageMagick)


Фильтр Ланцоша (Lanczos)

Примечательно, что некоторые фильтры имеют зоны отрицательных коэффициентов (как например бикубический фильтр или фильтр Ланцоша). Это нужно для придания переходам на конечном изображении резкости, которая была на исходном.

Рынок мобильных телефонов заполнен моделями с камерами с огромными разрешениями. Встречаются даже относительно недорогие смартфоны с сенсорами разрешением 16-20 Мп. Незнающий покупатель гонится за "крутой" камерой и отдает предпочтение тому телефону, у которого разрешение камеры выше. Он даже и не догадывается, что попадается на удочку маркетологов и продавцов.

Что такое разрешение?

Разрешение камеры - это параметр, который указывает на конечный размер изображения. Он определяет только то, насколько полученное изображение будет большим, то есть его ширину и высоту в пикселях. Важно: качество картинки при этом не изменяется. Фотография может получиться некачественной, но большой из-за разрешения.

Разрешение не влияет на качество. Нельзя было не упомянуть об этом в контексте интерполяции камеры смартфона. Теперь можно переходить непосредственно к сути.

Что такое интерполяция камеры в телефоне?

Интерполяция камеры - это искусственное увеличение разрешения изображения. Именно изображения, а не То есть это специальное программное обеспечение, благодаря которому снимок с разрешением 8 Мп интерполируется до 13 Мп или больше (или меньше).

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

Для чего это нужно?

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

Буквально 3-4 года тому назад многие производители гнались за количеством мегапикселей и разными способами пытались впихнуть их в свои смартфоны сенсоры с как можно большим числом. Так появлялись смартфоны с камерами с разрешением 5, 8, 12, 15, 21 Мп. Фотографировать они при этом могли как самые дешевые мыльницы, но покупатели, увидев наклейку "Камера на 18 Мп", сразу хотели купить такой телефон. С появлением интерполяции продавать такие смартфоны стало проще из-за возможности искусственно добавить мегапикселей камере. Конечно, качество фото со временем начало расти, но точно не из-за разрешения или интерполяции, а из-за естественного прогресса в плане разработки сенсоров и программного обеспечения.

Техническая сторона

Что такое интерполяция камеры в телефоне технически, ведь весь текст выше описывал только основную идею?

С помощью специального программного обеспечения на изображении "рисуются" новые пиксели. Например, для увеличения изображения в 2 раза после каждой строки пикселей картинки добавляется новая строка. Каждый пиксель в этой новой строке заполняется цветом. Цвет заливки высчитывается специальным алгоритмом. Самый первый способ - залить новую строку цветами, которыми обладают ближайшие пиксели. Результат такой обработки будет ужасным, но зато подобный способ требует минимум вычислительных операций.

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

Благо, современные мобильные процессоры быстры, и на практике пользователь не замечает, как программа редактирует изображение, пытаясь искусственно увеличить его размер.

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

Нужна ли вам интерполяция?

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

Так что интерполяция в телефоне - это маркетинговая уловка, которая совершенно не нужна. Она может увеличивать не только разрешение фото, но и стоимость самого смартфона. Не попадайтесь на уловки продавцов и производителей.

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

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

Концепция

Суть интерполяции заключается в использовании имеющихся данных для получения ожидаемых значений в неизвестных точках. Например, если вам захотелось знать, какова была температура в полдень, но измеряли её в 11 и в час, можно предположить её значение, применив линейную интерполяцию:

Если бы у вас имелось дополнительное измерение в половине двенадцатого, вы могли бы заметить, что до полудня температура росла быстрее, и использовать это дополнительное измерение для квадратической интерполяции:

Чем больше измерений температуры вы будете иметь около полудня,тем более комплексным (и ожидаемо более точным) может быть ваш алгоритм интерполяции.

Пример изменения размера изображения

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

оригинал до после без интерполяции

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

Пример вращения изображения

Интерполяция происходит также каждый раз, когда вы поворачиваете или изменяете перспективу изображения. Предыдущий пример был обманчив, поскольку это частный случай, в котором интерполяторы обычно работают неплохо. Следующий пример показывает, как быстро может быть потеряна детальность изображения:

оригинал поворот на 45 поворот на 90 (без потерь) 2 поворота на 45° 6 поворотов на 15°

Поворот на 90° не вносит потерь, поскольку ни один пиксель не требуется поместить на границу между двумя (и как следствие разделить). Заметьте, как большая часть деталей теряется при первом же повороте, и как качество продолжает падать при последующих. Это означает, что следует избегать вращений, насколько возможно; если неровно выставленный кадр требует поворота, не следует вращать его более одного раза.

Вышеприведенные результаты используют так называемый «бикубический» алгоритм и показывают существенное ухудшение качества. Обратите внимание, как снижается общий контраст в связи со снижением интенсивности цвета, как вокруг светло-синего возникают тёмные гало. Результаты могут быть значительно лучше в зависимости от алгоритма интерполяции и изображаемого предмета.

Типы алгоритмов интерполяции

Общепринятые алгоритмы интерполяции можно поделить на две категории: адаптивные и неадаптивные. Адаптивные методы изменяются в зависимости от предмета интерполяции (резкие границы, гладкая текстура), тогда как неадаптивные методы обрабатывают все пиксели одинаково.

Неадаптивные алгоритмы включают: метод ближайшего соседа, билинейный, бикубический, сплайны, функция кардинального синуса (sinc), метод Ла́нцоша и другие. В зависимости от сложности, они используют от 0 до 256 (или более) смежных пикселей для интерполяции. Чем более смежных пикселей они включают, тем более точными могут оказаться, но это достигается за счёт значительного прироста времени обработки. Эти алгоритмы могут использоваться как для развёртки, так и для масштабирования изображения.

Адаптивные алгоритмы включают в себя многие коммерческие алгоритмы в лицензированных программах, таких как Qimage, PhotoZoom Pro, Genuine Fractals и другие. Многие из них применяют различные версии своих алгоритмов (на основе попиксельного анализа), когда обнаруживают наличие границы - с целью минимизировать неприглядные дефекты интерполяции в местах, где они наиболее видны. Эти алгоритмы в первую очередь разработаны для максимизации бездефектной детальности увеличенных изображений, так что некоторые из них для вращения или изменения перспективы изображения непригодны.

Метод ближайшего соседа

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

Билинейная интерполяция

Билинейная интерполяция рассматривает квадрат 2x2 известных пикселя, окружающих неизвестный. В качестве интерполированного значения используется взвешенное усреднение этих четырёх пикселей. В результате изображения выглядят значительно более гладко, чем результат работы метода ближайшего соседа.

Диаграмма слева относится к случаю, когда все известные пиксели равны, так что интерполированное значение просто является их суммой, поделенной на 4.

Бикубическая интерполяция

Бикубическая интерполяция идёт на один шаг дальше билинейной, рассматривая массив из 4x4 окружающих пикселей - всего 16. Поскольку они находятся на разных расстояниях от неизвестногопикселя, ближайшие пиксели получают при расчёте больший вес. Бикубическая интерполяция производит значительно более резкие изображения, чем предыдущие два метода, и возможно, является оптимальной по соотношению времени обработки и качества на выходе. По этой причине она стала стандартной для многих программ редактирования изображений (включая Adobe Photoshop), драйверов принтеров и встроенной интерполяции камер.

Интерполяция высшего порядка: сплайны и sinc

Есть много других интерполяторов, которые принимают во внимание больше окружающих пикселей и таким образом требуют более интенсивных вычислений. Эти алгоритмы включают в себя сплайны и кардинальный синус (sinc), и они сохраняют большинство информации об изображении после интерполяции. Как следствие, они являются исключительно полезными, когда изображение требует нескольких поворотов или изменений перспективы за отдельные шаги. Однако, для однократных увеличений или поворотов такие алгоритмы высшего порядка дают незначительное визуальное улучшение при существенном увеличении времени обработки. Более того, в некоторых случаях алгоритм кардинального синуса на гладком участке отрабатывает хуже, чем бикубическая интерполяция.

Наблюдаемые дефекты интерполяции

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

оригинал ступенчатость размытие гало

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

Адаптивные интерполяторы могут создавать или не создавать вышеописанные дефекты, но они тоже могут породить несвойственные исходному изображению текстуры или одиночные пиксели на крупных масштабах:

Материал с малоразмерной текстурой Участок при увеличении 220%

С другой стороны, некоторые «дефекты» адаптивных интерполяторов тоже могут рассматриваться как преимущества. Поскольку глаз ожидает увидеть в областях с мелкой текстурой, таких как листва, детали вплоть до мельчайших подробностей, подобные рисунки могут обмануть глаз на расстоянии (для определённых видов материала).

Сглаживание

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

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

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

Оптический и цифровой зум

Многие компактные цифровые камеры могут осуществлять как оптическое, так и цифровое увеличение (зум). Оптический зум осуществляется движением вариобъектива, так чтобы свет усиливался до попадания на цифровой сенсор. На контрасте, цифровой зум понижает качество, поскольку осуществляет простую интерполяцию изображения - уже после получения его сенсором.

Оптический зум (х10) Цифровой зум (х10)

Даже несмотря на то, что фото с использованием цифрового зума содержит то же число пикселей, его детальность отчётливо меньше, чем при использовании оптического зума.Цифровой зум следует практически полностью исключить, за вычетом случаев, когда он помогает отобразить удалённый объект на ЖК-экране вашей камеры. С другой стороны, если вы обычно снимаете в JPEG и хотите впоследствии обрезать и увеличить снимок, цифровой зум имеет преимущество в том, что его интерполяция осуществляется до внесения дефектов компрессии. Если вы обнаруживаете, что цифровой зум вам нужен слишком часто, купите телеконвертор, а ещё лучше объектив с большим фокусным расстоянием.