← 실험실
ASTERXOR / 실험실

검은 점들이 회색을 흉내 내는 방법

그림에 두 값만 허용될 때, 그 값들의 배치가 사라진 명암을 담을 수 있습니다.

두 값으로 만든 순서 디더링을 확대한 뒤 표지용 남색과 금색으로 다시 표현한 그림.
계산한 순서 디더링의 일부를 표지 색상으로 바꿨습니다. 실험 자체는 0과 1이라는 두 값만 사용합니다.
실험실ASTERXOR / LEON LEUNG

회색 픽셀은 금지되어도, 회색처럼 보이는 영역은 만들 수 있습니다.

부드러운 그라데이션에는 많은 중간값이 필요합니다. 엄격한 흑백 출력은 두 값만 제공합니다. 픽셀을 따로 반올림하면 한쪽은 검정, 다른 쪽은 흰색으로 나뉩니다. 디더링은 다른 타협을 합니다. 픽셀 하나의 매끄러움을 포기하는 대신 여러 픽셀이 원래의 명암을 더 많이 보존하게 합니다. 점은 그림 위에 우연히 얹힌 질감이 아닙니다. 점의 배치가 그림의 일부를 표현하고 있습니다.

한 픽셀의 제한은 여러 픽셀이 만드는 패턴으로 바뀔 수 있습니다.
두 가지 출력값

임계값 하나는 중간을 버린다

원본은 가로 256, 세로 128픽셀의 합성 램프입니다. 값은 0에서 1까지 변하고 모든 행은 같습니다. 가장 단순한 변환은 0.5를 기준으로 낮은 값을 0, 높은 값을 1로 바꿉니다. 양 끝은 유지되지만 그 사이의 점진적인 변화 대부분은 경계선 하나로 사라집니다.

명확한 양자택일이 필요하다면 유용한 연산입니다. 부드러운 명암을 보존하는 방법으로는 좋지 않습니다. 컴퓨터가 더 영리한 회색을 찾지 못한 것이 아니라 중간 출력값 자체가 금지된 것입니다. 개선하려면 남아 있는 두 값의 공간적 배치를 이용해야 합니다.

반복되는 계획

이웃 픽셀마다 다른 임계값을 주기

순서 디더링은 하나의 임계값 대신 작은 임계값 행렬을 사용합니다. 여기서는 4 × 4 Bayer 행렬을 램프 전체에 반복했습니다. 원본 값이 커지면 반복 타일 안에서 흰색이 되는 위치도 늘어납니다. 출력은 여전히 0과 1뿐이지만 이웃 픽셀의 비율로 중간 명암을 표현합니다.

예측 가능하고 재현하기 쉬운 방법인 대신 알아볼 수 있는 주기적 질감이 남습니다. 제한된 시각적 스타일을 원할 때는 매력적일 수 있지만 그림 자체의 섬세한 패턴과 충돌하면 거슬릴 수도 있습니다. 행렬은 물체나 경계를 이해하지 않습니다. 어디서나 같은 반복 규칙을 적용합니다.

4 × 4 타일은 소프트웨어 없이 셀 수 있는 예도 줍니다. 열여섯 문턱은 1/16 간격의 중간에 놓입니다. 일정한 0.25는 네 칸, 0.5는 여덟 칸, 0.75는 열두 칸을 흰색으로 만듭니다. 이 비율은 완전히 정렬된 타일에서 정확합니다. 가장자리를 잘라내거나 집계 블록 위치가 다르거나 타일 안에서 원본이 변하면 국소 평균도 달라질 수 있습니다. 온전한 타일을 세면 작동은 이해하지만 모든 위치의 정확한 명암 보존을 약속하지는 않습니다.

오차 전달하기

반올림 오차가 이웃의 정보가 될 수 있다

오차 확산은 다른 길을 택합니다. 한 픽셀에 0 또는 1을 선택한 뒤 작업값과 출력값의 차이를 계산합니다. Floyd–Steinberg 규칙은 이 오차를 아직 처리하지 않은 이웃에게 나눕니다. 오른쪽에는 16분의 7을, 나머지는 다음 행의 세 픽셀에 정해진 비율로 보냅니다. 뒤의 선택이 앞선 반올림을 보상할 수 있게 됩니다.

이 구현은 모든 행을 왼쪽에서 오른쪽으로 처리하며 이미지 밖으로 나갈 오차는 버립니다. 행마다 방향을 바꾸지는 않습니다. 순차적인 과정은 방향성 있는 질감을 만들 수 있으므로 이런 선택도 중요합니다. 작은 타일의 반복은 피하지만 눈에 보이는 패턴이나 경계 효과가 모두 사라지는 것은 아닙니다.

부드러운 원본, 선명한 흑백 분할, 반복 점 패턴, 불규칙한 오차 확산 점 패턴을 보여 주는 네 가로 띠.
FIG 01같은 256 × 128 스칼라 램프를 단순 임계값, 반복 4 × 4 순서 디더링, 왼쪽에서 오른쪽 Floyd–Steinberg 방식으로 변환했습니다.
작은 영역 보기

작은 영역의 평균을 보기

