Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

Для обработки пиксельной графики был разработан ряд специализированных алгоритмов [1] , поскольку традиционные алгоритмы масштабирования не принимают во внимание такие перцепционные сигналы.

Поскольку типичным применением этой технологии является улучшение внешнего вида видеоигр четвертого и более ранних поколений на аркадных и консольных эмуляторах, многие из них предназначены для работы в реальном времени для достаточно маленьких входных изображений со скоростью 60 кадров в секунду . Это накладывает ограничения на тип методов программирования , которые можно использовать для такого рода обработки в реальном времени. Многие работают только с определенными масштабными коэффициентами: 2 × является наиболее распространенным, также присутствуют 3 ×, 4 ×, 5 × и 6 ×.

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

Алгоритмы [ править ]

SAA5050 'диагональное сглаживание' [ править ]

Mullard SAA5050 чип генератора символов телетекста (1980) используется примитивный алгоритм масштабирования пикселя для генерации символов более высокого разрешения на экране с низким разрешением представления от его внутреннего ПЗУ. Внутри каждая форма символа была определена на сетке 5 × 9 пикселей, которая затем была интерполирована путем сглаживания диагоналей, чтобы дать символ 10 × 18 пикселей с характерной угловой формой, окруженный сверху и слева двумя пикселями пустого пространства. . Алгоритм работает только с монохромными исходными данными и предполагает, что исходные пиксели будут логически истинными или ложными, в зависимости от того, включены они или нет. Предполагается, что пиксели «вне сетки» отключены. [2] [3] [4]

Алгоритм работает следующим образом:

ABC - \ 1 2DEF - / 3 41 = B | (A & E &! B &! D)2 = B | (C & E &! B &! F)3 = E | (! A &! E & B & D)4 = E | (! C &! E & B & F)

Обратите внимание, что этот алгоритм, как и приведенный ниже алгоритм Eagle, имеет недостаток: если появляется узор из 4 пикселей в форме полого ромба, пустота будет стерта расширением. Внутреннее символьное ПЗУ SAA5050 тщательно избегает использования этого шаблона.

EPX / Scale2 × / AdvMAME2 ×[ редактировать ]

Pixel Expansion Эрика (EPX) - это алгоритм, разработанный Эриком Джонстоном в LucasArts примерно в 1992 году при переносе игр на движке SCUMM с IBM PC (который работал с цветовой палитрой 320 × 200 × 256 цветов) на ранние цветные компьютеры Macintosh, которые работали на более высоком уровне. или менее вдвое больше этого разрешения. [5] Алгоритм работает следующим образом, расширяя P до 4 новых пикселей в зависимости от окружения P:

1 = P; 2 = P; 3 = P; 4 = P; ЕСЛИ C == A => 1 = A ЕСЛИ A == B => 2 = B ЕСЛИ D == C => 3 = C ЕСЛИ B == D => 4 = D ЕСЛИ A, B, C, D, три или более идентичны: 1 = 2 = 3 = 4 = P

Более поздние реализации этого же алгоритма (например, AdvMAME2 × и Scale2 ×, разработанные примерно в 2001 году) имеют несколько более эффективную, но идентичную функционально реализацию:

1 = P; 2 = P; 3 = P; 4 = P; ЕСЛИ C == A И C! = D И A! = B => 1 = A ЕСЛИ A == B И A! = C И B! = D => 2 = B ЕСЛИ D == C И D! = B И C! = A => 3 = C ЕСЛИ B == D AND B! = A AND D! = C => 4 = D

AdvMAME2 × доступен в DOSBox через опцию scaler=advmame2x dosbox.conf .

Алгоритм AdvMAME4 × / Scale4 × - это просто EPX, применяемый дважды, чтобы получить разрешение 4 ×.

Scale3 × / AdvMAME3 × и ScaleFX [ править ]

EPX можно использовать для масштабирования растровых шрифтов. Сверху вниз: а) исходный размер шрифта; б) ближайшего соседа 2-кратное масштабирование; в) EPX 2 × масштабирование; d) 3-кратное масштабирование ближайшего соседа; д) 3-кратное масштабирование EPX.

