한양과학기술고등학교

에듀테크 프로젝트 대시보드

디더링 (Floyd–Steinberg)

디더링 (Floyd–Steinberg Dithering)

색을 몇 단계로 줄이면 부드러운 그라데이션이 층계(밴딩)로 뭉친다. 디더링은 픽셀 사이에 양자화 오차를 흩뿌려서, 적은 색으로도 눈에는 중간 톤이 있는 것처럼 보이게 하는 기술이다.

왜 필요한가? GIF는 256색, 흑백 레이저 프린터·e-ink·자수 도안은 사실상 2색뿐이다. 사진의 수백만 색을 이 좁은 팔레트로 그냥 반올림하면 하늘에 뚜렷한 줄무늬가 생긴다. 디더링은 그 오차를 버리지 않고 이웃 픽셀에게 떠넘겨 전체 평균 밝기를 보존한다.

1. 양자화와 밴딩

연속적인 밝기 0~255를 L단계로 줄이는 것을 양자화(quantization)라고 한다. 가장 단순한 방법은 가장 가까운 단계로 반올림하는 것인데, 이때 버려지는 값 error = old − new 가 한 픽셀에 몰리면서 경계가 눈에 띄게 된다.

1차원으로 보기 — 왼쪽에서 오른쪽으로 서서히 밝아지는 띠

단순 반올림 (2색) — 딱 한 번 뚝 끊긴다
오차 확산 (2색) — 점 밀도로 회색을 흉내낸다

두 그림 모두 검정과 흰색 2가지 색만 쓴다. 오른쪽은 흰 점의 밀도가 왼쪽→오른쪽으로 촘촘해지며 밝기 변화를 만든다. 멀리서 보면 회색 그라데이션처럼 보인다.

2. Floyd–Steinberg 오차 확산

1976년 Robert Floyd와 Louis Steinberg가 제안한 방법. 이미지를 위→아래, 왼→오른쪽으로 훑으면서 각 픽셀에서 생긴 오차를 아직 처리하지 않은 이웃 4칸에 정해진 비율로 더한다.

오차 분배 커널 (합 = 16/16)

·
현재px
→7/16
↙3/16
↓5/16
↘1/16

현재 픽셀은 즉시 팔레트 색으로 확정하고, 남은 오차 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

3. 직접 해보기

아래 이미지를 여러 방식으로 색 축소해 본다. 단계 수를 줄일수록 차이가 극적으로 드러난다. 픽셀 확대(pixelated) 상태라 점 패턴이 그대로 보인다.

원본 — 연속 계조 (채널당 256단계)
결과 — 2색, Floyd–Steinberg

4. 오차 확산 vs 정렬 디더링(Ordered)

구분Floyd–Steinberg (오차 확산)Bayer / Ordered
동작이웃에 오차를 전파하며 순차 처리고정된 임계값 행렬과 픽셀 값 비교
병렬화어렵다 (픽셀 간 의존)쉽다 (각 픽셀 독립)
결과 느낌불규칙·자연스러움, 사진에 유리규칙적 격자 패턴, "레트로" 느낌
단점가끔 벌레 기어간 듯한 자국(worm artifact)넓은 평면에서 격자무늬가 눈에 띔
같은 계열의 다른 커널들: Jarvis–Judice–Ninke(12칸), Stucki, Atkinson(초기 Mac, 오차의 6/8만 전파해 대비가 강함), Sierra. 모두 "오차를 이웃에 나눠준다"는 원리는 같고 분배 비율만 다르다.

5. 어디에 쓰이나

GIF · PNG-8 · 웹 그래픽

256색 팔레트로 사진을 저장할 때 밴딩을 없앤다. 포토샵 "인덱스 색상 변환" 대화상자의 디더 옵션이 바로 이것.

인쇄 · 하프톤

잉크는 찍거나(1) 안 찍거나(0) 뿐이다. 신문 사진의 망점, 흑백 레이저 출력의 회색 표현이 디더링/하프토닝이다.

e-ink · 저비트 디스플레이

전자책 단말기(흑백 16단계)나 초기 게임기·계산기 LCD에서 사진·음영을 표현.

오디오 (1D 디더)

24bit→16bit 다운샘플 시 미세 잡음(TPDF dither)을 더해 양자화 왜곡을 무해한 히스로 바꾼다. 같은 원리의 시간축 버전.

연결해서 보기: 픽셀 단위 커널 연산이라는 점에서 이미지 컨볼루션과 닮았고, "적은 비트로 정보를 담는다"는 목표는 허프만 코딩과 통한다. 격자 임계값 패턴은 노이즈 텍스처와도 관계가 있다.