출력 픽셀을 원본과 하나씩 비교하면 디더링을 가능하게 하는 점 자체를 벌주게 됩니다. 대신 이미지를 8 × 8 블록으로 나누고 각 블록의 평균을 원본 블록 평균과 비교했습니다. 그 절대 차이를 전체 블록에서 평균 냈습니다. 이는 국소적인 명암 보존의 한 가지 측정입니다.

측정 오차는 단순 임계값 약 0.2490, 순서 디더링 0.01556, 오차 확산 0.00986입니다. 이 램프에서는 두 디더링이 블록 평균을 훨씬 잘 보존했습니다. 모든 사진과 모든 관찰 거리에서 오차 확산이 더 보기 좋다는 뜻은 아닙니다. 국소 수치 평균은 시각의 완전한 모델이 아닙니다.

단순 임계값 오차 막대가 두 디더링보다 훨씬 높고 이 램프에서는 오차 확산이 가장 낮은 그래프.
FIG 028 × 8 블록 평균의 평균절대오차는 임계값 0.249020, 순서 디더링 0.015564, 오차 확산 0.009860입니다. 지각 품질 점수는 아닙니다.
거리가 바꾸는 그림

같은 점도 거리와 조건에 따라 달라 보인다

가까이에서는 흑백의 단호한 선택들이 보입니다. 멀리에서는 미세한 패턴이 합쳐져 중간 명암처럼 느껴질 수 있습니다. 화면, 인쇄 과정, 관찰 거리와 주변 그림이 모두 영향을 줍니다. 디더링한 이미지를 다시 크기 조절하면 새로운 무늬가 생길 수도 있습니다. 재표본화가 특정 픽셀 간격을 위해 만든 패턴과 상호작용하기 때문입니다.

이 실험은 보정된 밝기 모델이 아니라 스칼라 숫자를 사용합니다. 수치 0.5를 곧바로 화면에서 느끼는 밝기의 절반이라고 부를 수는 없습니다. 감마 인코딩, 화면 응답, 인쇄 특성은 별도로 다뤄야 합니다. 표지는 사이트 색상에 맞춰 바꿨으며 본문 비교 그림은 실제 흑백 출력을 유지합니다.

어떤 오차를 재는가

점수는 목적에 맞지 않는 그림을 보상할 수 있습니다

측정 크기만 바꾸면 순위가 뒤집힙니다. 원래 명암 그라데이션의 픽셀별 평균 절대 오차는 임계값 0.24902, 순서 디더 0.33235, 확산 0.33120입니다. 픽셀마다 가까운 끝점을 고르는 임계값 방식이 이 점수에서는 이깁니다. 그러나 8 × 8 이웃 평균에서는 같은 출력이 크게 뒤집니다. 산술의 모순이 아니라 단일 결정과 패치라는 서로 다른 성질을 보상하는 두 기준입니다.

전체 평균이 완벽해도 명암 위치는 틀릴 수 있습니다. 확장 실험은 64 × 64의 일정한 0.5 필드, 그 순서 디더, 일부러 거칠게 만든 왼쪽 검정·오른쪽 흰색 이미지를 비교합니다. 세 평균은 정확히 0.5입니다. 균일 참조에 대한 정렬된 8 × 8 블록 오차는 순서 무늬가 0, 반으로 가른 필드는 0.5입니다. 흰색 총량을 보존해도 명암의 위치를 보존하지는 않습니다. 새 그림은 요약 수치를 믿으라고 하기보다 실패를 직접 보입니다.

같은 평균의 회색 필드, 점 무늬, 흑백 반분 이미지와 측정 크기에 따른 순위 변화를 보이는 막대.
FIG 03위의 세 필드는 전체 평균이 모두 0.5입니다. 아래는 원래 명암 그라데이션의 픽셀별·8 × 8 평균 MAE로, 시각에 관한 경쟁 주장 대신 다른 목표를 측정합니다.
절충 선택하기

제약을 사용하는 방법은 하나가 아니다

순서 디더링은 안정된 반복 구조를 제공하고, 오차 확산은 앞선 선택의 정보를 사용해 덜 규칙적인 질감을 만드는 경우가 많습니다. 단순 임계값은 분명한 이진 경계를 유지합니다. 목적에 따라 적절한 방법이 다르며, 보기 좋은 답과 특정 수치 점수의 우승자가 같지 않을 수도 있습니다.

로컬 검사는 같은 이미지 크기, 엄격한 이진 출력, 그리고 이 램프에서 두 디더링의 더 작은 블록 평균 오차를 확인했습니다. 보편적인 순위를 정한 것은 아닙니다. 개별 요소의 능력이 제한되어도 요소 사이의 관계는 하나로는 표현할 수 없는 정보를 담을 수 있다는 설계 아이디어를 보여 줍니다.

더 읽어 보기

ImageMagick: colour quantization and dithering ↗Pillow: image conversion and Floyd–Steinberg dithering ↗

공식 문서와 함께 읽으면 좋은 자료입니다.

가져갈 생각 하나

추가 명암은 점 안이 아니라 점들이 함께 일하는 방식에 있습니다.