誤差拡散法による2値化この記事への評価、コメント2値化して、1bppの白黒画像を作成するすでにある画像を1bpp(1ビット/ピクセル)の画像に変換する時問題となるのは、どのように1bppのBitmapオブジェクトを作成するかという点と、どのように2値化するかという点です。1bppのBitmapオブジェクトは、BitmapクラスのコンストラクタにPixelFormat.Format1bppIndexedを指定することで作成できます。1bppのBitmapからはGraphics.FromImageメソッドでGraphicsオブジェクトを作成することができませんし、SetPixelメソッドを使うこともできません。そのため、1bppのBitmapに色を付けるには、Bitmap.LockBitsメソッドを使ってピクセルデータを直接書き換える必要があります。Bitmap.LockBitsメソッドの使い方は、「画像のカラーバランスを補正して表示する」で説明しています。画像を2値化する最も簡単な方法は、ピクセルの色の明るさが設定したしきい値を越えれば白くし、越えなければ黒くするという方法(固定閾値法)でしょう。色の明るさは、Color.GetBrightnessメソッドで取得できます。以下に具体例を示します。このCreate1bppImageメソッドを使うと、指定された画像を1bppイメージに変換できます。この例では、PictureBoxコントロール(PictureBox1)をクリックすると画像(C:\test\1.png)を1bppイメージに変換して、PictureBox1に表示しています。C#」を参考にさせていただきました。newImg;}補足:上の例では元の画像の色を取得するのにGetPixelメソッドを使っていますが、元の画像のデータもLockBitsメソッドで取得した方がパフォーマンスは向上するでしょう。結果は、次のようになります。上が元の画像で、下が1bppにした画像です。この例ではしきい値を0.5で固定していますが、これでは、極端に言えば、画像によっては真っ白、あるいは真っ黒になってしまう恐れがあります。よって、画像によってしきい値を変更した方が良い結果が得られます。適切なしきい値を計算する方法としては、判別分析法(大津の二値化)などがあります。興味のある方は、調べてみてください。補足:1bppイメージを作成するのでなければ、ImageAttributes.SetThresholdメソッドを使ってしきい値を設定する方法も考えられます。この方法で画像を2値化するには、まず「画像をグレースケールに変換して表示する」のように画像をグレースケールにしてから、SetThresholdメソッドでしきい値をセットしたImageAttributesオブジェクトを使って画像を描画します(この方法は、「ガンマ補正をして画像を表示する」を参考にしてください)。上記のようにしきい値で黒と白を決める方法では、黒い箇所と白い箇所が両極端になってしまい、その中間が表現されません。これを解決する方法として、ディザリング(Dithering)があります。dithering)です。この方法は、しきい値をランダムな数値にするというだけです。例を示すまでもないとは思いますが、念の為に載せておきます。newImg;}結果は、例えば以下のようになります。dithering)と呼ばれる方法では、例えば8x8の行列(マップ)を作っておき、画像のピクセルに対応する行列の要素をしきい値とすることで2値化します。言葉では説明が難しいので、詳細は「ディザリング(パターン・ディザ)」などを参考にしてください。以下の例では、4x4の行列を使用してオーダードディザリングを行なっています。Halftoning」(文字の色と背景色が同じため、文字が見えにくくなっています)が参考になります。newImg;}結果は、次のようになります。dithering)を紹介します。この方法は、あるピクセルを別の色に変換した時、変換前の色と変換後の色の差(誤差)を周りのピクセルに振り分けます。dithering」などの方法があります。ditheringを使った例を示します。diffusion」が参考になります。newImg;}結果は、次のようになります。System.Drawing.Imaging;」を追加。注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。ソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。Tipsをご利用いただく際は、注意事項をお守りください。共有するこの記事への評価この記事の評価を見る・評価するには、JavaScriptを有効にしてください。この記事へのコメントこの記事へのコメントの一覧を見るこの記事に関するコメントを投稿するには、下のボタンをクリックしてください。投稿フォームへ移動します。通常のご質問、ご意見等は掲示板へご投稿ください。設定JavaScriptを有効にしてください。