정태영

팩스에서 처럼 이미지를 흑/백 으로만 표현할 수 있는 경우에도 어느 정도의 명암을 표현하기 위한 방법으로 아래와 같은 오리지널 이미지가 있을 때...

한 픽셀 값은 0~255 사이의 값을 가진다고 하고, 128 이상의 값은 하얀 색으로, 128 미만 값은 검은 색으로 표현하면 결과는 다음과 같다.

보다시피 디테일은 거의 사라져버리기 때문에 이런 것을 피하기 위해 디더링이란 기법을 사용하곤 한다. 수식으로 이를 표현해보자면 다음과 같고...

말로 설명하자면 랜덤 값을 더해준 뒤 128 을 기준으로 Thresholding 을 한다! 정도로 표현이 가능할 듯... 이론적으론 매우 간단하지만 효과는 확실하다. -16~16 의 랜덤 값을 이용하여 dithering 한 결과는 다음과 같다.

-32~32 사이의 랜덤 값을 이용할 경우는...

확실히 좀 디테일이 조금 생겨나는 것을 확인할 수가 있다. 장비들이 좋아지면서 이런 식의 트릭들에 대한 연구는 사라져가는 것 같다. -_ㅠ

위 테스트에 사용한 코드:

C:
  1. #include <stdio .h>
  2. #include <time .h>
  3. #include <stdlib .h>
  4.  
  5. int main( int argc, char** argv ){
  6.  
  7.         int i, j;
  8.  
  9.         unsigned char* src;
  10.         unsigned char* dst;
  11.  
  12.         FILE* in;
  13.         FILE* out;
  14.  
  15.         src = (unsigned char*)malloc(sizeof(unsigned char)*512*512);
  16.         dst = (unsigned char*)malloc(sizeof(unsigned char)*512*512);
  17.  
  18.         srand(time(NULL));
  19.  
  20.         in = fopen("lena512.raw", "rb" );
  21.         fread( src, sizeof(unsigned char), 512*512, in );
  22.         fclose(in);
  23.  
  24.         for( j = 0 ; j <512 ; j++ ){
  25.                 for( i = 0 ; i <512 ; i++ ){
  26.                         if( src[j*512+i]> 128 )
  27.                                 dst[j*512+i] = 255;
  28.                         else
  29.                                 dst[j*512+i] = 0;
  30.                 }
  31.         }
  32.         out = fopen("lena512_thres.raw", "wb" );
  33.         fwrite( dst, sizeof(unsigned char), 512*512, out );
  34.         fclose(out);
  35.  
  36.         for( j = 0 ; j <512 ; j++ ){
  37.                 for( i = 0 ; i <512 ; i++ ){
  38.                         if( (src[j*512+i] + rand()%32 - 32)> 128 )
  39.                                 dst[j*512+i] = 255;
  40.                         else
  41.                                 dst[j*512+i] = 0;
  42.                 }
  43.         }
  44.         out = fopen("lena512_dither_32.raw", "wb" );
  45.         fwrite( dst, sizeof(unsigned char), 512*512, out );
  46.         fclose(out);
  47.  
  48.         return 0;
  49. }

Tags: , ,

This entry was posted on Friday, November 21st, 2008 at 10:29 am and is filed under MyLife. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

2 Responses to “dithering”

  1. Toby Says:

    학교에서 그래픽스 수업때 봤던 기억이 나는군.
    저 아줌마가 리나던가?
    뭐.. 나에게는 힘들었던 수업;;;;

  2. 정태영 Says:

    이제 아줌마는 아니고 할머니지 ㅋㅋㅋ

Leave a Reply