酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

コントラスト調整

分割した記事で書かれていたのを「Windowsストアアプリで画像処理をおこなう - 酢ろぐ!」とひとつのエントリにまとめました。以下のエントリをご覧ください。

本記事では「ネガティブ(ネガポジ反転)変換 - 酢ろぐ!」で紹介したIEffectインターフェースをベースにして、コントラスト調整処理を実装します。

コントラスト調整では明暗の強弱をつけます。コントラストはもっとも明るい輝度ともっとも暗い輝度との差のことで、上げすぎると明暗がはっきりする代わりに色の差がなくなり、下げすぎると明暗がなくなり中間色になります。


以下のサンプルコードでは、高速化のためにlut(look up table)を作っています。

|cs| // ConstrastEffect.cs

using System;

namespace Softbuild.Media.Effects { public class ContrastEffect : IEffect { private byte[] ContrastTable { get; set; } private double Contrast { get; set; }

    public ContrastEffect(double contrast)
    {
        Contrast = contrast * 2;

        // コントラストの変換テーブルを作成する
        ContrastTable = new byte[256];
        for (int i = 0; i < 256; i++)
        {
            double value = ((double)i - 0.5) * Contrast + 0.5;
            ContrastTable[i] = (byte)Math.Min(255, Math.Max(0, value));
        }
    }

||<

コンストラクタ引数のcontrastが大きくなればなるほど差は大きくなります。実際の処理の中では、lutを元に入力画像から出力画像への変更をおこなっています。

|cs| public byte Effect(int width, int height, byte source) { int pixelCount = width * height; var dest = new byte[source.Length];

        for (int i = 0; i < pixelCount; i++)
        {
            var index = i * 4;

            var b = source[index + 0];
            var g = source[index + 1];
            var r = source[index + 2];
            var a = source[index + 3];

            // 変換テーブル
            b = ContrastTable[b];
            g = ContrastTable[g];
            r = ContrastTable[r];

            dest[index + 0] = b;
            dest[index + 1] = g;
            dest[index + 2] = r;
            dest[index + 3] = a;
        }

        return dest;
    }
}

} ||<