2017年2月7日火曜日

グレイスケール変換(GrayscaleFilter)

 今回はグレイスケール変換について簡単に述べます。グレイスケールへの変換には複数の手法があります。一番簡単な手法では3色(red、green、blue)の平均値をとる方法があります。しかし、3色それぞれは同じ値でも明るさに違いがあり、一律に平均値をとるのでは本来の明るさが失われてしまいます。詳しくは以下のHPを参照してください。
http://daredemopc.blog51.fc2.com/blog-entry-877.html

ここでは、これまで同様輝度を用いたグレイスケール変換のプログラムを載せます。 Tutorial1Activityクラスと同じ場所にGrayscaleFilterクラスを作成します。その後、filterメソッドに以下のコードを入力します。
    public int[] filter(int[] imageArray, int width, int height) {
        int length = width*height;
        int[] oimgArray = new int[imageArray.length];
        int rgb;
        int red,green,blue;
        int y_val;
        for(int i =0;i < length;i++){
            rgb = imageArray[i];
            red = (rgb >> 16) & 0xff;
            green = (rgb >> 8) & 0xff;
            blue = (rgb) & 0xff;
            y_val = ( 2 * red + 4 * green + blue ) / 7;//①
            oimgArray[i]=255*16777216+y_val*65536+y_val*256+y_val;//②
        }
        return oimgArray;
    }

①はこれまで同様の輝度計算です。輝度計算で得られた値を②でred、green、blueそれぞれに同じ値で格納します。
 最後に、 Tutorial1Activityクラスのint imageArray[]=ba2ia(ba);の下に以下の文を記入します。
imageArray=new GrayscaleFilter().filter(imageArray, imagewidth, imageheight);

以下に実機での実行結果を示します。

0 件のコメント:

コメントを投稿