/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- HistogramOp
- getHistgram
- getHistgram
- printHist
- printHist
- Calculation
- 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) {};
}