[Multimedia] Dithering

DongHyeon·2023년 10월 18일
0
post-thumbnail

Dithering

  • 디더링(Dithering)이란 디지털 신호처리에서 전체적인 양자화 오차가 최소화가 되도록 의도적으로 적은양의 잡음 데이터인 Dither를 추가하는 작업이나 기법
  • 기본적으로 제한된 색을 사용하여, 음영이나 색을 나타내도록 사용하며, 여러컬러의 색을 최대한 맞춰주는 과정을 의미한다.
  • 색채 공간(흑백 포함)에서 하나의 세기가 아닌 여러 구간을 나누어 세기를 각자 다르게 나타내기 때문에, 점묘법과 비슷하게 표현되며, 이 때문에 다소 거칠게 보여질 수 있다.

Dither Matrix

여러가지 형태의 Matrix가 존재할 수 있으나 몇가지 예시를 들면,

Dither Matrix의 크기가 2X2인 경우

  • (0231)2564\begin{pmatrix}0&2\\3&1\\ \end{pmatrix}*\frac{256}{4}

Dither Matrix의 크기가 4X4인 경우

  • (0821012414631119157135)25616\begin{pmatrix}0&8&2&10\\12&4&14&6\\3&11&1&9\\15&7&13&5\\ \end{pmatrix}*\frac{256}{16}

등이 존재한다.

원본 사진

오늘도 등장할 사진은, lena512.raw 파일로

흑백사진

해당 사진으로 Dithering을 학습해 볼 예정이다.

Dithering (2*2 Matrix)

Dither matrix

(0231)64\begin{pmatrix}0&2\\3&1\\ \end{pmatrix} * 64

작성 코드

#pillow library
from PIL import Image
# (512,512)크기의 새로운 RGB형식의 이미지를 생성
img=Image.new(mode="RGB",size=(512,512))
# raw 형식의 파일을 바이너리 모드로 열고
file=open("lena512.raw","rb")
#print(type(file)) #파일 형식 읽기
# 파일의 내용을 읽고 닫음
data=file.read()
file.close()
# pix객체를 생성, 이미지를 처리
pix=img.load()
# Dither matrix 선언
d1=((0,2),(3,1))
for y in range(512):
    for x in range(512):
        # 2칸마다 dithering
        i=x%2
        j=y%2
        #dither matrix에 64을 곱함. (RGB=>256 이므로 4으로 나누면 64(1당 64)))
        gray=255 if data[y*512+x]>d1[j][i]*64 else 0
        pix[x,y]=(gray,gray,gray) #흑백으로 채워 넣음
img.show() # 이미지 출력

출력 결과

점묘화와 같이 다소 거칠지만 흑백이나 명암들을 일반적인 이진 영상에 비해 잘 표현된 것으로 형성됨. 4가지의 임계값을 지정하여 양자화를 진행하기 때문에 어깨와 얼굴 등 여러부분에서 음영의 표현이 어색한 경향이 있음.

Dithering (4*4 Matrix)

Dither Matrix

(0821012414631119157135)16\begin{pmatrix}0&8&2&10\\12&4&14&6\\3&11&1&9\\15&7&13&5\\ \end{pmatrix} * 16

작성 코드

#pillow library
from PIL import Image
# (512,512)크기의 새로운 RGB형식의 이미지를 생성
img=Image.new(mode="RGB",size=(512,512))
# raw 형식의 파일을 바이너리 모드로 열고
file=open("lena512.raw","rb")
#print(type(file)) #파일 형식 읽기
# 파일의 내용을 읽고 닫음
data=file.read()
file.close()
# pix객체를 생성, 이미지를 처리
pix=img.load()
# Dither matrix 선언
d2=((0,8,2,10),(12,4,14,6),(3,11,1,9),(15,7,13,5))
for y in range(512):
    for x in range(512):
        # 4칸마다 dithering
        i=x%4 
        j=y%4
        #dither matrix에 16을 곱함. (RGB=>256 이므로 16으로 나누면 16(1당 16)))
        gray=255 if data[y*512+x]>d2[j][i]*16 else 0
        pix[x,y]=(gray,gray,gray) #흑백으로 채워 넣음
img.show() # 이미지 출력

출력 결과

해당 사진과 같이 2*2 Dither Matrix와 비교하면, 좀 더 음영의 구분 단계가 늘어난 것처럼 보인다. 즉, 팔 얼굴등에서 음영의 변화를 잘 표현하고 있으며, 어색한 부분이 많이 보완된 모습을 볼 수 있다.

profile
I'm Free!

0개의 댓글