Алгоритмы масштабирования пиксельной графики

редактировать

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

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

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

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

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

Содержание

  • 1 Алгоритмы
    • 1.1 SAA5050 «диагональное сглаживание»
    • 1.2 EPX / Scale2 × / AdvMAME2 ×
      • 1.2.1 Scale3 × / AdvMAME3 × и ScaleFX
    • 1.3 Eagle
    • 1.4 2 × SaI
    • 1.5 Семейство hqnx
    • 1.6 Семейство xBR
    • 1.7 RotSprite
      • 1.7.1 Fast RotSprite
    • 1.8 Kopf – Lischinski
    • 1.9 Edge -Направленная интерполяция (EDI)
      • 1.9.1 NEDI
      • 1.9.2 EDIUpsizer
      • 1.9.3 FastEDIUpsizer
      • 1.9.4 eedi3
      • 1.9.5 EEDI2
      • 1.9.6 SuperRes
      • 1.9.7 NNEDI
  • 2 Ссылки
  • 3 См. Также

Алгоритмы

«диагональное сглаживание» SAA5050

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

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

A B C - \ 1 2 D E F - / 3 4 1 = 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, которые работали с более или менее удвоенным разрешением. Алгоритм работает следующим образом, расширяя P до 4 новых пикселей на основе окружения P:

Алгоритм EPX расширяет пиксель P на четыре новых пикселя.

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

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

1 = Р; 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 AND C! = A =>3 = C IF B == D AND B! = A AND D! = C =>4 = D

AdvMAME2 × доступен в DOSBox через Параметр scaler=advmame2xdosbox.conf.

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

Scale3 × / AdvMAME3 × и ScaleFX

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

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

AdvMAME3x / Scale3x масштабирует пиксель E на 9 новых пикселей

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

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

Eagle

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

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

сначала: | Затем... - \ CC | S T U - \ 1 2. C. - / CC | V C W - / 3 4... | X Y Z | ЕСЛИ V == S == T =>1 = S | ЕСЛИ T == U == W =>2 = U | ЕСЛИ V == X == Y =>3 = X | IF 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, масштабируется:

IEFJGABK - \ WXHCDL - / YZMNOP

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

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

INTERPOLATE (uint32 A, UINT32 B) if (A == B) return A; return (((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 выпустил исходный код под Стандартной общественной лицензией GNU, он находится в свободном доступе для всех, кто желает использовать его в проекте, выпущенном под этой лицензией. Разработчикам, желающим использовать его в проектах без GPL, потребуется переписать алгоритм без использования какого-либо существующего кода Kreed.

Он доступен в DosBox через параметр scaler = 2xsai.

Семейство hqnx

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

hqnx изначально был создан для эмулятора Super Nintendo ЗСНЕС. Автор bsnes выпустил компактную реализацию hq2x в общественное достояние. Доступен порт для шейдеров, качество которого сопоставимо с ранними версиями xBR. До порта шейдер под названием «scalehq» часто путали с hqx.

семейство xBR

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

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

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

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

RotSprite

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

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

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

Fast RotSprite

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

Вместо 8-кратного увеличения, Fast RotSprite использует Scale3x для увеличения в 3 раза. Далее следует этап совместного вращения и усреднения. Чтобы избежать появления нового цвета, усредненный цвет привязывается к ближайшему цвету в палитре. Детали алгоритма, как правило, неизвестны, поскольку он является собственностью и продается в Unity Asset Store.

Копф – Лищински

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

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

Edge-Directed Interpolation (EDI)

Edge-Directed Interpolation (EDI) описывает методы апскейлинга, которые используют статистическую выборку для обеспечения качество изображения при его увеличении. Существовало несколько более ранних методов, которые включали обнаружение краев для генерации весов смешивания для линейной интерполяции или классификации пикселей в соответствии с их соседними условиями и с использованием различных схем изотропной интерполяции, основанных на классификации. Любой заданный подход к интерполяции сводится к средневзвешенному значению соседних пикселей. Цель - найти оптимальный вес. Билинейная интерполяция устанавливает все веса равными. Методы интерполяции более высокого порядка, такие как бикубическая или синк-интерполяция, учитывают большее количество соседей, чем просто соседние.

NEDI

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

EDIUpsizer

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

FastEDIUpsizer

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

eedi3

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

EEDI2

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

SuperRes

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

NNEDI

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

NNEDI, исходная версия, работает с входом YUY2 и YV12. NNEDI2 добавил поддержку RGB24 и специальную функцию nnedi2_rpow2для апскейлинга. NNEDI3 усиливает NNEDI2 с помощью предсказателя нейронной сети. Как размер сети, так и окружение, которое она исследует, могут быть изменены для достижения компромисса между скоростью и качеством:

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

Ссылки

См. Также

  • libretro - реализует многие вышеупомянутые алгоритмы в виде шейдеров
Последняя правка сделана 2021-06-02 07:11:32
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте