픽셀 아트 스케일링 알고리즘

섬네일|upright=1.4|단순 최근접 이웃 스케일링(왼쪽)과 2xSaI 보간법 알고리즘(오른쪽)을 사용하여 크기가 조정된 텔레비전 세트 스프라이트(중앙)
섬네일|upright=1.4|일반적인 픽셀 아트 스케일링 알고리즘 비교. 차이점을 확인하려면 전체 해상도로 보기.
픽셀 아트 스케일링 알고리즘()은 수작업으로 그린 2D 픽셀 아트 그래픽의 모양을 개선하려고 시도하는 그래픽 필터이다. 이 알고리즘은 자동 이미지 스케일링의 한 형태이다. 픽셀 아트 스케일링 알고리즘은 이미지의 모양을 보존하는 것을 목표로 하는 일반적인 이미지 스케일링 방법과는 상당히 다른 방법을 사용한다.

픽셀 아트 그래픽은 일반적으로 매우 낮은 이미지 해상도에서 사용되므로 개별 픽셀의 신중한 색상 처리를 사용한다. 그 결과 복잡한 모양을 정의하기 위해 스타일화된 시각적 단서에 크게 의존하는 그래픽이 만들어진다. 이러한 그래픽의 크기를 조정하기 위해 여러 전문 알고리즘이 개발되었다.

이러한 특수 알고리즘은 픽셀 아트 그래픽의 모양을 개선할 수 있지만, 그렇게 하면서 변경 사항을 도입한다. 이러한 변경 사항은 특히 원래 모양을 충실하게 재현하는 것이 목표인 경우 바람직하지 않을 수 있다.

이 기술의 일반적인 응용 프로그램은 비디오 게임 콘솔 에뮬레이터에서 4세대 및 이전 비디오 게임의 모양을 개선하는 것이므로, 많은 픽셀 아트 스케일링 알고리즘은 충분히 작은 입력 이미지에 대해 초당 60프레임으로 실시간으로 실행되도록 설계되었다. 이는 이러한 종류의 실시간 처리에 사용될 수 있는 컴퓨터 프로그래밍 기술 유형에 제약을 가한다. 많은 알고리즘이 특정 스케일 팩터에서만 작동한다. 2배가 가장 일반적인 스케일 팩터이며, 3배, 4배, 5배, 6배도 존재하지만 덜 사용된다.

 알고리즘 
 SAA5050 '대각선 스무딩' 
멀라드 SAA5050 텔레텍스트 문자 생성기 칩(1980)은 원시적인 픽셀 스케일링 알고리즘을 사용하여 내부 ROM의 저해상도 표현에서 화면에 고해상도 문자를 생성했다. 내부적으로 각 문자 모양은 픽셀 그리드에 정의되었으며, 대각선을 부드럽게 보간하여 픽셀 문자를 생성했다. 이 문자에는 특징적인 각진 모양이 있었고 위와 왼쪽에 두 픽셀의 빈 공간으로 둘러싸여 있었다. 이 알고리즘은 흑백 소스 데이터에서만 작동하며, 소스 픽셀이 '켜져 있는지' 또는 '꺼져 있는지'에 따라 논리적으로 참 또는 거짓이 될 것이라고 가정한다. '그리드 패턴 외부'의 픽셀은 꺼져 있다고 가정한다.

알고리즘은 다음과 같이 작동한다.
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의 내부 문자 ROM은 이 패턴을 사용하지 않도록 신중하게 회피한다.

퇴화된 경우:
 *
 * *
 *
다음과 같이 된다:
 **
 ****
 ******
 ******
 ****
 **

 EPX/Scale2×/AdvMAME2× 

에릭의 픽셀 확장(EPX)은 에릭 존스턴이 1992년경 루카스아츠에서 SCUMM 엔진 게임을 IBM PC(320x200x256 색상으로 실행)에서 해상도가 거의 두 배인 초기 컬러 매킨토시 컴퓨터로 포팅할 때 개발한 알고리즘이다.
알고리즘은 P 주변 환경에 따라 P를 4개의 새 픽셀로 확장한다.

frameless|EPX 알고리즘은 픽셀 P를 4개의 새로운 픽셀로 확장한다.

 1=P; 2=P; 3=P; 4=P;
 IF C==A => 1=A
 IF A==B => 2=B
 IF D==C => 3=C
 IF B==D => 4=D
 IF of A, B, C, D, three or more are identical: 1=2=3=4=P
이 동일한 알고리즘의 후기 구현(2001년경 개발된 AdvMAME2× 및 Scale2×)은 약간 더 효율적이지만 기능적으로는 동일하다.
 1=P; 2=P; 3=P; 4=P;
 IF C==A AND C!=D AND A!=B => 1=A
 IF A==B AND A!=C AND B!=D => 2=B
 IF D==C AND D!=B AND C!=A => 3=C
 IF B==D AND B!=A AND D!=C => 4=D
AdvMAME2×는 도스박스에서 scaler=advmame2x dosbox.conf 옵션을 통해 사용할 수 있다.

AdvMAME4×/Scale4× 알고리즘은 4배 해상도를 얻기 위해 EPX를 두 번 적용한 것이다.

 Scale3×/AdvMAME3× 및 ScaleFX 
섬네일|right|270px|EPX는 비트맵 글꼴 크기를 조정하는 데 사용할 수 있다. 위에서 아래로: a) 원본 글꼴 크기; b) 최근접 이웃 2배 스케일링; c) EPX 2배 스케일링; d) 최근접 이웃 3배 스케일링; e) EPX 3배 스케일링.

AdvMAME3×/Scale3× 알고리즘(도스박스에서 scaler=advmame3x dosbox.conf 옵션을 통해 사용 가능)은 3배 경우에 대한 EPX의 일반화로 생각할 수 있다. 모서리 픽셀은 EPX와 동일하게 계산된다.

frameless|AdvMAME3x/Scale3x는 픽셀 E를 9개의 새로운 픽셀로 스케일링한다.
 1=E; 2=E; 3=E; 4=E; 5=E; 6=E; 7=E; 8=E; 9=E;
 IF D==B AND D!=H AND B!=F => 1=D
 IF (D==B AND D!=H AND B!=F AND E!=C) OR (B==F AND B!=D AND F!=H AND E!=A) => 2=B
 IF B==F AND B!=D AND F!=H => 3=F
 IF (H==D AND H!=F AND D!=B AND E!=A) OR (D==B AND D!=H AND B!=F AND E!=G) => 4=D
 5=E
 IF (B==F AND B!=D AND F!=H AND E!=I) OR (F==H AND F!=B AND H!=D AND E!=C) => 6=F
 IF H==D AND H!=F AND D!=B => 7=D
 IF (F==H AND F!=B AND H!=D AND E!=G) OR (H==D AND H!=F AND D!=B AND E!=I) => 8=H
 IF F==H AND F!=B AND H!=D => 9=F

또한 Sp00kyFox가 개발한 Scale3×의 개선된 변형인 ScaleFX와 Reverse-AA와 결합된 버전인 ScaleFX-Hybrid도 있다.

 이글 

중심 픽셀이 스케일링될 픽셀인 픽셀의 입력 행렬과 픽셀의 출력 행렬(즉, 스케일링된 픽셀)을 가정한다.

first: |Then
. . . --\ CC |S T U --\ 1 2
. C . --/ CC |V C W --/ 3 4
. . . |X Y Z
 | IF V==S==T => 1=S
 | IF T==U==W => 2=U
 | IF V==X==Y => 3=X
 | IF W==Z==Y => 4=Z

따라서 흰색 배경에 검은색 픽셀 하나가 있으면 사라진다. 이것은 이글 알고리즘의 버그이지만, EPX, 2xSaI, HQ2x와 같은 다른 알고리즘에 의해 해결된다.

 2×SaI 
2×SaI는 2× 스케일 및 보간 엔진의 줄임말로, 이글(Eagle)에서 영감을 받았다. 데릭 리아우 키 파(Kreed로도 알려짐)가 주로 콘솔 및 컴퓨터 에뮬레이터에 사용하기 위해 설계했으며, 이 틈새 시장에서 상당히 인기를 유지하고 있다. ZSNES 및 비주얼보이어드밴스를 포함한 많은 인기 있는 에뮬레이터는 이 스케일링 알고리즘을 기능으로 제공한다. 스케일링 알고리즘의 여러 약간 다른 버전이 있으며, 이들은 종종 Super 2×SaI 및 Super Eagle로 불린다.

섬네일|right|129px|Super2xSaI가 단일 픽셀을 스케일링하는 데 사용하는 주변 픽셀 매트릭스
2xSaI 계열은 아래에 A로 표시된 픽셀이 스케일링되는 픽셀 매트릭스에서 작동한다.

I E F J
G A B K --\ W X
H C D L --/ Y Z
M N O P

16비트 픽셀의 경우, 16비트 픽셀 형식이 565 또는 555인지에 따라 변경되는 픽셀 마스크를 사용한다. 상수 colorMask, lowPixelMask, qColorMask, qLowPixelMask, redBlueMask 및 greenMask는 16비트 마스크이다. 하위 8비트는 두 픽셀 형식에서 동일하다.

