에듀테크 프로젝트 대시보드
디더링 (Floyd–Steinberg)
색을 몇 단계로 줄이면 부드러운 그라데이션이 층계(밴딩)로 뭉친다. 디더링은 픽셀 사이에 양자화 오차를 흩뿌려서, 적은 색으로도 눈에는 중간 톤이 있는 것처럼 보이게 하는 기술이다.
연속적인 밝기 0~255를 L단계로 줄이는 것을 양자화(quantization)라고 한다.
가장 단순한 방법은 가장 가까운 단계로 반올림하는 것인데, 이때 버려지는 값
error = old − new 가 한 픽셀에 몰리면서 경계가 눈에 띄게 된다.
두 그림 모두 검정과 흰색 2가지 색만 쓴다. 오른쪽은 흰 점의 밀도가 왼쪽→오른쪽으로 촘촘해지며 밝기 변화를 만든다. 멀리서 보면 회색 그라데이션처럼 보인다.
1976년 Robert Floyd와 Louis Steinberg가 제안한 방법. 이미지를 위→아래, 왼→오른쪽으로 훑으면서 각 픽셀에서 생긴 오차를 아직 처리하지 않은 이웃 4칸에 정해진 비율로 더한다.
현재 픽셀은 즉시 팔레트 색으로 확정하고, 남은 오차 e를 오른쪽 픽셀에 7e/16,
다음 줄 세 픽셀에 3e/16 · 5e/16 · e/16 씩 더해 둔다. 그 픽셀들 차례가 오면 이미 오차가 섞인 값으로 양자화된다.
# gray[y][x] : 0~255, 한 채널. levels 단계로 디더링 def floyd_steinberg(gray, H, W, levels): step = 255 / (levels - 1) for y in range(H): for x in range(W): old = gray[y][x] new = round(old / step) * step # 가장 가까운 단계로 gray[y][x] = new err = old - new # 버리지 않고… if x+1 < W: gray[y][x+1] += err * 7/16 if y+1 < H: if x > 0: gray[y+1][x-1] += err * 3/16 gray[y+1][x] += err * 5/16 if x+1 < W: gray[y+1][x+1] += err * 1/16
아래 이미지를 여러 방식으로 색 축소해 본다. 단계 수를 줄일수록 차이가 극적으로 드러난다. 픽셀 확대(pixelated) 상태라 점 패턴이 그대로 보인다.
| 구분 | Floyd–Steinberg (오차 확산) | Bayer / Ordered |
|---|---|---|
| 동작 | 이웃에 오차를 전파하며 순차 처리 | 고정된 임계값 행렬과 픽셀 값 비교 |
| 병렬화 | 어렵다 (픽셀 간 의존) | 쉽다 (각 픽셀 독립) |
| 결과 느낌 | 불규칙·자연스러움, 사진에 유리 | 규칙적 격자 패턴, "레트로" 느낌 |
| 단점 | 가끔 벌레 기어간 듯한 자국(worm artifact) | 넓은 평면에서 격자무늬가 눈에 띔 |
256색 팔레트로 사진을 저장할 때 밴딩을 없앤다. 포토샵 "인덱스 색상 변환" 대화상자의 디더 옵션이 바로 이것.
잉크는 찍거나(1) 안 찍거나(0) 뿐이다. 신문 사진의 망점, 흑백 레이저 출력의 회색 표현이 디더링/하프토닝이다.
전자책 단말기(흑백 16단계)나 초기 게임기·계산기 LCD에서 사진·음영을 표현.
24bit→16bit 다운샘플 시 미세 잡음(TPDF dither)을 더해 양자화 왜곡을 무해한 히스로 바꾼다. 같은 원리의 시간축 버전.