画像のモノクロ化

前に書いた日記「アスキーアートからのインスピレーション」のアイデアで画像をモノクロ化するプログラムを書いてみた。


画像の明るさの平均値と標準偏差を使って正規ノイズを加えて白か黒か分ける方法。


http://junki.lix.jp/csgr/006Library1.htm」を使うと、ビットマップへポインタアクセスして高速化したり白黒ビットマップの編集ができるようになる。ちょっと自分なりに改造した。変数名を変えたのと、byte配列を作らないで直接書き込むようにしたり、共通部分を継承で削ったり…
C#でポインタを有効に使う数少ない例だとおもう


結果は、元の画像が明るさが均一な場合はうまくいくが、局所的に異なる場合はうまくいかない。
画像紛失



多分平均値が黒いほうに偏りすぎたのが原因だろう。なので、平均値は注目してるピクセルの周りで計算するのが良いかもしれない。ただそれをすると計算量がやばいことになるけれど…



ちなみに最初の画像をWindows標準付属のペイントでモノクロにした場合中心に黒い点が出るだけになりましたw
2番目の画像についてはペイントでやったほうがうまくいっている。これはさっきも少し述べたが閾値の設定が0.5のほうがむしろ良いからだ



んー平均値と標準偏差はパレットの明るさで作ったほうがいいのかな…



元画像はここから使いましたhttp://kanasoku.blog82.fc2.com/blog-entry-11271.html

追記 コマンドライン版を作った

このプログラムは

MonochromeCLI.exe "画像データへのパス" 明るさの閾値 明るさの標準偏差
という引数で起動する。たとえば
MonochromeCLI.exe foo.jpg 0.4 0.1
とするとfoo_mono.bmpにモノクロの画像を出力する。