두 가지 보간법 함수가 설명되어 있다.

INTERPOLATE(uint32 A, UINT32 B).
-- A와 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)
-- 쌍선형 보간; A, B, C, D의 평균
 x = ((A & qColorMask) >> 2)
 + ((B & qColorMask) >> 2)
 + ((C & qColorMask) >> 2)
 + ((D & qColorMask) >> 2);
 y = (A & qLowPixelMask)
 + (B & qLowPixelMask)
 + (C & qLowPixelMask)
 + (D & qLowPixelMask);
 y = (y >> 2) & qLowPixelMask;
 return x + y;

알고리즘은 A, B, C, D에서 A==D 및 B!=C와 같은 대각선 일치 여부, 또는 그 반대 여부, 또는 둘 다 대각선인지 또는 대각선 일치가 없는지 확인한다. 이 안에서 세 개 또는 네 개의 동일한 픽셀이 있는지 확인한다. 이러한 조건에 따라 알고리즘은 각 출력 픽셀에 대해 A, B, C 또는 D 중 하나를 사용할지 또는 이 네 픽셀 사이의 보간을 사용할지 결정한다. 2xSaI 임의 스케일러는 모든 이미지를 모든 해상도로 확대할 수 있으며 픽셀 보간을 위해 쌍선형 필터링을 사용한다.

Kreed가 GNU 일반 공중 사용 허가서에 따라 소스 코드를 공개했기 때문에 해당 라이선스에 따라 프로젝트에 활용하려는 모든 사람에게 무료로 제공된다. GPL이 아닌 프로젝트에서 사용하려는 개발자는 Kreed의 기존 코드를 사용하지 않고 알고리즘을 다시 작성해야 한다.

도스박스에서는 scaler=2xsai 옵션을 통해 사용할 수 있다.

 hqnx 계열 

막심 스테핀(Maxim Stepin)의 hq2x, hq3x, hq4x는 각각 2:1, 3:1, 4:1의 스케일 팩터에 해당한다. 각 알고리즘은 각 픽셀의 색상 값을 주변 8개 이웃 픽셀과 비교하여 이웃을 가까움 또는 멀음으로 표시하고, 미리 생성된 룩업 테이블을 사용하여 4개, 9개 또는 16개의 해당 출력 픽셀 각각에 대한 입력 픽셀 값의 적절한 비율을 찾는다. hq3x 계열은 기울기가 ±0.5, ±1 또는 ±2이고 입력에서 안티에일리어싱되지 않은 모든 대각선을 완벽하게 부드럽게 처리한다. 다른 기울기를 가진 선은 출력에서 두 기울기 사이를 번갈아 나타낸다. 또한 매우 촘촘한 곡선도 부드럽게 처리한다. 2xSaI와 달리 출력에 안티에일리어싱을 적용한다.

hqnx는 처음에 슈퍼 NES 에뮬레이터인 ZSNES를 위해 만들어졌다. bsnes의 저자는 hq2x의 공간 효율적인 구현을 퍼블릭 도메인으로 공개했다. xBR 초기 버전과 비슷한 품질의 셰이더로 포팅된 버전이 있다. 포팅 전에는 "scalehq"라는 셰이더가 종종 hqx와 혼동되었다.

 xBR 계열 
이 계열에는 xBR , xBRZ, xBR-Hybrid, Super xBR, xBR+3D 및 Super xBR+3D의 6가지 필터가 있다.

힐리안(Hyllian)이 만든 xBR("규칙에 의한 스케일")은 HQx와 거의 같은 방식으로 작동하며(패턴 인식 기반), 위 패턴이 주어지면 HQx와 동일한 결과를 생성한다. 그러나 HQx보다 한 단계 더 나아가 2단계 보간법 규칙 세트를 사용하여 안티에일리어싱된 선과 곡선과 같은 더 복잡한 패턴을 더 잘 처리한다. 스케일링된 배경 텍스처는 HQx(실제로는 종종 ScaleHQ)가 흐려지는 경향이 있는 것과 달리 원본 이미지의 선명한 특성을 유지한다. 최신 xBR 버전은 다중 패스 방식이며 작은 세부 사항을 더 잘 보존할 수 있다. Reverse-AA 셰이더와 결합된 xBR 버전인 xBR-Hybrid도 있다. xBR+3D는 2D 요소만 필터링하는 3D 마스크가 있는 버전이다.

