2017年7月19日水曜日

C# Magick.NETを使ってみる。モノクロ2階調変換

C# Magick.NETを使ってみる
目次→http://1studying.blogspot.jp/2017/07/c-magicknetmokuzi.html#kuw09

「Magick.NET」で
グレースケール画像を、モノクロ2階調へ変換する方法を記載します。
(2階調画像を作成する場合は、
必ず事前にグレースケール画像を用意します。)

画像のグレースケール化処理については以下のリンク先を参照して下さい。
「C# Magick.NETを使ってみる。グレースケール変換」
http://1studying.blogspot.jp/2017/07/c-magicknet.html



しきい値で2値化


グレースケール画像を閾値で2値化します。
                //閾値で2階調化(カラータイプ変更無し)
                myMagick.Threshold(new ImageMagick.Percentage(50.0));//50%→128

グレースケール画像を閾値で2値化時、
閾値より暗い色を全て黒(K100)にします。
                //閾値より暗い色を全て黒(K100)にする(カラータイプ変更無し)
                myMagick.BlackThreshold(new ImageMagick.Percentage(50.0));//50%→128

グレースケール画像を閾値で2値化時、
閾値より明るい色を全て白(K0)にします。
                //閾値より明るい色を全て白(K0)にする(カラータイプ変更無し)
                myMagick.WhiteThreshold(new ImageMagick.Percentage(50.0));//50%→128




ディザで2値化


「Magick.NET」ではグレースケール画像をディザで2値化する場合、
初期値として「Riemersmaディザ」が使われます。
                //「Riemersmaディザ」で2値化(カラータイプ変更無し)
                myMagick.ColorType = ImageMagick.ColorType.Bilevel;

「Riemersmaディザ」を明示して2値化を行う場合は、クオンタイズを使います。
以下のようにします。
                //「Riemersmaディザ」で2値化(カラータイプ変更無し)
                ImageMagick.QuantizeSettings qSetting = new ImageMagick.QuantizeSettings();
                qSetting.ColorSpace = ImageMagick.ColorSpace.Gray;
                qSetting.DitherMethod = ImageMagick.DitherMethod.Riemersma;
                qSetting.Colors = 2;
                myMagick.Quantize(qSetting);


「誤差拡散ディザ」の「フロイドスタインバーグ」(よく使われるディザ処理です)
を明示して2値化を行う場合は、クオンタイズを使います。
以下のようにします。
                //「誤差拡散ディザ」「フロイドスタインバーグ」で2値化(カラータイプ変更無し)
                ImageMagick.QuantizeSettings qSetting = new ImageMagick.QuantizeSettings();
                qSetting.ColorSpace = ImageMagick.ColorSpace.Gray;
                qSetting.DitherMethod = ImageMagick.DitherMethod.FloydSteinberg;
                qSetting.Colors = 2;
                myMagick.Quantize(qSetting);


考察:
Photoshopの誤差拡散ディザはフロイドスタインバーグとは違う結果となる。
独自のアルゴリズムっぽい気がする。(Sierraっぽい?)
(参照→https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%A3%E3%82%B6
「Magick.NET」のディザ処理は、
「Riemersmaディザ」も「誤差拡散ディザ」の「フロイドスタインバーグ」も、
Photoshopと比べて結果があまり良くない。
グレーの10%以下は飛ぶし、85%以上は潰れた表現になる。

自分用メモ:
「フロイドスタインバーグ」は「Magick.NET」に用意されている物より、
自作した物の方が結果が良かった。
「C# Magick.NET 自作ディザの作成」(非公開)
http://00studying.blogspot.jp/2017/07/c-magicknet.html?zx=a09787eceddc7dea


「無作為 (Random) ディザ」
ランダムにディザを掛ける為、毎回結果が変わります。
                //「無作為 (Random) ディザ」で2値化(カラータイプ変更無し)
                myMagick.RandomThreshold(new ImageMagick.Percentage(0.0), new ImageMagick.Percentage(100.0));
(グレースの5%以下や95%以上も、ちゃんとディザがかかるが、
細部の表現に弱い)




スクリーントーンで2値化


「Magick.NET」はスクリーントーンで2値化を行う際、
スクリーンの選択肢が少なく、角度指定も出来ないです。
かなりザックリとした物となります。
                //「スクリーントーン」で2値化
                myMagick.OrderedDither("h8x8a");
引数の文字列には、標準で以下の設定が用意されています。
(threshold,checks,
o2x2,o3x3,o4x4,o8x8,
h3x4a,h6x6a,h8x8a,
h3x4o,h6x6o,h8x8o,h36x16o,
c5x5b,c5x5w,c6x6b,c6x6w,c7x7b,c7x7w)

「Magick.NET」の標準では、
「Photoshop」の「スクリーントーン」とは程遠い結果となります。

自分用メモ:
「Photoshop」の「スクリーントーン」に処理結果を近づける。
「C# Magick.NETで「Photoshop」の2値網化をエミュレート1」非公開
http://00studying.blogspot.jp/2017/07/c-magicknetphotoshop.html
「C# Magick.NETで「Photoshop」の2値網化をエミュレート2」非公開
http://00studying.blogspot.jp/2017/07/c-magicknetphotoshop_11.html




ローカルしきい値で2値化


指定したピクセル範囲内のピクセル濃度の平均を閾値として、
2値化処理を行います。
                //「ローカル閾値法」で2値化
                //4x4の周辺ピクセルの単純平均を取りそれを閾値として2値化する
                myMagick.AdaptiveThreshold(4, 4);
                myMagick.Negate();



その他



ImageMagickなら
「convert -list threshold」で所有ディザマップ(所持網点)の一覧表示

参考にしたサイト
2値化して、1bppの白黒画像を作成する
(C#での2値画像の作成)
https://dobon.net/vb/dotnet/graphics/1bpp.html
B/W Halftone Dither
https://www.imagemagick.org/discourse-server/viewtopic.php?t=17389
ディザ処理とハーフトーン処理の概要
http://caca.zoy.org/study/part2.html
誤差拡散の説明
http://caca.zoy.org/study/part3.html
ディザ
https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%A3%E3%82%B6
ディザ「C#画像を色から白黒に変換する」
https://stackoverflow.com/questions/31148616/c-sharp-convert-an-image-from-color-to-a-black-and-white
ImageMagickでのディザを使った様々なテスト結果。
http://bisqwit.iki.fi/jutut/colorquant/

ローカルしきい値法の説明
http://ishidate.my.coocan.jp/vcpp10_g9/vcpp10_g9.htm


0 件のコメント:

コメントを投稿

↑Topへ