画像の疑似濃淡表現(プログラム例)

画像の疑似濃淡表現を行うプログラムの簡単な例を以下に示す。 ここではディザマトリックスとして以下のような2x2のものを 用いている。
0 2
3 1
実際にはプログラムで示すように、5段階に分けて0〜4が同じ 確率で出現するようにしてある。実際のディザマトリックスの値は
51 153
204 102
である。
/* dither.c */ 
/* a simplified example of dither into 2 bit image */ 
/* usage dither < file.pgm > file2.pgm */

#include <stdio.h>

static int matrix[2][2] = {51,153,204,102};
	/* 255*(1/5), 255*(3/5), 255*(4/5), 255*(2/5) */


main() 
{
	int width,height; 
	char buffer[80]; 
	int dx,dy; 
	int x, y; 
	int pix;

	gets(buffer); puts(buffer); 
	gets(buffer); puts(buffer);
	sscanf(buffer,"%d %d",&width,&height); 
	gets(buffer); puts(buffer);

	dx = dy = 0; 
	for (y = 0; y < height; y++) {
		for (x = 0; x < width; x++) {
			pix = getchar(); 
			if ( pix > matrix[dy][dx] ) pix = 255; 
			else pix = 0; 
			putchar(pix); 
			dx ^= 1;
		} 
	dy ^=1; 
	} 
}

結果は以下のとおり。前回のもっとましなディザと比べてみてください。

(上のプログラムに食わせる前に gifからpgmへ変換し、できたpgmをgifに 変換しないと Netscapeには表示できませんので念のため。)


  1. 上の例ではディザマトリックスは 2 x 2 であったが、これを N x N のマトリックス DNに拡張するには、
    4DN/2 4DN/2+2UN/2
    DN = 
    4DN/2+3UN/2 4DN/2+UN/2
    (但し、UN は各要素が1のN x N のマトリックス)とすればよい。 4 x 4 のディザマトリックスを求めよ。
  2. 4x4のマトリックスを使ったディザプログラムを作成せよ。
  3. 2x2のマトリックスを PPM 形式のカラー画像に適用するプログラムを 作りなさい。