젠주(Zenju)의 xBRZ는 xBR의 수정된 버전이다. 이는 C++로 CPU 기반 필터로 처음부터 구현되었다. xBR의 패턴 인식 및 보간과 동일한 기본 아이디어를 사용하지만, 몇 픽셀만큼 작은 미세 이미지 세부 사항을 보존하도록 설계된 다른 규칙 세트를 사용한다. 이는 얼굴, 특히 눈의 세부 사항을 스케일링하는 데 유용하다. xBRZ는 멀티 코어 CPU 및 64비트 아키텍처에 최적화되어 있으며 단일 CPU 코어에서만 실행될 때도 HQx보다 40-60% 더 나은 성능을 보인다. 알파 채널이 있는 이미지 스케일링과 2배에서 6배까지 정수 배율 스케일링을 지원한다.

Super xBR는 힐리안이 2015년에 개발한 알고리즘이다. 이는 알려진 선형 필터와 xBR 윤곽선 검출 규칙의 일부 조합을 비선형 방식으로 사용한다. 두 패스로 작동하며 이미지를 두 배(또는 재적용하여 두 배수)로만 스케일링할 수 있으며 안티링잉 필터도 있다. Super xBR+3D는 2D 요소만 필터링하는 3D 마스크가 있는 버전이다.
C/C++로 다시 작성된 Super xBR 버전도 있다.

 RotSprite 
frame|right|왼쪽: 원본 픽셀 아트 이미지가운데: 최근접 이웃 회전 알고리즘을 사용하여 회전된 이미지오른쪽: RotSprite 알고리즘을 사용하여 회전된 이미지

RotSprite는 Xenowhirl이 개발한 스프라이트 스케일링 및 회전 알고리즘이다. 이 알고리즘은 최근접 이웃 회전 알고리즘보다 훨씬 적은 아티팩트를 생성하며, EPX와 마찬가지로 이미지에 새로운 색상을 도입하지 않는다(대부분의 보간 시스템과 달리).

이 알고리즘은 먼저 유사한(동일하지 않은) 픽셀을 일치 항목으로 처리하는 수정된 Scale2× 알고리즘으로 이미지를 원래 크기의 8배로 스케일링한다. 그런 다음 (선택적으로) 경계 픽셀이 아닌 샘플링된 지점을 선호하여 사용할 회전 오프셋을 계산한다. 다음으로, 큰 이미지를 원래 크기로 다시 축소하고 이미지를 회전시키는 최근접 이웃 스케일링 및 회전 알고리즘으로 회전된 이미지를 생성한다. 마지막으로, 원본 이미지의 해당 픽셀이 다르고 대상 픽셀에 세 개의 동일한 이웃이 있는 경우 간과된 단일 픽셀 세부 정보가 (선택적으로) 복원된다.

 Fast RotSprite 
Fast RotSprite는 Pixel Studio 앱을 위해 올레그 메케케치코(Oleg Mekekechko)가 개발한 픽셀 아트용 고속 회전 알고리즘이다. RotSprite를 기반으로 하지만 약간의 품질 손실로 더 나은 성능을 제공한다. 더 큰 이미지를 실시간으로 처리할 수 있다. 8배 확대 대신 Fast RotSprite는 단일 3배 확대를 사용한다. 그런 다음 모든 픽셀을 반올림 좌표로 단순히 회전시킨다. 마지막으로, 새로운 색상을 도입하지 않고 3배 축소를 수행한다. 각 단계의 모든 작업은 독립적이므로 병렬로 수행하여 성능을 크게 향상시킬 수 있다.

 코프-리신스키 
코프-리신스키(Kopf–Lischinski) 알고리즘은 2011년 논문 "Depixelizing Pixel Art"에서 설명된 픽셀 아트에서 해상도 독립적인 벡터 그래픽스를 추출하는 새로운 방법이다. 파이썬 구현도 사용 가능하다.

이 알고리즘은 GPU에 포팅되어 실시간 렌더링에 최적화되었다. 이 변형의 소스 코드를 사용할 수 있다.

 윤곽선 지향 보간법 (EDI) 
윤곽선 지향 보간법(EDI)은 이미지가 확대될 때 이미지의 품질을 보장하기 위해 통계적 샘플링을 사용하는 업스케일링 기술을 설명한다. 선형 보간을 위한 블렌딩 가중치를 생성하기 위해 윤곽선을 감지하거나, 이웃 조건에 따라 픽셀을 분류하고 분류에 따라 다른 등방성 보간 체계를 사용하는 여러 초기 방법이 있었다.
각 보간 접근 방식은 주변 픽셀의 가중 평균으로 귀결된다. 목표는 최적의 가중치를 찾는 것이다. 쌍선형 보간법은 모든 가중치를 동일하게 설정한다. 쌍입방 또는 싱크 보간법과 같은 고차 보간 방법은 인접 픽셀뿐만 아니라 더 많은 수의 이웃을 고려한다.

 NEDI 