Алгоритм AdvMAME3 × / Scale3 × (доступный в DOSBox через параметр scaler=advmame3x dosbox.conf ) можно рассматривать как обобщение EPX на случай 3 ×. Угловые пиксели рассчитываются аналогично EPX.

1 = E; 2 = E; 3 = E; 4 = E; 5 = E; 6 = E; 7 = E; 8 = E; 9 = E; ЕСЛИ D == B И D! = H И B! = F => 1 = D ЕСЛИ (D == B И D! = H И B! = F И E! = C) ИЛИ (B == F И B! = D И F! = H И E! = A) => 2 = B ЕСЛИ B == F И B! = D И F! = H => 3 = F ЕСЛИ (H == D AND H! = F AND D! = B AND E! = A) ИЛИ (D == B AND D! = H AND B! = F AND E! = G) => 4 = D 5 = E ЕСЛИ (B == F AND B! = D AND F! = H AND E! = I) ИЛИ (F == H AND F! = B AND H! = D AND E! = C) => 6 = F ЕСЛИ H == D AND H! = F AND D! = B => 7 = D ЕСЛИ (F == H AND F! = B AND H! = D AND E! = G) ИЛИ (H == D AND H! = F AND D! = B AND E! = I) => 8 = H ЕСЛИ F == H И F! = B И H! = D => 9 = F

Существует также вариант, улучшенный по сравнению с Scale3x, под названием ScaleFX, разработанный Sp00kyFox, и версия, объединенная с Reverse-AA, под названием ScaleFX-Hybrid. [6] [7]

Орел [ править ]

Eagle работает следующим образом: на каждый in-пиксель мы сгенерируем 4 out пикселя. Сначала установите для всех 4 цвет пикселя in, который мы в настоящее время масштабируем (как ближайший сосед). Затем посмотрите на три пикселя вверху, слева и по диагонали вверху слева: если все три имеют одинаковый цвет, установите для верхнего левого пикселя нашего выходного квадрата этот цвет, а не цвет ближайшего соседа. Проделайте то же самое для всех четырех пикселей, а затем перейдите к следующему. [8]

Предположим, что входная матрица размером 3x3 пикселя, где самый центральный пиксель является пикселем, который нужно масштабировать, и выходная матрица 2x2 пикселя (т. Е. Масштабированный пиксель)

сначала: | Затем. . . - \ CC | СТЮ - \ 1 2. C. - / CC | VCW - / 3 4. . . | XYZ | ЕСЛИ V == S == T => 1 = S | ЕСЛИ T == U == W => 2 = U | ЕСЛИ V == X == Y => 3 = X | ЕСЛИ W == Z == Y => 4 = Z

Таким образом, если у нас есть единственный черный пиксель на белом фоне, он исчезнет. Это ошибка алгоритма Eagle, но она решается другими алгоритмами, такими как EPX, 2xSaI и HQ2x.

2 × SaI [ править ]

2 × SaI, сокращение от 2 × Scale and Interpolation engine, был вдохновлен Eagle. Он был разработан Дереком Лиау Ки Фа, также известным как Kreed, в первую очередь для использования в консольных и компьютерных эмуляторах , и остается довольно популярным в этой нише. Многие из самых популярных эмуляторов, включая ZSNES и VisualBoyAdvance , предлагают этот алгоритм масштабирования в качестве функции. Доступно несколько немного разных версий алгоритма масштабирования, которые часто называют Super 2 × SaI и Super Eagle .

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

Семейство 2xSaI работает с матрицей пикселей 4 × 4, в которой пиксель, помеченный ниже A, масштабируется:

IEFJГАБК - \ WXHCDL - / YZMNOP

Для 16-битных пикселей, они используют маски пикселов , которые изменяются в зависимости от того , является ли 16-битовый формат пикселей 565 или 555. констант colorMask, lowPixelMask, qColorMask, qLowPixelMask, redBlueMask, и представляют greenMaskсобой 16-битные маски. Младшие 8 бит идентичны в любом формате пикселей.

