В цифровой обработке сигналов пространственное сглаживание — это метод минимизации артефактов искажения ( алиасинга ) при представлении изображения с высоким разрешением в более низком разрешении. Сглаживание используется в цифровой фотографии , компьютерной графике , цифровом аудио и многих других приложениях.
Сглаживание означает удаление компонентов сигнала, которые имеют более высокую частоту , чем та, которую может правильно разрешить записывающее (или сэмплирующее) устройство. Это удаление выполняется перед (повторной) выборкой с более низким разрешением. Если выборка выполняется без удаления этой части сигнала, это приводит к нежелательным артефактам, таким как черно-белый шум.
В получении сигнала и аудио сглаживание часто выполняется с использованием аналогового фильтра сглаживания для удаления внеполосного компонента входного сигнала перед дискретизацией с помощью аналого-цифрового преобразователя . В цифровой фотографии оптические фильтры сглаживания, изготовленные из двулучепреломляющих материалов, сглаживают сигнал в пространственной оптической области. Фильтр сглаживания по сути слегка размывает изображение, чтобы уменьшить разрешение до или ниже достижимого цифровым датчиком (чем больше шаг пикселя , тем ниже достижимое разрешение на уровне датчика).
В компьютерной графике сглаживание улучшает внешний вид «зубчатых» краев полигонов, или « зубцов », поэтому они сглаживаются на экране. Однако это влечет за собой снижение производительности графической карты и использование большего объема видеопамяти . Уровень сглаживания определяет, насколько гладкими будут края полигонов (и сколько видеопамяти они потребляют).
В верхней части изображения с отступающим шахматным узором изображение трудно распознать, и оно не выглядит эстетически привлекательным. Напротив, при сглаживании шахматная доска в верхней части переходит в серый цвет, что обычно является желаемым эффектом, когда разрешение недостаточно для отображения деталей. Даже в нижней части изображения края выглядят намного более гладкими на сглаженном изображении. Существует несколько методов, включая фильтр sinc , который считается лучшим алгоритмом сглаживания. [1] При увеличении можно увидеть, как сглаживание интерполирует яркость пикселей на границах, чтобы получить серые пиксели , поскольку пространство занято как черными, так и белыми плитками. Это помогает сделать изображение, сглаженное фильтром sinc, намного более гладким, чем исходное.
В простом изображении ромба сглаживание смешивает граничные пиксели; это уменьшает эстетически неприятный эффект резких, ступенчатых границ, которые появляются в сглаженной графике.
Сглаживание часто применяется при отображении текста на экране компьютера, чтобы предложить плавные контуры, которые лучше имитируют внешний вид текста, созданного с помощью обычной печати чернилами и бумагой. В частности, для шрифтов, отображаемых на типичных ЖК-экранах, обычно используются методы субпиксельной визуализации, такие как ClearType . Субпиксельная визуализация требует специальных фильтров сглаживания со сбалансированным цветом, чтобы превратить то, что было бы серьезным искажением цвета, в едва заметные цветные полосы. Эквивалентные результаты могут быть получены путем предоставления отдельным субпикселям адресуемых, как если бы они были полными пикселями, и предоставления аппаратного фильтра сглаживания, как это сделано в контроллере дисплея ноутбука OLPC XO-1 . Геометрия пикселей влияет на все это, независимо от того, выполняются ли сглаживание и субпиксельная адресация программным или аппаратным способом.
Самый простой подход к сглаживанию пикселя заключается в определении того, какой процент пикселя занимает заданная область векторной графики (в данном случае квадрат размером с пиксель, возможно, транспонированный на несколько пикселей), и использовании этого процента в качестве цвета.
Самый простой график одной сглаженной белой точки на черном с использованием этого метода можно построить следующим образом:
def plot_antialiased_point ( x : float , y : float ): """Построить одну сглаженную белую точку на черном фоне.""" for rounded_x in floor ( x ) to ceil ( x ): for rounded_y in floor ( y ) to ceil ( y ): percent_x = 1 - abs ( x - rounded_x ) percent_y = 1 - abs ( y - rounded_y ) percent = percent_x * percent_y draw_pixel ( ordinates = ( rounded_x , rounded_y ), color = percent ( range 0 - 1 ))
Этот метод, как правило, лучше всего подходит для простой графики, такой как базовые линии или кривые, и приложений, которые в противном случае должны были бы преобразовывать абсолютные координаты в координаты с пиксельным ограничением, такие как 3D-графика. Это довольно быстрая функция, но она относительно низкого качества и становится медленнее по мере увеличения сложности формы. Для целей, требующих очень высококачественной графики или очень сложных векторных фигур, это, вероятно, не будет лучшим подходом.
Примечание: draw_pixel
процедура выше не может слепо устанавливать значение цвета на рассчитанный процент. Она должна добавлять новое значение к существующему значению в этом месте до максимума 1. В противном случае яркость каждого пикселя будет равна самому темному значению, рассчитанному за время для этого места, что дает очень плохой результат. Например, если одна точка устанавливает уровень яркости 0,90 для данного пикселя, а другая точка, рассчитанная позже, едва касается этого пикселя и имеет яркость 0,05, окончательное значение, установленное для этого пикселя, должно быть 0,95, а не 0,05.
Для более сложных форм алгоритм можно обобщить как визуализацию фигуры в пиксельной сетке с более высоким разрешением, чем целевая поверхность дисплея (обычно кратным степени 2, чтобы уменьшить искажение), а затем использовать бикубическую интерполяцию для определения средней интенсивности каждого реального пикселя на поверхности дисплея.
В этом подходе идеальное изображение рассматривается как сигнал . Изображение, отображаемое на экране, берется как выборка, в каждой позиции пикселя ( x,y ) отфильтрованной версии сигнала. В идеале можно было бы понять, как человеческий мозг будет обрабатывать исходный сигнал, и предоставить на экране изображение, которое даст наиболее схожий ответ мозга.
Наиболее широко принятым аналитическим инструментом для таких задач является преобразование Фурье ; оно разлагает сигнал на базисные функции различных частот, известные как частотные компоненты, и дает нам амплитуду каждого частотного компонента в сигнале. Волны имеют вид:
где j и k — произвольные неотрицательные целые числа . Существуют также частотные компоненты, включающие функции синуса в одном или обоих измерениях, но для целей этого обсуждения косинуса будет достаточно.
Числа j и k вместе представляют собой частоту компонента: j — частота в направлении x , а k — частота в направлении y .
Целью антиалиасингового фильтра является значительное снижение частот выше определенного предела, известного как частота Найквиста , так что сигнал будет точно представлен его выборками, или почти так, в соответствии с теоремой о выборке ; существует множество различных вариантов детального алгоритма с различными функциями передачи фильтра . Текущие знания о человеческом визуальном восприятии в целом недостаточны, чтобы сказать, какой подход будет выглядеть лучше всего.
Предыдущее обсуждение предполагает, что выборка прямоугольной сетки является доминирующей частью проблемы. Фильтр, который обычно считается оптимальным, не является вращательно-симметричным, как показано на этом первом рисунке; это происходит потому, что данные выбираются на квадратной решетке , а не с использованием непрерывного изображения. Этот шаблон выборки является обоснованием для выполнения обработки сигнала вдоль каждой оси, как это традиционно делается для одномерных данных. Повторная выборка Ланцоша основана на свертке данных с дискретным представлением функции sinc.
Если разрешение не ограничено прямоугольной частотой дискретизации исходного или целевого изображения, то в идеале следует использовать вращательно-симметричный фильтр или функции интерполяции, как если бы данные были двумерной функцией непрерывных x и y. Функция sinc радиуса имеет слишком длинный хвост, чтобы сделать хороший фильтр (она даже не интегрируема с квадратом ). Более подходящим аналогом одномерного sinc является двумерная амплитуда диска Эйри , двумерное преобразование Фурье круговой области в двумерном частотном пространстве, в отличие от квадратной области.
Можно рассмотреть гауссиану плюс достаточно ее второй производной, чтобы сгладить вершину (в частотной области) или заострить ее (в пространственной области), как показано. Функции, основанные на гауссовой функции, являются естественным выбором, поскольку свертка с гауссовой дает другую гауссиану, независимо от того, применяется ли она к x и y или к радиусу. Подобно вейвлетам, еще одно ее свойство заключается в том, что она находится на полпути между локализацией в конфигурации (x и y) и в спектральном (j и k) представлении. Как функция интерполяции, гауссиана сама по себе кажется слишком размазанной, чтобы сохранить максимально возможную детализацию, и поэтому добавляется вторая производная.
Например, при печати фотографического негатива с обильными возможностями обработки на принтере с гексагональным шаблоном нет смысла использовать интерполяцию функции sinc. Такая интерполяция будет обрабатывать диагональные линии иначе, чем горизонтальные и вертикальные, что похоже на слабую форму наложения спектров.
В движке рендеринга в реальном времени (с программным или аппаратным ускорением) на самом низком уровне используется всего несколько примитивов . К ним относятся «точки», «линии» и «треугольники». Если нарисовать такой примитив белым на черном фоне, можно спроектировать такой примитив с размытыми краями, достигнув своего рода сглаживания. Однако этот подход с трудом справляется с соседними примитивами (например, треугольниками, имеющими общее ребро).
Для аппроксимации алгоритма равномерного усреднения можно использовать дополнительный буфер для субпиксельных данных. Первоначальный (и наименее требовательный к памяти) подход использовал 16 дополнительных бит на пиксель в сетке 4 × 4. Если визуализировать примитивы в аккуратном порядке, например, спереди назад, можно создать разумное изображение.
Поскольку это требует, чтобы примитивы были в каком-то порядке, и, следовательно, плохо взаимодействует с интерфейсом прикладного программирования, таким как OpenGL , последние методы просто имеют два или более полных субпикселя на пиксель, включая полную цветовую информацию для каждого субпикселя. Некоторая информация может быть общей для субпикселей (например, Z-буфер ).
Существует также подход, специализированный для текстурного отображения , называемый mipmapping , который работает путем создания предварительно отфильтрованных версий текстурной карты с более низким разрешением. При рендеринге изображения выбирается mipmap с соответствующим разрешением, и, следовательно, пиксели текстуры (текселы) уже отфильтрованы, когда они попадают на экран. Mipmapping обычно сочетается с различными формами текстурной фильтрации для улучшения конечного результата.
Поскольку фракталы имеют неограниченную детализацию и не имеют шума, кроме арифметической ошибки округления, они иллюстрируют алиасинг более наглядно, чем фотографии или другие измеренные данные. Времена выхода , которые преобразуются в цвета в точных центрах пикселей, стремятся к бесконечности на границе набора, поэтому цвета из центров вблизи границ непредсказуемы из-за алиасинга. Этот пример имеет края примерно в половине своих пикселей, поэтому он показывает много алиасинга. Первое изображение загружено с исходной частотой дискретизации. (Поскольку большинство современных программных сглаживаний, возможно, придется загрузить полноразмерную версию, чтобы увидеть все алиасинги.) Второе изображение вычисляется с пятикратной частотой дискретизации и понижается с помощью сглаживания. Если предположить, что действительно хотелось бы что-то вроде среднего цвета по каждому пикселю, это становится ближе. Оно явно более упорядоченное, чем первое.
Чтобы правильно сравнить эти изображения, необходимо просмотреть их в натуральную величину.
В этом случае оказывается, что есть дополнительная информация, которую можно использовать. С помощью повторного расчета с помощью алгоритма «оценщика расстояния» были идентифицированы точки, которые находятся очень близко к краю набора, так что необычно мелкие детали накладываются из-за быстро меняющегося времени выхода вблизи края набора. Цвета, полученные из этих вычисленных точек, были идентифицированы как необычно нерепрезентативные для своих пикселей. Набор там меняется быстрее, поэтому выборка из одной точки менее репрезентативна для всего пикселя. Эти точки были заменены на третьем изображении путем интерполяции точек вокруг них. Это уменьшает шумность изображения, но имеет побочный эффект в виде осветления цветов. Таким образом, это изображение не совсем то же самое, что было бы получено с еще большим набором вычисленных точек. Чтобы показать, что было отброшено, отброшенные точки, смешанные с серым фоном, показаны на четвертом изображении.
Наконец, «Budding Turbines» настолько регулярны, что систематическое (муаровое) наложение можно ясно увидеть около главной «оси турбины», когда она уменьшена путем взятия ближайшего пикселя. Наложение на первом изображении кажется случайным, потому что оно исходит от всех уровней детализации, ниже размера пикселя. Когда наложение на нижнем уровне подавляется, чтобы сделать третье изображение, а затем оно снова уменьшается по частоте, без сглаживания, чтобы сделать пятое изображение, порядок в масштабе третьего изображения выглядит как систематическое наложение на пятом изображении.
Чистая субдискретизация изображения имеет следующий эффект (рекомендуется просмотр в полном масштабе):
Супервыборочное сглаживание (SSAA) [ 2] , также называемое полноэкранным сглаживанием (FSAA), [3] используется для предотвращения сглаживания (или « ступенчатых » краев) на полноэкранных изображениях. [4] SSAA был первым типом сглаживания, доступным на ранних видеокартах. Но из-за его огромной вычислительной стоимости и появления поддержки мультивыборочного сглаживания (MSAA) на графических процессорах, он больше не используется широко в приложениях реального времени. MSAA обеспечивает несколько более низкое качество графики, но также огромную экономию вычислительной мощности.
Полученное изображение SSAA может казаться мягче и должно также выглядеть более реалистично. Однако, хотя простой подход сглаживания (такой как суперсэмплинг с последующим усреднением) полезен для изображений, похожих на фотографии, он может на самом деле ухудшить внешний вид некоторых типов штриховой графики или диаграмм (из-за чего изображение будет выглядеть размытым), особенно там, где большинство линий горизонтальные или вертикальные. В этих случаях может быть полезен предварительный шаг подгонки сетки (см. подсказку ).
В общем, суперсэмплинг — это метод сбора точек данных с большим разрешением (обычно в степени двойки), чем окончательное разрешение данных. Затем эти точки данных объединяются (понижаются) до желаемого разрешения, часто просто путем простого усреднения . Объединенные точки данных имеют менее заметные артефакты наложения (или муаровые узоры ).
Полноэкранное сглаживание с помощью суперсэмплинга обычно означает, что каждый полный кадр визуализируется с разрешением дисплея в два раза (2x) или четыре раза (4x) , а затем понижается до разрешения дисплея. Таким образом, 2x FSAA визуализирует 4 пикселя с суперсэмплированием для каждого отдельного пикселя каждого кадра. Рендеринг с большим разрешением даст лучшие результаты; однако требуется больше мощности процессора, что может ухудшить производительность и частоту кадров. Иногда FSAA реализовано на аппаратном уровне таким образом, что графическое приложение не знает, что изображения подвергаются суперсэмплированию, а затем понижаются перед отображением.
Система графического рендеринга создает изображение на основе объектов, построенных из полигональных примитивов; эффекты сглаживания в изображении можно уменьшить, применив схему сглаживания только к областям изображения, представляющим контуры силуэтов объектов. Контуры силуэтов сглаживаются путем создания примитивов сглаживания, которые различаются по непрозрачности. Эти примитивы сглаживания присоединяются к контурам силуэтов и создают область на изображении, где объекты кажутся сливающимися с фоном. Метод имеет некоторые важные преимущества по сравнению с классическими методами, основанными на буфере накопления [ необходимо разъяснение ], поскольку он генерирует сглаживание всей сцены всего за два прохода и не требует использования дополнительной памяти, требуемой буфером накопления. Сглаживание на основе объектов было впервые разработано в Silicon Graphics для их рабочей станции Indy .
Цифровые изображения обычно хранятся в гамма-сжатом формате, но большинство оптических фильтров сглаживания являются линейными. Поэтому для понижения разрешения изображения таким образом, чтобы оно соответствовало оптическому размытию, следует сначала преобразовать его в линейный формат, затем применить фильтр сглаживания и, наконец, преобразовать его обратно в гамма-сжатый формат. [5] Использование линейной арифметики на гамма-сжатом изображении приводит к значениям, которые немного отличаются от идеального фильтра. Эта ошибка больше при работе с высококонтрастными областями, в результате чего высококонтрастные области становятся более тусклыми: яркие детали (например, усы кошки) становятся визуально тоньше, а темные детали (например, ветви деревьев) становятся толще по сравнению с оптически сглаженным изображением. [6] Каждый пиксель индивидуально искажается, что означает, что контуры становятся негладкими после сглаживания. Поскольку преобразование в линейный формат и обратно значительно замедляет процесс, а различия обычно незначительны, большинство программ для редактирования изображений , включая Final Cut Pro и Adobe Photoshop , обрабатывают изображения в области гамма-сжатия.
Большинство современных графических процессоров поддерживают хранение текстур в памяти в формате sRGB и могут выполнять преобразование в линейное пространство и обратно прозрачно, практически без потери производительности.
Важные ранние работы в истории сглаживания включают в себя: