root/graph/JavaPopWeb/src/jp/ac/nime/computer/grpsimulator/ImgPr/HistogramOp.java

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. HistogramOp
  2. getHistgram
  3. getHistgram
  4. printHist
  5. printHist
  6. Calculation
  7. Calculation

package jp.ac.nime.computer.grpsimulator.ImgPr;

import java.awt.*;
import java.awt.image.*;
import java.util.*;

/**
 * 画像処理の為のBufferedImageのヒストグラムに関して処理するクラス
 * BufferedImageは、ARGBのINT型にパックされていると想定している。
 * バックされたINTのR, G, Bのどの位置で計算するかはフラグで指定する。
 * @author Kikuchi
 * @since 0.2
 * @version 1.0.0
 */
public class HistogramOp {
        /**
        * 処理するプレーン
        */
        public final static int RP = 2;
        public final static int GP = 1;
        public final static int BP = 0;
        public final static int YP = 2;
        public final static int UP = 1;
        public final static int VP = 0;

        /**
        * ヒストグラムを取得する flagが0だったら Y(R)を計算対象とする
        */
        public int[] getHistgram(int flag, BufferedImage imgSrc, int num) {
                // 引数チェック
                if (num <= 1) {
                        throw new IllegalArgumentException("need num over 1");
                }
                if (flag == 0)  flag = YP;
                // 係数計算
                double dbStep = 256.0 / num;
                int nHist[] = new int [num];
                Arrays.fill(nHist, 0);
                // 全部のピクセルを調べてカウントする
                for (int h = 0; h < imgSrc.getHeight(); h ++) {
                        for (int w = 0; w < imgSrc.getWidth(); w ++) {
                                // 注目プレーンとそれ以外をもとめる
                                int ayuv = imgSrc.getRGB(w, h); // ARGB つまり AYUV
                                double watch = 0.0;
                                switch (flag) {
                                case YP:
                                        watch  = (ayuv & 0x00ff0000) >> 16;
                                        break;
                                case UP:
                                        watch  = (ayuv & 0x0000ff00) >> 8;
                                        break;
                                case VP:
                                        watch  = (ayuv & 0x000000ff);
                                        break;
                                }
                                // 計算
                                int n = (int)((watch / dbStep) + 0.5);
                                if (n > num - 1) n = num - 1; // ありえないけどチェック
                                nHist[n] ++;
                        }
                }
                // for (int i = 0; i < num; i ++) System.out.print("nHist[" + i + "] = " + nHist[i] + "\t");    
                return nHist;
        }
        /**
        * ヒストグラムを取得する flagが省略されたら Y(R)を計算対象とする
        */
        public int[] getHistgram(BufferedImage imgSrc, int num) {
                return getHistgram(0, imgSrc, num);
        }

        /**
         * ヒストグラムの選択された部分だけを Dstに転送する
         * 
         * @param flag          計算するプレーン 0 で濃度になる
         * @param imgSrc        ソース画像(YUV or RGB)
         * @param imgDst        出力画像
         * @param nSelected[] ヒストグラム 0 - 100% の間の選択されているものが 1, そうでないものが 0
         */
        public void printHist(int flag, BufferedImage imgSrc, BufferedImage imgDst, int nSelected[]) {
                // 引数チェック
                if (nSelected.length < 100) {
                        throw new IllegalArgumentException("params.length need 100");
                }
                if (flag == 0) flag = YP;
                int num = nSelected.length;
                if (num > 100) num = 100;
                // 係数計算
                double dbStep = 256.0 / num;
                // 全部のピクセルを調べてカウントする
                for (int h = 0; h < imgSrc.getHeight(); h ++) {
                        for (int w = 0; w < imgSrc.getWidth(); w ++) {
                                // 注目プレーンとそれ以外をもとめる
                                int ayuv = imgSrc.getRGB(w, h); // ARGB つまり AYUV
                                double watch = 0.0;
                                switch (flag) {
                                case YP:
                                        watch  = (ayuv & 0x00ff0000) >> 16;
                                        break;
                                case UP:
                                        watch  = (ayuv & 0x0000ff00) >> 8;
                                        break;
                                case VP:
                                        watch  = (ayuv & 0x000000ff);
                                        break;
                                }
                                // 計算
                                int n = (int)((watch / dbStep) + 0.5);  // ヒストグラムの配列の要素番号も求める
                                if (n > num - 1) n = num - 1; // ありえないけどチェック
                                // 選択されているものだったら Dstに書き戻す そうでなければ 黒
                                if (nSelected[n] == 1)
                                        imgDst.setRGB(w, h, ayuv);
                                else
                                        imgDst.setRGB(w, h, 0xff000000);
                        }
                }
        }
        /**
         * ヒストグラムの選択された部分だけを Dstに転送する
         * 
         * @param flag          計算するプレーン 0 で濃度になる
         * @param imgSrc        ソース画像
         * @param imgDst        出力画像
         * @param nSelected[] ヒストグラム 0 - 100% の間の選択されているものが 1, そうでないものが 0
         */
        public void printHist(BufferedImage imgSrc, BufferedImage imgDst, int nSelected[]) {
                printHist(0, imgSrc, imgDst, nSelected);
        }

        /**
         * ヒストグラムに関する計算
         *
         * @param flag          計算するプレーン 0 で濃度になる
         * @param imgSrc        ソース画像
         * @param imgDst        出力画像
         * @param params        引数。個数や意味は、関数によって異なる
         */
        public void Calculation(int flag, BufferedImage imgSrc, BufferedImage imgDst, int[] params) {};

        /**
         * ヒストグラムに関する計算
         *(輝度プレーンに関する計算)
         *
         * @param imgSrc        ソース画像
         * @param imgDst        出力画像
         * @param params        引数。個数や意味は、関数によって異なる
         */
        public void Calculation(BufferedImage imgSrc, BufferedImage imgDst, int[] params) {};

}



/* [<][>][^][v][top][bottom][index][help] */