Описываются две функции интерполяции:

ИНТЕРПОЛЯЦИЯ (uint32 A, UINT32 B) если (A == B) вернуть A; возвращаться ( ((A & colorMask) >> 1) + ((B & colorMask) >> 1) + (A & B & lowPixelMask));Q_INTERPOLATE (uint32 A, uint32 B, uint32 C, uint32 D) x = ((A & qColorMask) >> 2) + ((B & qColorMask) >> 2) + ((C & qColorMask) >> 2) + ((D & qColorMask) >> 2); y = (A & qLowPixelMask) + (B & qLowPixelMask) + (C & qLowPixelMask) + (D & qLowPixelMask); у = (у >> 2) & qLowPixelMask; вернуть x + y;

Алгоритм проверяет A, B, C и D на диагональное совпадение, такое, что A==Dи B!=C, или наоборот, или если они обе диагонали, или нет ли диагонального совпадения. В них он проверяет наличие трех или четырех одинаковых пикселей. На основе этих условий алгоритм решает, использовать ли один из A, B, C или D или интерполяцию только из этих четырех для каждого выходного пикселя. Устройство произвольного масштабирования 2xSaI может увеличивать любое изображение до любого разрешения и использует билинейную фильтрацию для интерполяции пикселей.

Поскольку Kreed выпустил [9] исходный код под Стандартной общественной лицензией GNU , он бесплатно доступен для всех, кто желает использовать его в проекте, выпущенном под этой лицензией. Разработчики, желающие использовать его в проекте без GPL, должны будут переписать алгоритм без использования какого-либо существующего кода Kreed.

Он доступен в DosBox через scaler=2xsaiопцию.

семья hq n x [ править ]

Параметры Максима Степина hq2x, hq3x и hq4x предназначены для масштабных коэффициентов 2: 1, 3: 1 и 4: 1 соответственно. Каждый работает, сравнивая значение цвета каждого пикселя со значениями цвета его восьми непосредственных соседей, отмечая соседей как близких или удаленных, и используя предварительно сгенерированную таблицу поиска, чтобы найти правильную пропорцию значений входных пикселей для каждого из 4, 9 или 16 соответствующих выходных пикселей. Семейство hq3x идеально сглаживает любую диагональную линию с наклоном ± 0,5, ± 1 или ± 2, которая не сглаживается на входе; один с любым другим наклоном будет чередоваться между двумя наклонами на выходе. Он также сгладит очень крутые изгибы. В отличие от 2xSaI, он сглаживает вывод. [10]

hq n x изначально создавался для эмулятора Super Nintendo ZSNES . Автор bsnes опубликовал компактную реализацию hq2x. [11] Доступен порт для шейдеров , качество которого сопоставимо с ранними версиями xBR. [12] До порта шейдер под названием «scalehq» часто путали с hqx. [13]

семейство xBR [ править ]

В этом семействе 6 фильтров: xBR , xBRZ , xBR-Hybrid , Super xBR , xBR + 3D и Super xBR + 3D .

xBR («масштабирование по правилам»), созданный Hyllian, работает во многом так же, как HQx (на основе распознавания образов), и будет генерировать тот же результат, что и HQx, если задан вышеуказанный образец. [14] Однако он идет дальше, чем HQx, за счет использования двухэтапного набора правил интерполяции , который лучше обрабатывает более сложные шаблоны, такие как сглаженные линии и кривые. Масштабированные текстуры фона сохраняют резкие характеристики исходного изображения, а не становятся размытыми, как это обычно бывает с HQx (часто ScaleHQ на практике). Последние версии xBR являются многопроходными и лучше сохраняют мелкие детали. Существует также версия xBR в сочетании с шейдером Reverse-AA, называемая xBR-Hybrid. [15] xBR + 3D - это версия с 3D-маской, которая фильтрует только 2D-элементы.

