画像のコントラストを調整するには、ヒストグラムを圧縮したり伸張すれば良いように思う。
ColorMatroxを使うのならば、入力対出力の線形特性の傾きを変化させてやればよい。しかし、係数をうまく調整しないと、少しの変化でレベルがすぐに飽和してしまったり、逆に値を大きく変化させてもなかなか結果に現れないなど、思うような結果が得られないこともあるので注意が必要だ。
以下サイトに具体例があったので、掲載されていたサンプルコードを拝借。
コントラストを変更して画像を表示する: .NET Tips: C#, VB.NET
http://dobon.net/vb/dotnet/graphics/contrast.html
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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; } |
実行例
左から、コントラスト-25、元画像、コントラスト+25