- 디더링(Dithering)이란 디지털 신호처리에서 전체적인 양자화 오차가 최소화가 되도록 의도적으로 적은양의 잡음 데이터인 Dither를 추가하는 작업이나 기법
- 기본적으로 제한된 색을 사용하여, 음영이나 색을 나타내도록 사용하며, 여러컬러의 색을 최대한 맞춰주는 과정을 의미한다.
- 색채 공간(흑백 포함)에서 하나의 세기가 아닌 여러 구간을 나누어 세기를 각자 다르게 나타내기 때문에, 점묘법과 비슷하게 표현되며, 이 때문에 다소 거칠게 보여질 수 있다.
여러가지 형태의 Matrix가 존재할 수 있으나 몇가지 예시를 들면,
Dither Matrix의 크기가 2X2인 경우
Dither Matrix의 크기가 4X4인 경우
등이 존재한다.
오늘도 등장할 사진은, lena512.raw 파일로
흑백사진
해당 사진으로 Dithering을 학습해 볼 예정이다.
Dither matrix
작성 코드
#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가지의 임계값을 지정하여 양자화를 진행하기 때문에 어깨와 얼굴 등 여러부분에서 음영의 표현이 어색한 경향이 있음.
Dither Matrix
작성 코드
#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와 비교하면, 좀 더 음영의 구분 단계가 늘어난 것처럼 보인다. 즉, 팔 얼굴등에서 음영의 변화를 잘 표현하고 있으며, 어색한 부분이 많이 보완된 모습을 볼 수 있다.