web-dev-qa-db-ja.com

C#でビットマップ画像を白黒に変換する方法は?

重複の可能性:
c#で画像を白黒またはセピアに変換

画像を開いてボタンをクリックすると、白黒でのみ表示されるC#アプリケーションを作成しています。ネット上でたくさんの情報を見つけることは確実でしたが、私の検索では、理解しやすく有用な情報はあまり得られませんでした。

どうすればいいのかわからない。誰かアドバイスはありますか?ネット上のチュートリアルを知っていますか?

9
Flo

ビットマップをグレースケールに変換する関数を見つけたことがあります

public void ToGrayScale(Bitmap Bmp)
{
    int rgb;
    Color c;

    for (int y = 0; y < Bmp.Height; y++)
    for (int x = 0; x < Bmp.Width; x++)
    {
        c = Bmp.GetPixel(x, y);
        rgb = (int)Math.Round(.299 * c.R + .587 * c.G + .114 * c.B);
        Bmp.SetPixel(x, y, Color.FromArgb(rgb, rgb, rgb));
    }
}

この関数は、ビットマップをパラメーターとして受け入れ、それをグレースケールバージョンに変更します。

これがお役に立てば幸いです。

25
raRaRa

編集ここでより完全な答えを参照してください: c#で画像を白黒またはセピアに変換します

カラー画像を彩度を下げるには多くの方法があります。実際、それを行うための「真の」または「正しい」方法はおそらくありませんが、他の方法よりも正しい方法があります。
画像はRGB(赤-緑-青)形式であると想定しています(BGRも一般的ですが)。

最も単純な方法は、ほとんどの写真で機能するはずです(ただし、合成画像では機能しません)。3つのRGBチャネルの緑チャネルを使用するだけです。人間はスペクトルの緑の部分の変化に最も敏感であるため、緑のチャネルは可視範囲の大部分をカバーし、必要なグレースケール画像の適切な近似値です。

グレースケール画像を生成するためのより良い方法は、3つのRGBチャネルの加重平均を使用することです。等しい重み(0.33 * R + 0.33 * G + 0.33 * B)を選択すると、かなり良いグレースケール画像が得られます。他の重みは異なる結果をもたらし、そのいくつかはより審美的に心地よいと見なされる可能性があり、いくつかは知覚パラメータを考慮に入れる可能性があります。

HSV(Vはグレースケール)、YUV(Vはグレースケール)、YUV単一グレースケールチャネル(および2つの「カラー」チャネル)のみを持つ別の色空間に画像をいつでも変換できます。 Yはグレースケール)またはLab(Lはグレースケール)。違いはそれほど大きくないはずです。

「彩度の低下」という用語は、HSV空間に由来します。画像をHSVに変換し、Sチャネル(彩度)をすべてゼロに設定して画像をレンダリングすると、3チャネルの彩度の低い「カラー」画像が得られます。

1
Adi Shavit