

1. 変換前画像のピクセルの数と同じ要素数の数数の2次元配列を,変換処理後の輝度を格納するための配列(以下,変換後輝度配列という)として用意し,全ての要素を0で初期化する。
2. 変換前画像の一番上の左から,各行について左から1ピクセル選び,輝度を得る。
3. 変換前画像の輝度と,変換後輝度配列の同じ要素の値を加算し,これをFとする。
4. Fの値が128以上なら変換後輝度配列の輝度を255とし,誤差の値DをF-255とする。Fが128未満なら変換後輝度配列の輝度を0とし,誤差の値DをFとする。
5. Dの値について,誤差拡散のパターンに定義された割合に従って配分し,拡散先の要素に加算する。ただし,画像の範囲を外れる場合は,その値を無視する。
6. 処理していないピクセルが残っている場合は2に戻って繰り返す。
7. 変換後輝度配列で輝度が0を黒,輝度が255を白として,画像を出力する。

名称 | 種別 | 説明 |
---|---|---|
width | 変数 | 画像の幅。1以上の整数が入る。 |
height | 変数 | 画像の高さ。1以上の整数が入る。 |
bmpFrom[x, y] | 配列 | 変換前画像の輝度の配列。輝度が0~255の値で格納される。x, yはそれぞれX座標とY座標で,画像の左上が[1, 1],右下が[width, height]である。 |
bmpTo[x, y] | 配列 | 変換後輝度配列。x, yはbmpFrom[x, y]と同様である。全ての要素は0で初期化されている。 |
ratioCount | 定数 | 誤差拡散のパターンの拡散先の数。図2の場合は4が入る。 |
tdx[ ] | 配列 | 拡散先の,ピクセル単位のX方向の相対位置。図2の場合は[1, -1, 0, 1]が入る。 |
tdy[ ] | 配列 | 拡散先の,ピクセル単位のY方向の相対位置。図2の場合は[0, 1, 1, 1]が入る。 |
ratio[ ] | 配列 | 拡散先のピクセルごとの割合の分子。図2の場合は[7, 3, 5, 1]が入る。 |
denominator | 定数 | 拡散先のピクセルごとの割合の分母。図2の場合は16が入る。 |
for ( y を 1 から height まで繰り返す ) for ( x を 1 から width まで繰り返す ) f ← ア if ( イ ) d ← f - 255 bmpTo[x, y] ← 255 else d ← f bmpTo[x, y] ← 0 endif for ( c を 1 から ratioCount まで繰り返す ) px ← x + tdx[c] py ← y + tdy[c] if ( (px が 1 以上) かつ (px が width 以下) かつ (py が 1 以上) かつ (py が height 以下) ) bmpTo[px , py] ← ウ endif endfor endfor endfor
for ( tx を 1 から width まで繰り返す ) x ← tx if ( ( エ mod オ ) が 0 に等しい ) x ← カ endif
px ← x - tdx[c] + ( 2 * tdx[c] * ( エ mod オ ) )