2017年2月8日水曜日

ネガポジ反転(NegaPosiFilter)

今回はネガポジ反転フィルターを作成します。ネガポジ反転は画像の白を黒に、黒を白に反転することで、写真のネガのようにする変換です。処理としてはRGB各色の最大値である255から現在の色の値を引いて新しい色の値を得ます。

 Tutorial1Activityクラスと同じ場所にGrayscaleFilterクラスを作成します。その後、filterメソッドに以下のコードを入力します。
    public int[] filter(int[] imageArray, int width, int height) {
        int table[]=new int[256];
        for(int i =0;i < 256;i++){
            table[i]=255-i;//①
        }
        int length = width*height;
        int[] oimgArray = new int[imageArray.length];
        int rgb;
        int red,green,blue;
        for(int i =0;i < length;i++){
            rgb = imageArray[i];
            red = (rgb >> 16) & 0xff;
            green = (rgb >> 8) & 0xff;
            blue = (rgb) & 0xff;
            oimgArray[i]=255*16777216+
                    table[red]*65536+table[green]*256+table[blue];//②
        }
        return oimgArray;
    }

 ①ではRGBの色の値の範囲すべてについて、ネガポジ反転を行って得られる新しい値を配列に格納しています。このようにあらかじめ計算後の値を配列などに格納するとき、配列のことをルックアップテーブル(LUT)とよびます。ルックアップテーブルについて詳しくは以下のHPを参照してください。
http://imagingsolution.blog107.fc2.com/blog-entry-67.html
 ②ではルックアップテーブルに基づいてRGB各色をネガポジ反転しています。

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

以下に実機での実行結果を示します。ヒストグラムを見ると、これまでのヒストグラムから左右が反転していることがわかります。

0 件のコメント:

コメントを投稿