「小さなフィルタのサンプル」の編集履歴(バックアップ)一覧に戻る

小さなフィルタのサンプル - (2010/06/10 (木) 16:20:39) のソース

&ref(自分で作ったフィルタサンプル.png)
フィルタ1
左写真を右イラストのようにするフィルタ。

[[小さなフィルタのサンプル1-2]]

-フィルタの原理
イラストの中の各点の色をRGB空間の点C1とし、サンプルコードの中にある点C2(ccR、ccG、ccB)までの距離r3=|C1-C2|を考える。
C1,C2間の距離がb+a*r3/255となるように色空間内でのC1の位置を計算してC1の色を決定しなおしています。
つまり点C2を中心に色空間を拡大するイメージで捉えてください。




RGB空間をはみ出た点は255で切り落としています。
ちなみにこのフィルタ、同じ画像に連続適用すると画像がくっきりしたりアメコミ風の色になったりとかなり楽しいフィルタです。

-拡張
            float  ccR = 128;
            float  ccG = 128;
            float ccB = 128;
この値はRGBをあらわしています。
この3つの値を0~255まで変えることで、フィルタ処理結果を夕焼けや朝焼け、紫寄りや水中向きフィルタなどに変更することが出来ます。


-以下サンプルソースコード
フィルタ処理を行うクラスのみ掲載。
cercleChangeメソッドがフィルタを行い、フィルタ後の画像をBitmapで返しますので、Bitmap型を渡して使用してください。





 //製作者 堀江伸一
 //どこにでもある常識的なフィルタだと思います。

    class pictFilter
    {
        Random rnd = new Random();
        Bitmap pictOut = null;
        int h;//絵の高さ
        int w;//絵の横幅
        public pictFilter()
        {
            h = 0;
            w = 0;
        }

        public Bitmap cercleChange(Bitmap pictIn)
        {

            float  ccR = 128;//a,bを-5~5の範囲で変更するととても面白い変化を見せます、またccRやccGを変えても楽しいです。
            float  ccG = 128;
            float ccB = 128;
            float a=-1;
            float b = 2.0f;
            double r1=0;
            double r2 = 0;
            Color C1;

            this.h = pictIn.Height;
            this.w = pictIn.Width;
            pictOut = new Bitmap(this.w, this.h);
            for(int i=0;i<this.w;i++){
                for (int j = 0; j < this.h; j++)
                {
                    C1 = pictIn.GetPixel(i, j);
                    r1 = Math.Sqrt( (C1.R - ccR) * (C1.R - ccR) +
                        (C1.G - ccG) * (C1.G - ccG) +
                        (C1.B - ccB) * (C1.B - ccB))/255.0;
                    
                    r2 = (a * r1 + b);
                    pictOut.SetPixel(i,j, 
                        Color.FromArgb(cutNum (0,255,(int)(r2 * (C1.R - ccR) + ccR)),
                        cutNum(0,255,(int)(r2 * (C1.G - ccG) + ccG)),
                        cutNum(0,255,(int)(r2 * (C1.B - ccB) + ccB))));
                    //これはLispではありませんw
                }
            }
            return pictOut;



            //テンプレ
            //this.h = pictIn.Height;
            //this.w = pictIn.Width;
            //pictOut = new Bitmap(this.w, this.h);
            //for(int i=0;i<this.w;i++){
            //    for (int j = 0; j < this.h; j++)
            //    {   
            //    }
            //}
            //return pictOut;
        }

        private int cutNum(int min, int max, int t)
        {
            if (t < min)
            {
                t = min;
            }
            if (t > max)
            {
                t = max;
            }
            return t;
        }

    }

}