読者です 読者をやめる 読者になる 読者になる

酢ろぐ!

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

コントラスト調整

画像処理 開発-Windows Store Apps

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




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

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

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

// 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を元に入力画像から出力画像への変更をおこなっています。

        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;
        }
    }
}