xBRZ от Zenju - это модифицированная версия xBR. Он реализован с нуля как фильтр на базе ЦП в C ++ . [16] Он использует ту же основную идею, что и распознавание образов и интерполяция xBR, но с другим набором правил, предназначенным для сохранения мелких деталей изображения размером до нескольких пикселей. Это делает его полезным для масштабирования деталей лиц и, в частности, глаз. xBRZ оптимизирован для многоядерных процессоров и 64-разрядных архитектур и показывает на 40–60% лучшую производительность, чем HQx, даже при работе только на одном ядре процессора. [ необходима цитата ] Он поддерживает масштабирование изображений с помощью альфа-канала и масштабирование с помощью целочисленных коэффициентов от 2 × до 6 ×.

Super xBR [17] [18] - это алгоритм, разработанный Hylian в 2015 году. Он использует некоторые комбинации известных линейных фильтров вместе с правилами обнаружения границ xBR нелинейным способом. Он работает в два прохода и может масштабировать изображение только в два раза (или кратно двум, повторно применяя его, а также имеет фильтр, предотвращающий звон). Super xBR + 3D - это версия с 3D-маской, которая фильтрует только 2D-элементы. Также существует версия Super xBR, переписанная на C / C ++. [19]

RotSprite [ править ]

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

RotSprite - это алгоритм масштабирования и вращения для спрайтов, разработанный Xenowhirl. Он производит гораздо меньше артефактов, чем алгоритмы вращения ближайшего соседа, и, как и EPX, он не вводит новые цвета в изображение (в отличие от большинства систем интерполяции). [20]

Алгоритм сначала масштабирует изображение до 8-кратного его исходного размера с помощью модифицированного алгоритма Scale2x, который обрабатывает похожие (а не идентичные) пиксели как совпадения. Затем (необязательно) вычисляется, какое смещение поворота использовать, отдавая предпочтение выбранным точкам, которые не являются граничными пикселями. Затем создается повернутое изображение с помощью алгоритма масштабирования и поворота ближайшего соседа, который одновременно сжимает большое изображение до его исходного размера и поворачивает изображение. Наконец, пропущенные детали одного пикселя (необязательно) восстанавливаются, если соответствующий пиксель в исходном изображении отличается, а у целевого пикселя есть три идентичных соседа. [21]

Fast RotSprite [ править ]

Fast RotSprite - это алгоритм быстрого вращения пиксельной графики, разработанный Олегом Мекекечко для приложения Pixel Studio . Он основан на RotSprite, но имеет лучшую производительность с небольшой потерей качества. Он может обрабатывать изображения большего размера в реальном времени. Вместо 8-кратного апскейла Fast RotSprite использует одиночный 3-х кратный апскейл. Затем он просто поворачивает все пиксели с координатами округления. Наконец, он выполняет 3-кратное уменьшение без введения новых цветов. Поскольку все операции на каждом шаге независимы, их можно выполнять параллельно, что значительно увеличивает производительность.

Копф-Лищинский [ править ]

Алгоритм Копфа – Лищинского - это новый способ извлечения векторной графики, не зависящей от разрешения, из пиксельной графики, описанной в статье 2011 года «Депикселизация пиксельной графики». [22] Доступна реализация Python. [23]

Алгоритм был перенесен на графические процессоры и оптимизирован для рендеринга в реальном времени. Исходный код доступен для этого варианта. [24]

Edge-Directed Interpolation (EDI) [ править ]

Направленная на края интерполяция (EDI) описывает методы увеличения масштаба, которые используют статистическую выборку для обеспечения качества изображения при его увеличении. [25] [26] Было несколько более ранних методов, которые включали обнаружение краев для генерации весов смешивания для линейной интерполяции или классификации пикселей в соответствии с их соседними условиями и с использованием различных схем изотропной интерполяции, основанных на классификации. Любой заданный подход к интерполяции сводится к средневзвешенному значению соседних пикселей. Цель - найти оптимальный вес. Билинейная интерполяция устанавливает одинаковые веса. Методы интерполяции более высокого порядка, такие как бикубическая или синк-интерполяция учитывайте большее количество соседей, чем просто соседние.

