- Изображение увеличено в 3 раза с помощью интерполяции по ближайшему соседу
- Изображение увеличено в 3 раза с помощью алгоритма hq3x
Алгоритмы масштабирования пиксельной графики — это графические фильтры, которые пытаются улучшить внешний вид рисованной 2D- графики пиксельной графики . Эти алгоритмы являются формой автоматического улучшения изображения. Алгоритмы масштабирования пиксельной графики используют методы, значительно отличающиеся от обычных методов масштабирования изображений , которые имеют целью сохранение внешнего вида изображений.
Поскольку пиксельная графика обычно используется при очень низких разрешениях , она использует тщательную раскраску отдельных пикселей. Это приводит к графике, которая опирается на большое количество стилизованных визуальных подсказок для определения сложных форм. Было разработано несколько специализированных алгоритмов [1] для обработки масштабирования такой графики.
Эти специализированные алгоритмы могут улучшить внешний вид пиксельной графики, но при этом они вносят изменения. Такие изменения могут быть нежелательными, особенно если целью является точное воспроизведение оригинального внешнего вида.
Поскольку типичным применением этой технологии является улучшение внешнего вида видеоигр четвертого поколения и более ранних версий на аркадных и консольных эмуляторах , многие алгоритмы масштабирования пиксельной графики разработаны для работы в реальном времени для достаточно маленьких входных изображений со скоростью 60 кадров в секунду . Это накладывает ограничения на тип методов программирования , которые могут использоваться для такого рода обработки в реальном времени. [ необходима цитата ] Многие работают только с определенными коэффициентами масштабирования. 2× является наиболее распространенным коэффициентом масштабирования, в то время как 3×, 4×, 5× и 6× существуют, но используются реже.
Микросхема генератора символов телетекста Mullard SAA5050 (1980) использовала примитивный алгоритм масштабирования пикселей для генерации символов с более высоким разрешением на экране из представления с более низким разрешением из своего внутреннего ПЗУ . Внутри каждая форма символа была определена на сетке 5 × 9 пикселей, которая затем была интерполирована сглаживанием диагоналей для получения символа 10 × 18 пикселей с характерной угловатой формой, окруженного сверху и слева двумя пикселями пустого пространства. Алгоритм работает только с монохромными исходными данными и предполагает, что исходные пиксели будут логически истинными или ложными в зависимости от того, включены они или выключены. Пиксели «вне шаблона сетки» считаются выключенными. [2] [3] [4]
Алгоритм работает следующим образом:
АБВ --\ 1 2ОПРЕДЕЛЕНИЕ --/ 3 41 = Б | (А & Е & !Б & !Г)2 = Б | (С и Э и !Б и !Е)3 = Э | (!А & !Э & Б & Г)4 = Э | (!С & !Э & Б & Е)
Обратите внимание, что этот алгоритм, как и алгоритм Eagle ниже, имеет недостаток: если появляется шаблон из 4 пикселей в форме полого ромба, то этот шаблон будет стерт расширением. Внутреннее ПЗУ символов SAA5050 тщательно избегает использования этого шаблона.
Вырожденный случай:
* * * *
становится:
** **** ****** ****** **** **
Eric's Pixel Expansion (EPX) — алгоритм, разработанный Эриком Джонстоном в LucasArts примерно в 1992 году при портировании игр на движке SCUMM с IBM PC (которые работали с разрешением 320 × 200 × 256 цветов) на ранние цветные компьютеры Macintosh, которые работали с разрешением, примерно в два раза большим. [5] Алгоритм работает следующим образом, расширяя P до 4 новых пикселей на основе окружения P:
1=П; 2=П; 3=П; 4=П; ЕСЛИ С==А => 1=А ЕСЛИ А==Б => 2=Б ЕСЛИ D==C => 3=C ЕСЛИ В==D => 4=D ЕСЛИ из A, B, C, D три или более идентичны: 1=2=3=4=P
Более поздние реализации этого же алгоритма (например, AdvMAME2× и Scale2×, разработанные около 2001 года) немного более эффективны, но функционально идентичны:
1=П; 2=П; 3=П; 4=П; ЕСЛИ C==A И C!=D И A!=B => 1=A ЕСЛИ А==Б И А!=С И Б!=D => 2=Б ЕСЛИ D==C И D!=B И C!=A => 3=C ЕСЛИ B==D И B!=A И D!=C => 4=D
AdvMAME2× доступен в DOSBox через опцию scaler=advmame2x
dosbox.conf .
Алгоритм AdvMAME4×/Scale4× — это просто EPX, примененный дважды для получения разрешения 4×.
Алгоритм AdvMAME3×/Scale3× (доступный в DOSBox через опцию scaler=advmame3x
dosbox.conf ) можно рассматривать как обобщение EPX на случай 3×. Угловые пиксели рассчитываются идентично EPX.
1=Е; 2=Е; 3=Е; 4=Е; 5=Е; 6=Е; 7=Е; 8=Е; 9=Е; ЕСЛИ 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 И H!=F И D!=B И E!=A) ИЛИ (D==B И D!=H И B!=F И E!=G) => 4=D 5=Э ЕСЛИ (B==F И B!=D И F!=H И E!=I) ИЛИ (F==H И F!=B И H!=D И E!=C) => 6=F ЕСЛИ Н==D И Н!=F И D!=B => 7=D ЕСЛИ (F==H И F!=B И H!=D И E!=G) ИЛИ (H==D И H!=F И D!=B И E!=I) => 8=H ЕСЛИ F==H И F!=B И H!=D => 9=F
Существует также улучшенный вариант Scale3× под названием ScaleFX, разработанный Sp00kyFox, и версия, объединенная с Reverse-AA, под названием ScaleFX-Hybrid. [6] [7] [8]
Eagle работает следующим образом: для каждого входящего пикселя мы сгенерируем 4 исходящих пикселя. Сначала установим все 4 на цвет пикселя, который мы в данный момент масштабируем (как ближайшего соседа). Затем посмотрим на три пикселя выше, слева и по диагонали выше левого: если все три имеют одинаковый цвет, установим верхний левый пиксель нашего выходного квадрата на этот цвет вместо цвета ближайшего соседа. Работайте аналогично для всех четырех пикселей, а затем переходите к следующему. [9]
Предположим, что входная матрица имеет размер 3 × 3 пикселя, где центральный пиксель — это пиксель, который нужно масштабировать, и выходная матрица имеет размер 2 × 2 пикселя (т. е. масштабированный пиксель).
сначала: |затем. . . --\ CC |СТЮ --\ 1 2. С . --/ CC |VCW --/ 3 4. . . |XYZ | ЕСЛИ V==S==T => 1=S | ЕСЛИ Т==U==W => 2=U | ЕСЛИ V==X==Y => 3=X | ЕСЛИ W==Z==Y => 4=Z
Таким образом, если у нас есть один черный пиксель на белом фоне, он исчезнет. Это ошибка в алгоритме Eagle, но она решается другими алгоритмами, такими как EPX, 2xSaI и HQ2x.
2×SaI , сокращение от 2× Scale and Interpolation engine, был вдохновлен Eagle. Он был разработан Дереком Лиавом Ки Фа, также известным как Kreed, в первую очередь для использования в эмуляторах консолей и компьютеров , и он остался довольно популярным в этой нише. Многие из самых популярных эмуляторов, включая ZSNES и VisualBoyAdvance , предлагают этот алгоритм масштабирования как функцию. Доступно несколько немного отличающихся версий алгоритма масштабирования, и их часто называют Super 2×SaI и Super Eagle .
Семейство 2xSaI работает с матрицей пикселей 4 × 4 , где пиксель, обозначенный ниже буквой A, масштабируется:
ИЭФЖГАБК --\ WXHCDL --/ YZМНОП
Для 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)-- билинейная интерполяция; среднее значение A, B, C и D x = ((A & qЦветоваяМаска) >> 2) + ((B & qЦветоваяМаска) >> 2) + ((C & qЦветоваяМаска) >> 2) + ((D & qЦветоваяМаска) >> 2); y = (A & qМаскаНизкогоПикселя) + (B & qМаска низких пикселей) + (C & qLowPixelMask) + (D & qLowPixelMask); y = (y >> 2) & qLowPixelMask; вернуть х + у;
Алгоритм проверяет A, B, C и D на диагональное соответствие, такое что A==D
и B!=C
, или наоборот, или если они оба являются диагоналями, или если диагонального соответствия нет. В пределах этих значений он проверяет наличие трех или четырех идентичных пикселей. На основе этих условий алгоритм решает, использовать ли один из A, B, C или D или интерполяцию только среди этих четырех для каждого выходного пикселя. Произвольный масштабатор 2xSaI может увеличивать любое изображение до любого разрешения и использует билинейную фильтрацию для интерполяции пикселей.
С тех пор как Крид выпустил [10] исходный код под лицензией GNU General Public License , он доступен всем желающим использовать его в проекте, выпущенном под этой лицензией. Разработчикам, желающим использовать его в проекте, не имеющем лицензии GPL, потребуется переписать алгоритм, не используя существующий код Крида.
Он доступен в DosBox через scaler=2xsai
опцию.
hq2x, hq3x и hq4x Максима Степина предназначены для масштабных коэффициентов 2:1, 3:1 и 4:1 соответственно. Каждый из них работает, сравнивая значение цвета каждого пикселя с значениями его восьми непосредственных соседей, помечая соседей как близких или далеких, и используя предварительно сгенерированную таблицу поиска для нахождения правильной пропорции значений входных пикселей для каждого из 4, 9 или 16 соответствующих выходных пикселей. Семейство hq3x идеально сгладит любую диагональную линию, наклон которой составляет ±0,5, ±1 или ±2 и которая не сглажена на входе; одна с любым другим наклоном будет чередоваться между двумя наклонами на выходе. Он также сглаживает очень узкие кривые. В отличие от 2xSaI, он сглаживает выход. [11] [8]
hq n x изначально был создан для эмулятора Super NES ZSNES . Автор bsnes выпустил компактную реализацию hq2x в общественное достояние. [12] Доступен порт для shaders , который имеет сопоставимое качество с ранними версиями xBR. [13] До порта шейдер под названием «scalehq» часто путали с hqx. [14]
В этом семействе 6 фильтров: xBR , xBRZ , xBR-Hybrid , Super xBR , xBR+3D и Super xBR+3D .
xBR («масштабирование по правилам»), созданный Hyllian, работает во многом так же, как HQx (основано на распознавании образов) и даст тот же результат, что и HQx, если задан вышеуказанный образ. [15] Однако он идет дальше, чем HQx, используя двухэтапный набор правил интерполяции , которые лучше обрабатывают более сложные образы, такие как сглаженные линии и кривые. Масштабированные фоновые текстуры сохраняют четкие характеристики исходного изображения, а не становятся размытыми, как это обычно делает HQx (часто ScaleHQ на практике). Новейшие версии xBR являются многопроходными и могут лучше сохранять мелкие детали. Существует также версия xBR, объединенная с шейдером Reverse-AA, называемая xBR-Hybrid. [16] xBR+3D — это версия с 3D-маской, которая фильтрует только 2D-элементы.
xBRZ от Zenju — это модифицированная версия xBR. Он реализован с нуля как фильтр на базе ЦП в C++ . [17] Он использует ту же базовую идею, что и распознавание образов и интерполяция xBR, но с другим набором правил, разработанным для сохранения мелких деталей изображения размером до нескольких пикселей. Это делает его полезным для масштабирования деталей на лицах и, в частности, глазах. xBRZ оптимизирован для многоядерных ЦП и 64-битных архитектур и показывает на 40–60% лучшую производительность, чем HQx, даже при работе только на одном ядре ЦП. [ необходима цитата ] Он поддерживает масштабирование изображений с альфа-каналом и масштабирование целыми коэффициентами от 2× до 6×.
Super xBR [18] [19] — это алгоритм, разработанный Hylian в 2015 году. Он использует некоторые комбинации известных линейных фильтров вместе с правилами обнаружения краев xBR нелинейным образом. Он работает в два прохода и может масштабировать изображение только в два раза (или кратно двум, применяя его повторно, а также имеет фильтр против звона). Super xBR+3D — это версия с 3D-маской, которая фильтрует только 2D-элементы. Существует также версия Super xBR, переписанная на C/C++. [20] [8]
RotSprite — это алгоритм масштабирования и вращения спрайтов, разработанный Xenowhirl. Он производит гораздо меньше артефактов, чем алгоритмы вращения ближайшего соседа, и, как и EPX, не вносит новые цвета в изображение (в отличие от большинства систем интерполяции). [21]
Алгоритм сначала масштабирует изображение до 8-кратного исходного размера с помощью модифицированного алгоритма Scale2×, который обрабатывает похожие (а не идентичные) пиксели как совпадения. Затем он (необязательно) вычисляет, какое смещение поворота использовать, отдавая предпочтение выбранным точкам, которые не являются граничными пикселями. Затем повернутое изображение создается с помощью алгоритма масштабирования и поворота ближайшего соседа, который одновременно сжимает большое изображение до его исходного размера и поворачивает изображение. Наконец, пропущенные однопиксельные детали (необязательно) восстанавливаются, если соответствующий пиксель в исходном изображении отличается, а целевой пиксель имеет трех идентичных соседей. [22]
Fast RotSprite — это быстрый алгоритм вращения для пиксельной графики, разработанный Олегом Мекекечко для приложения Pixel Studio. Он основан на RotSprite, но имеет лучшую производительность с небольшой потерей качества. Он может обрабатывать большие изображения в реальном времени. Вместо 8-кратного увеличения Fast RotSprite использует одно 3-кратное увеличение. Затем он просто вращает все пиксели с округлением координат. Наконец, он выполняет 3-кратное уменьшение без введения новых цветов. Поскольку все операции на каждом шаге независимы, их можно выполнять параллельно, что значительно увеличивает производительность.
Алгоритм Копфа–Лишински — это новый способ извлечения векторной графики , независимой от разрешения, из пиксельной графики, описанный в статье 2011 года «Депикселизация пиксельной графики». [23] Доступна реализация на Python. [24]
Алгоритм был перенесен на GPU и оптимизирован для рендеринга в реальном времени. Исходный код доступен для этого варианта. [25]
Edge-directed interpolation (EDI) описывает методы масштабирования, которые используют статистическую выборку для обеспечения качества изображения при его масштабировании. [26] [27] Было несколько более ранних методов, которые включали обнаружение краев для генерации весов смешивания для линейной интерполяции или классификации пикселей в соответствии с их соседними условиями и использования различных в противном случае изотропных схем интерполяции на основе классификации. Каждый подход интерполяции сводится к взвешенным средним соседних пикселей. Цель состоит в том, чтобы найти оптимальные веса. Билинейная интерполяция устанавливает все веса равными. Методы интерполяции более высокого порядка, такие как бикубическая или синк-интерполяция, рассматривают большее количество соседей, чем просто соседние.
NEDI (New Edge-Directed Interpolation) вычисляет локальные ковариации в исходном изображении и использует их для адаптации интерполяции при высоком разрешении. Это прототип фильтра этого семейства. [28]
EDIUpsizer [29] — это фильтр повторной выборки, который изменяет размер изображения в два раза как по горизонтали, так и по вертикали с помощью NEDI (новая интерполяция, направленная по краям). [28] EDIUpsizer также использует несколько модификаций базового NEDI для предотвращения множества артефактов, которые NEDI создает в детализированных областях. К ним относятся тестирование числа условий и адаптивный размер окна, [30] а также ограничения ограничения. Все модификации и ограничения NEDI являются необязательными (могут быть включены и выключены) и настраиваются пользователем. Этот фильтр довольно медленный.
FastEDIUpsizer — это облегченная версия EDIUpsizer, которая немного больше настроена на скорость. Она использует постоянный размер окна 8 × 8 , выполняет NEDI только на плоскости яркости и использует только бикубическую или билинейную интерполяцию в качестве резервного метода интерполяции.
Еще один фильтр интерполяции, направленный на края. Работает путем минимизации функции стоимости, включающей каждый пиксель в строке сканирования. Он медленный.
EEDI2 изменяет размер изображения на 2× в вертикальном направлении, копируя существующее изображение в 2⋅y(n) и интерполируя отсутствующее поле. Он предназначен для направленной на края интерполяции для деинтерлейсинга (т.е. не предназначен для изменения размера обычного изображения, но может делать и это). EEDI2 можно использовать как с TDeint, так и с TIVTC, см. ссылку на обсуждение для получения дополнительной информации о том, как это сделать. [31]
Шейдеры SuperRes [32] используют другой метод масштабирования, который можно использовать в сочетании с NEDI (или любым другим алгоритмом масштабирования). Этот метод подробно описан его создателем Шиандоу в сообщении на форуме Doom9 в 2014 году. [33] Этот метод часто дает лучшие результаты, чем просто использование NEDI, и соперничает с NNEDI3. Теперь они также доступны как скрипт рендеринга MPDN.
NNEDI — это семейство внутриполевых деинтерлейсеров , которые также могут использоваться для увеличения изображений в степени двойки. При использовании в качестве деинтерлейсера он берет кадр , отбрасывает одно поле , а затем интерполирует недостающие пиксели, используя только информацию из сохраненного поля. На данный момент существует три основных поколения NNEDI.
NNEDI, оригинальная версия, работает с входными данными YUY2 и YV12 . [34] NNEDI2 добавила поддержку RGB24 и специальную функцию nnedi2_rpow2
для масштабирования. NNEDI3 расширяет NNEDI2 с помощью предсказательной нейронной сети . Как размер сети, так и окрестности, которые она исследует, можно настроить для компромисса между скоростью и качеством: [35]
Это параметр качества против скорости; однако, различия обычно невелики между количеством нейронов для определенного фактора изменения размера, однако разница в производительности между количеством нейронов становится больше, когда вы учетверяете размер изображения. Если вы планируете только удвоить разрешение, то вы не увидите существенных различий между 16 и 256 нейронами. Между самым высоким и самым низким вариантами все еще есть заметная разница, но не на порядки величины. [36]
{{cite web}}
: CS1 maint: archived copy as title (link)