/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- HistogramBinaryAnaDisc
- getIkiti
- Write
- CalcBinary
- Calculation
- 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);
}
}