NEDI [ править ]

NEDI (New Edge-Directed Interpolation) вычисляет локальные ковариации в исходном изображении и использует их для адаптации интерполяции с высоким разрешением. Это прототип фильтра этого семейства. [27]

EDIUpsizer [ править ]

EDIUpsizer [28] - это фильтр передискретизации, который увеличивает размер изображения в два раза как по горизонтали, так и по вертикали с помощью NEDI (новая интерполяция по краям). [27] EDIUpsizer также использует несколько модификаций базовой NEDI для предотвращения множества артефактов, которые NEDI создает в детализированных областях. К ним относятся проверка числа условий и адаптивный размер окна [29], а также ограничения ограничения. Все модификации и ограничения NEDI являются необязательными (могут быть включены и выключены) и настраиваются пользователем. Сразу отметим, что этот фильтр довольно медленный.

FastEDIUpsizer [ править ]

FastEDIUpsizer - это упрощенная версия EDIUpsizer, которая немного больше настроена на скорость. Он использует постоянный размер окна 8 × 8, выполняет NEDI только в плоскости яркости и использует только бикубическую или билинейную интерполяцию в качестве метода обратной интерполяции.

eedi3 [ править ]

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

EEDI2 [ править ]

EEDI2 изменяет размер изображения в 2 раза по вертикали, копируя существующее изображение в 2⋅y (n) и интерполируя отсутствующее поле. Он предназначен для интерполяции по краям для деинтерлейсинга (т.е. на самом деле не предназначен для изменения размера обычного изображения, но также может это делать). EEDI2 можно использовать как с TDeint, так и с TIVTC, см. Ссылку на обсуждение для получения дополнительной информации о том, как это сделать. [30]

SuperRes [ править ]

Шейдеры SuperRes [31] используют другой метод масштабирования, который можно использовать в сочетании с NEDI (или любым другим алгоритмом масштабирования). Этот метод подробно объясняется здесь. [32] Этот метод, кажется, дает лучшие результаты, чем просто использование NEDI, и конкурирует с NNEDI3. Теперь они также доступны в виде сценария рендеринга MPDN.

ННЭДИ [ править ]

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

NNEDI, исходная версия, работает с входом YUY2 и YV12. [33] В NNEDI2 добавлена ​​поддержка RGB24 и специальная функция nnedi2_rpow2масштабирования. NNEDI3 расширяет NNEDI2 с помощью нейронной сети- предиктора . И размер сети, и окружение, которое она исследует, могут быть изменены для достижения компромисса между скоростью и качеством: [34]

Это вариант соотношения качества и скорости; однако различия обычно невелики между количеством нейронов для определенного коэффициента изменения размера, однако разница в производительности между количеством нейронов становится больше, когда вы увеличиваете размер изображения в четыре раза. Если вы планируете только удвоить разрешение, вы не увидите огромных различий между 16 и 256 нейронами. Между высшим и низшим вариантами все еще есть заметная разница, но не на порядки. [35]

