2017年2月8日水曜日

セピア調変換(SepiaFilter)

今回は色合いをセピア調に変えるセピアフィルターを作成します。セピアとはイカ墨から作られる黒茶色の絵の具のことで、画像をセピア調にするということは、これで描かれたように見せるということである(らしいです)。セピア調変換には特定のアルゴリズムはありませんが、今回はセピアっぽく見える変換を行います。変換の方法としては、まず画像をグレイスケールに変換し、その後黒茶色っぽい色に変換するという流れです。

 Tutorial1Activityクラスと同じ場所にSepiaFilterクラスを作成します。その後、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;//①
            red=(int)(y_val*240)/255;//②
            green=(int)(y_val*200)/255;
            blue=(int)(y_val*145)/255;
            oimgArray[i]=255*16777216+red*65536+green*256+blue;
        }
        return oimgArray;
    }

 ①ではRGB値を輝度グレイスケールに変換しています。その後②で輝度をRGBそれぞれについて指定の割合で変換します。この割合はよく使われている程度の認識で大丈夫でしょう。

 最後に、 Tutorial1Activityクラスのint imageArray[]=ba2ia(ba);の下に以下の文を記入します。

imageArray=new SepiaFilter().filter(imageArray, imagewidth, imageheight);

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


0 件のコメント:

コメントを投稿