NEDI(New Edge-Directed Interpolation)는 원본 이미지에서 지역 공분산을 계산하고 이를 사용하여 고해상도에서 보간을 조정한다. 이 계열의 시제품 필터이다.

 EDIUpsizer 
EDIUpsizer는 NEDI(새로운 윤곽선 지향 보간법)를 사용하여 이미지를 수평 및 수직으로 두 배 확대하는 리샘플링 필터이다. EDIUpsizer는 또한 NEDI가 상세 영역에서 생성하는 많은 아티팩트를 방지하기 위해 기본 NEDI에 몇 가지 수정을 적용한다. 여기에는 조건수 테스트 및 적응형 창 크기 뿐만 아니라 상한 제약도 포함된다. NEDI에 대한 모든 수정 및 제약은 선택 사항이며(켜고 끌 수 있음) 사용자 구성이 가능하다. 이 필터는 다소 느리다.

 FastEDIUpsizer 
FastEDIUpsizer는 EDIUpsizer의 간소화된 버전으로, 속도에 약간 더 맞춰져 있다. 상수 창 크기를 사용하고, 루마 평면에서만 NEDI를 수행하며, 폴백(fallback) 보간 방법으로 쌍입방 또는 쌍선형 보간만 사용한다.

 eedi3 
또 다른 윤곽선 지향 보간 필터. 스캔 라인의 모든 픽셀을 포함하는 비용 함수를 최소화하여 작동한다. 느리다.

 EEDI2 
EEDI2는 기존 이미지를 2⋅y(n)에 복사하고 누락된 필드를 보간하여 이미지를 수직 방향으로 2배 확대한다. 디인터레이스를 위한 윤곽선 지향 보간을 목적으로 한다(즉, 일반 이미지 크기 조정용은 아니지만 그렇게 할 수도 있다). EEDI2는 TDeint 및 TIVTC와 함께 사용할 수 있으며, 이에 대한 자세한 정보는 토론 링크를 참조하라.

 SuperRes 
SuperRes 셰이더는 NEDI(또는 다른 스케일링 알고리즘)와 함께 사용할 수 있는 다른 스케일링 방법을 사용한다. 이 방법은 2014년 Doom9 포럼 게시물에서Shiandow가 자세히 설명했다. 이 방법은 종종 NEDI만 사용하는 것보다 더 나은 결과를 제공하며, NNEDI3과 필적한다. 이들은 이제 MPDN 렌더스크립트로도 사용 가능하다.

 NNEDI 
NNEDI는 인터레이스 해제를 위한 인트라필드(intra-field) 필터 계열로, 2의 거듭제곱으로 이미지를 확대하는 데도 사용할 수 있다. 인터레이스 해제기로 사용될 때는 프레임을 받아 한 필드를 버리고, 유지된 필드의 정보만을 사용하여 누락된 픽셀을 보간한다. 현재까지 NNEDI의 세 가지 주요 세대가 있다.

원본 버전인 NNEDI는 YUY2 및 YV12 입력과 함께 작동한다. NNEDI2는 RGB24 지원과 업스케일링을 위한 특수 함수 nnedi2_rpow2를 추가했다. NNEDI3은 NNEDI2를 예측자 신경망으로 확장한다. 네트워크의 크기와 네트워크가 조사하는 이웃 모두 속도-품질 절충을 위해 조정될 수 있다.이것은 품질 대 속도 옵션이다. 그러나 특정 크기 조정 요소에 대한 뉴런 수 간의 차이는 일반적으로 작지만, 이미지 크기를 4배로 늘릴수록 뉴런 수 간의 성능 차이는 커진다. 해상도를 두 배로 늘릴 계획이라면 16개와 256개 뉴런 사이에 큰 차이를 보지 못할 것이다. 가장 높은 옵션과 가장 낮은 옵션 사이에는 여전히 눈에 띄는 차이가 있지만, 몇 자릿수 정도의 차이는 아니다.

 각주 

 같이 보기 
 libretro - 위에서 언급된 많은 알고리즘을 셰이더로 구현한다.
 pixelscalers - ScaleNx, hqNx, superXBR 알고리즘을 독립형 도구로 C++ 구현
 ScaleNx in Python - Scale2x, Scale3x, Scale2xSFX, Scale3xSFX의 순수 파이썬 3 모듈 구현, FIR 최적화. 단일 및 배치 PNG 및 PNM 크기 조정을 위한 메인 ScaleNx 애플리케이션도 사용 가능

분류:영상 처리