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

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

DEFINITIONS

This source file includes following definitions.
  1. HistogramBinaryAnaDisc
  2. getIkiti
  3. Write
  4. CalcBinary
  5. Calculation
  6. Calculation

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

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

/**
 * ヒストグラム二値化  判別分析法
 * @author kikuchi
 * @version 1.0.0
 */
public class HistogramBinaryAnaDisc extends HistogramBinary {
        
        int nIkiti_;    // 計算後の閾値
        
        public HistogramBinaryAnaDisc(){
                super();
                nIkiti_ = 0;
        }
        
        /** 判別分析法で求めた閾値を取得する
         *
         * @return      閾値
         */
        public int getIkiti() {
                return nIkiti_;
        }
        
        /**
         * ヒストグラム平坦化の実行
         *(輝度プレーンに関する計算)
         *
         * @param imgSrc        ソース画像
         * @param imgDst        出力画像
         * @param params        未使用
         */
        private void Write(BufferedImage imgSrc, BufferedImage imgDst) {
                // 実際に画像をつくる
                int param[] = new int [1];
                param[0] = nIkiti_;
                super.Calculation(0, imgSrc, imgDst, param);
        }

        /**
         * ヒストグラム二値化
         * ヒストグラムを判別分析法で閾値を求める
         *
         * @param nHist ヒストグラムの入った配列
         * @param num ヒストグラムの階調数
         * @return 閾値
         */
        public int CalcBinary(int[] nHistY, int num) {
                // 全部の濃度値(nThick)について、分析してみる
                int nThick;
                double dbSplit[] = new double[num]; // 分離値
                for (nThick = 0; nThick < num; nThick ++) {
                        int i;
                        int n1, n2;
                        int nSum1, nSum2;
                        double dbAve1, dbAve2, dbAveAll;
                        double dbDis, dbAll;
                        // 閾値以下と以上の 頻度 ->濃度*頻度 ->平均 -> 分散 を求めて 分離値を導く
                        // 頻度・濃度×頻度
                        n1 = nSum1 = 0;
                        n2 = nSum2 = 0;
                        for (i = 0; i < nThick; i ++) {
                                n1 += nHistY[i];
                                nSum1 += (i * nHistY[i]);
                        }
                        for (; i < num; i ++) {
                                n2 += nHistY[i];
                                nSum2 += (i * nHistY[i]);
                        }
                        // 平均
                        dbAve1 = (double)nSum1 / (double)n1;
                        dbAve2 = (double)nSum2 / (double)n2;
                        dbAveAll = (double)(nSum1 + nSum2) / (double)(n1 + n2);
                        // 分散
                        dbDis = n1 * (dbAve1 - dbAveAll) * (dbAve1 - dbAveAll) + n2 * (dbAve2 - dbAveAll) * (dbAve2 - dbAveAll);
                        dbAll = 0.0;
                        for (i = 0; i < num; i ++) {
                                dbAll += (i - dbAveAll) * (i - dbAveAll) * nHistY[i];
                        }
                        // 分離値
                        dbSplit[nThick] = dbDis / dbAll;
                }
                // 分離値の最大値を調べて、その濃度を閾値とする
                double dbMax = 0.0;
                nIkiti_ = 0;
                for (nThick = 0; nThick < num; nThick ++) {
                        if (dbMax < dbSplit[nThick]) {
                                dbMax = dbSplit[nThick];
                                nIkiti_ = nThick;
                        }
                }
                return nIkiti_;
        }

        /**
         * ヒストグラム二値化
         * 判別分析法
         *
         * @param flag          計算するプレーン 0 で濃度になる
         * @param imgSrc        ソース画像(YUV)
         * @param imgDst        出力画像
         * @param params        未使用
         */
        public void Calculation(int flag, BufferedImage imgSrc, BufferedImage imgDst, int[] params) {
                // 引数チェック
                if (flag == 0) flag = YP;
                int num = 256;

                // ヒストグラムを求める
                int nHistY[] = getHistgram(flag, imgSrc, num);
                // 閾値を求める
                CalcBinary(nHistY, num);
                // 描画
                Write(imgSrc, imgDst);
        }

        /**
         * ヒストグラム平坦化の実行
         *(輝度プレーンに関する計算)
         *
         * @param imgSrc        ソース画像
         * @param imgDst        出力画像
         * @param params        未使用
         */
        public void Calculation(BufferedImage imgSrc, BufferedImage imgDst, int[] params) {
                Calculation(0, imgSrc, imgDst, params);
        }
        
}

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