fortranでdither法を使って2値化をする

fortran

大津の 2 値化ではあるしきい値を持って全体を 0,1 に分けていたが、dither 法では 0,1 をうまく使って中間色を表現しようとする手法である。

今回は dither matrix のパターンとして、Bayer 法を使う。

+----+----+----+----+
| 0  | 8  | 2  | 10 |
+----+----+----+----+
| 12 | 4  | 14 | 6  |
+----+----+----+----+
| 3  | 11 | 1  | 9  |
+----+----+----+----+
| 15 | 7  | 13 | 5  |
+----+----+----+----+

画像を 4*4 の小領域に分け、各領域と matrix を比べ、matrix より大きいければ 1、小さければ 0 とする。

fortran で実装すると以下のようになる。

<script src="https://gist.github.com/Omochice/18ee43cc97cc9bb9754d2c404bca3f48.js"></script>

列優先なので mtx の宣言が転置して状態で宣言していることに留意する必要がある。

また、画像と直接比較するため、mtx を 0~maximum に拡張している。

img から切り出した 4*4 の小領域と mtx を比較して、小領域を 0,1 で置き換え、rst にそれぞれおいていくイメージになっている。
(直接 rst に書き込んでいくようにすれば高速化の可能性がある)。

実際に適用すると次のようになる。
dither