Ссылки [ править ]

  1. ^ "Pixel Scaler" . Проверено 19 февраля +2016 .
  2. ^ "Mullard SAA5050 Datasheet" (PDF) .
  3. ^ "SAA5050 Исходный код сглаживания из проекта MAME" .
  4. ^ "Сообщение на форуме, показывающее справочную тестовую страницу телетекста на микросхеме SAA5050" .
  5. Перейти ↑ Thomas, Kas (1999). «Стратегии Fast Blit: Руководство программиста Mac» . MacTech .
  6. ^ либретро. "общие шейдеры / масштабирование в мастер · libretro / общие шейдеры · GitHub" . GitHub . Проверено 19 февраля +2016 .
  7. ^ «ScaleNx - Удаление артефактов и улучшение алгоритмов [Архив]» . Архивировано из оригинала на 2016-05-27 . Проверено 27 мая 2016 .
  8. ^ "Орел (идея)" . Все 2 . 2007-01-18.
  9. ^ "Домашняя страница Крида: 2xSaI" . Проверено 25 апреля 2020 года .
  10. ^ Степин, Максим. «Фильтр увеличения hq3x» . Архивировано из оригинала на 2007-07-03 . Проверено 3 июля 2007 .
  11. ^ Бюу. Объявление о выпуске Проверено 14 августа 2011 г.
  12. ^ либретро. "общие шейдеры / hqx в мастер · libretro / общие шейдеры · GitHub" . GitHub . Проверено 19 февраля +2016 .
  13. ^ Хантер К. «Грязные штаны: компьютерный блог» . Проверено 19 февраля +2016 .
  14. ^ "Учебник по алгоритму xBR" . 2012-09-18 . Проверено 19 февраля +2016 .
  15. ^ либретро. "общие шейдеры / xbr в мастер · libretro / общие шейдеры · GitHub" . GitHub . Проверено 19 февраля +2016 .
  16. ^ дзэндзю. «xBRZ» . SourceForge . Проверено 19 февраля +2016 .
  17. ^ "Super-xBR.pdf" . Документы Google . Проверено 19 февраля +2016 .
  18. ^ либретро. «common-shaders / xbr / shaders / super-xbr в мастер · libretro / common-shaders · GitHub» . GitHub . Проверено 19 февраля +2016 .
  19. ^ «Super-XBR перенесен на C / C ++ (только для Fast шейдеров)» . 6 марта 2016.
  20. ^ "RotSprite" . Соник Ретро . Проверено 19 февраля +2016 .
  21. ^ «Утилита вращения спрайтов» . Доска объявлений Sonic и Sega Retro . Проверено 19 февраля +2016 .
  22. ^ Йоханнес Kopf и Дани Lischinski (2011). «Депикселизация пиксельной графики» . Транзакции ACM на графике . СИГГРАФ . 30 (4): 99: 1–99: 8. DOI : 10.1145 / 2010324.1964994 . Проверено 22 мая 2016 .
  23. ^ Вемула, Анирудх; Йедду, Вамсидхар (29 апреля 2019 г.). «Пиксель-арт: мы реализуем знаменитую бумагу Копфа и Лищински« Депикселизирующая пиксельная графика » .
  24. ^ Крейцер, Феликс; Копф, Йоханнес; Виммер, Майкл (2015). «Депикселизация пиксель-арта в реальном времени» . Материалы 19-го симпозиума по интерактивной 3D-графике и играм . ACM: 130. DOI : 10,1145 / 2699276,2721395 . ISBN 9781450333924.
  25. ^ "Edge-Directed Interpolation" . chiranjivi.tripod.com . Проверено 7 мая 2019 .
  26. ^ "Шейдерная реализация алгоритма NEDI - Форум Doom9" . forum.doom9.org . Проверено 7 мая 2019 .
  27. ^ а б Ли, Синь (26 ноября 2010 г.). «Новая интерполяция, направленная по краям» (PDF) . Архивировано из оригинального (PDF) 26 ноября 2010 года . Проверено 7 мая 2019 .
  28. Фильтры Avisynth от компании ^ tritical
  29. ^ https://web.archive.org/web/20041221052401/http://www.cs.ucdavis.edu/~bai/ECS231/finaltzeng.pdf
  30. ^ "TDeint и TIVTC - Страница 21 - Форум Doom9" . Проверено 19 февраля +2016 .
  31. ^ "nnedi3 vs NeuronDoubler - Форум Doom9" . Проверено 19 февраля +2016 .
  32. ^ "Шейдерная реализация алгоритма NEDI - Страница 6 - Форум Doom9" . Проверено 19 февраля +2016 .
  33. ^ "NNEDI - фильтр деинтерлейсинга внутри поля - Форум Doom9" . Проверено 19 февраля +2016 .
  34. ^ "Ннеди3" . AviSynth . Проверено 7 мая 2019 .
  35. ^ tritical (30.04.2019), nnedi3 - Readme.txt , получено 07.05.2019

См. Также [ править ]

  • libretro - реализует многие вышеупомянутые алгоритмы как шейдеры