端くれプログラマの備忘録 C#,画像処理 [C#] 画像のコントラストを調整する

[C#] 画像のコントラストを調整する

画像のコントラストを調整するには、ヒストグラムを圧縮したり伸張すれば良いように思う。

ColorMatroxを使うのならば、入力対出力の線形特性の傾きを変化させてやればよい。しかし、係数をうまく調整しないと、少しの変化でレベルがすぐに飽和してしまったり、逆に値を大きく変化させてもなかなか結果に現れないなど、思うような結果が得られないこともあるので注意が必要だ。

以下サイトに具体例があったので、掲載されていたサンプルコードを拝借。

コントラストを変更して画像を表示する: .NET Tips: C#, VB.NET
http://dobon.net/vb/dotnet/graphics/contrast.html

サンプルコード

static public Bitmap AdjustContrast(Bitmap image, float contrast)
{
    Bitmap dest = new Bitmap(image.Width, image.Height);
    Graphics g = Graphics.FromImage(dest);

    float scale = (100f + contrast) / 100f;
    scale *= scale;
    float append = 0.5f * (1f - scale);
    ColorMatrix cm = new ColorMatrix(
        new float[][] {
        new float[] {scale, 0, 0, 0, 0},
        new float[] {0, scale, 0, 0, 0},
        new float[] {0, 0, scale, 0, 0}, 
        new float[] {0, 0, 0, 1, 0},
        new float[] {append, append, append, 0, 1}
    });

    ImageAttributes ia = new ImageAttributes();
    ia.SetColorMatrix(cm);
    g.DrawImage(image,
        new Rectangle(0, 0, image.Width, image.Height),
        0, 0, image.Width, image.Height, GraphicsUnit.Pixel, ia);
    g.Dispose();
    return dest;
}

実行例

0010

左から、コントラスト-25、元画像、コントラスト+25