/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- ImageProcess
- ProcessImage
- ProcessContrast
- ProcessHighPass
- ProcessHighCut
- ProcessLabeling
- ProcessDensityLine
- ProcessLevelChange
- ProcessShowEdge
- ProcessSmoothing
- ProcessRemoveNoise
- ProcessEmphasis
- ProcessHistogramPrint
- ProcessHistogramNormal
- ProcessHistogramBinary
- ProcessFillRGB
- ProcessDescriptPoint
- resize
- ProcessMeasureTrim
- ProcessMeasureThinning
- ProcessMeasureArea
- ProcessMeasureScale
- ProcessAnalyzeFourier
- ProcessAnalyzeProjection
- ProcessAnalyzeReflectance
package jp.ac.nime.computer.grpsimulator;
import java.awt.*;
import java.awt.image.*;
import jp.ac.nime.computer.grpsimulator.ImgPr.*;
import jp.ac.nime.computer.grpsimulator.VecPr.*;
import java.awt.event.*;
/** ImageProcessクラスは、各種画像処理を呼び出すためのstaticなメソッドを持つクラスです
* @version 1.0.0
* @author igarashi
* @author kikuchi
*/
public class ImageProcess {
/** 各種画像処理を行います
* @param img 処理対象の画像バッファです
* @param param 画像処理パラメータを指示するParameterSettingクラスのオブジェクト
* @return 成功時にはtrue
* @see GrpSimBuffer
* @see ParameterSetting
*/
public static boolean ProcessImage(GrpSimBuffer img, ParameterSetting param) {
int params[] = param.getParameters();
if (params != null) {
switch( param.getParameterType() ) {
case ParameterSetting.PARAM_TYPE_CONTRAST:
return ProcessContrast(img, params[0]);
case ParameterSetting.PARAM_TYPE_HIGHPASS:
return ProcessHighPass(img, params[0]);
case ParameterSetting.PARAM_TYPE_HIGHCUT:
return ProcessHighCut(img, params[0]);
case ParameterSetting.PARAM_TYPE_LABELING:
return ProcessLabeling(img, params[0]);
case ParameterSetting.PARAM_TYPE_DENSITYLINE:
return ProcessDensityLine(img, params[0]);
case ParameterSetting.PARAM_TYPE_LEVELCHANGE:
if (params.length < 2) return false;
return ProcessLevelChange(img, params[0], params[1]);
case ParameterSetting.PARAM_TYPE_HISTO_PRINT:
// ヒストグラムの該当部分だけをDstに転送する
// 100個のint配列、ヒストグラムの選択状態(0:非選択,1:選択)
return ProcessHistogramPrint(img, params);
case ParameterSetting.PARAM_TYPE_HISTO_NORMAL:
// ヒストグラム平滑化
// 100個のint配列、ヒストグラムの選択状態(0:非選択,1:選択)
return ProcessHistogramNormal(img, params);
case ParameterSetting.PARAM_TYPE_HISTO_BINARY:
// ヒストグラム2値化
// 100個のint配列、ヒストグラムの選択状態(0:非選択,1:選択)
// 選択状態で最小値を選ぶ
int iki = -1;
for (int i = 0; i < params.length; i ++) {
if (params[i] == 1) {
iki = i;
break;
}
}
if (iki == -1) return false; // 選択されていなければ、なにもしない
return ProcessHistogramBinary(img, iki);
case ParameterSetting.PARAM_TYPE_SHOW_EDGE:
// エッジ抽出
// 9個のint配列
if (params.length < 9) return false;
return ProcessShowEdge(img, params);
case ParameterSetting.PARAM_TYPE_SMOOTHING:
// 平滑化
// 9個のint配列
if (params.length < 9) return false;
return ProcessSmoothing(img, params);
case ParameterSetting.PARAM_TYPE_REMOVE_NOISE:
// ノイズ除去
// 9個のint配列
if (params.length < 9) return false;
return ProcessRemoveNoise(img, params);
case ParameterSetting.PARAM_TYPE_EMPHASIS:
// 強調処理
// 9個のint配列
if (params.length < 9) return false;
return ProcessEmphasis(img, params);
case ParameterSetting.PARAM_TYPE_FILL_RGB:
// 画像データ表現 色
return ProcessFillRGB(img, params[0]);
case ParameterSetting.PARAM_TYPE_DESCRIPT_POINT:
// 画像データ表現 点
if (param instanceof VectorDataDialog) {
VectorDataDialog steps = (VectorDataDialog) param;
return ProcessDescriptPoint(img, steps.getVectorData(), params[0]);
}
return false;
case ParameterSetting.PARAM_TYPE_MEASURE_TRIM:
// 画像計測 切り出し
if (param instanceof SteppingParameter) {
SteppingParameter steps = (SteppingParameter) param;
return ProcessMeasureTrim(img, steps.getStepCount());
}
return false;
case ParameterSetting.PARAM_TYPE_MEASURE_SCALE:
// 画像計測 拡大縮小
return ProcessMeasureScale(img, params[0]);
case ParameterSetting.PARAM_TYPE_MEASURE_SHARP:
// 画像計測 細線化
if (param instanceof SteppingParameter) {
SteppingParameter steps = (SteppingParameter) param;
return ProcessMeasureThinning(img, steps.getStepCount(), params[0]);
}
return false;
case ParameterSetting.PARAM_TYPE_MEASURE_AREA:
// 画像計測 面積
if (param instanceof SteppingParameter) {
SteppingParameter steps = (SteppingParameter) param;
return ProcessMeasureArea(img, steps);
}
return false;
case ParameterSetting.PARAM_TYPE_ANALYZE_FOURIER:
// 画像解析 フーリエ展開
if (params.length < 2) return false;
return ProcessAnalyzeFourier(img, params[0], params[1]);
case ParameterSetting.PARAM_TYPE_DESCRIPT_PROJECTION:
// 画像解析 投影
if (params.length < 2) return false;
return ProcessAnalyzeProjection(img, params[0], params[1]);
case ParameterSetting.PARAM_TYPE_DESCRIPT_REFLECTANCE:
// 画像解析 反射
if (params.length < 8) return false;
return ProcessAnalyzeReflectance(img, params);
}
}
return false;
}
private static boolean ProcessContrast(GrpSimBuffer img, int nContrast) {
if (nContrast<-10 || nContrast>10) return false;
TransContrast filer = new TransContrast();
int[] param = new int[1];
param[0] = nContrast;
filer.Filter(img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), param);
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
return true;
}
private static boolean ProcessHighPass(GrpSimBuffer img, int nStartLevel) {
if (nStartLevel<0 || nStartLevel>100) return false;
TransHighPass filer = new TransHighPass();
int[] param = new int[1];
param[0] = nStartLevel;
filer.Filter(img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), param);
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
return true;
}
private static boolean ProcessHighCut(GrpSimBuffer img, int nStartLevel) {
if (nStartLevel<0 || nStartLevel>100) return false;
TransHighCut filer = new TransHighCut();
int[] param = new int[1];
param[0] = nStartLevel;
filer.Filter(img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), param);
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
return true;
}
private static boolean ProcessLabeling(GrpSimBuffer img, int nNumOfPhases) {
if (nNumOfPhases<1 || nNumOfPhases>255) return false;
TransFloorQuantum filer = new TransFloorQuantum();
int[] param = new int[1];
param[0] = nNumOfPhases;
filer.Filter(img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), param);
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
return true;
}
private static boolean ProcessDensityLine(GrpSimBuffer img, int nNumOfPhases) {
if (nNumOfPhases<1 || nNumOfPhases>100) return false;
TransConcentLine filer = new TransConcentLine();
int[] param = new int[1];
param[0] = nNumOfPhases;
filer.Filter(img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), param);
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
return true;
}
private static boolean ProcessLevelChange(GrpSimBuffer img, int nBottomLevel, int nTopLebel) {
if (nBottomLevel<0 || nBottomLevel>49 || nTopLebel<50 || nTopLebel>100) return false;
TransDynamicExpnd filer = new TransDynamicExpnd();
int[] param = new int[2];
param[0] = nBottomLevel;
param[1] = nTopLebel;
filer.Filter(img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), param);
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
return true;
}
// 3 * 3
private static boolean ProcessShowEdge(GrpSimBuffer img, int nFilter[]) {
NeighborOp filer = new NeighborOp(3, nFilter, 1);
filer.Filter(0, img);
// RGBを変更したのでYUVも変更する。
img.syncDst(img.RGB);
return true;
}
private static boolean ProcessSmoothing(GrpSimBuffer img, int nFilter[]) {
int ndiv = 0;
for (int i = 0; i < 9; i ++) {
ndiv += nFilter[i];
}
NeighborOp filer = new NeighborOp(3, nFilter, ndiv);
filer.Filter(0, img);
// RGBを変更したのでYUVも変更する。
img.syncDst(img.RGB);
return true;
}
private static boolean ProcessRemoveNoise(GrpSimBuffer img, int nFilter[]) {
int ndiv = 0;
for (int i = 0; i < 9; i ++) {
ndiv += nFilter[i];
}
NeighborOp filer = new NeighborOp(3, nFilter, ndiv);
filer.Filter(0, img);
// RGBを変更したのでYUVも変更する。
img.syncDst(img.RGB);
return true;
}
private static boolean ProcessEmphasis(GrpSimBuffer img, int nFilter[]) {
NeighborOp filer = new NeighborOp(3, nFilter, 1);
filer.Filter(0, img);
// RGBを変更したのでYUVも変更する。
img.syncDst(img.RGB);
return true;
}
// ヒストグラム
private static boolean ProcessHistogramPrint(GrpSimBuffer img, int nSelected[]) {
HistogramOp filter = new HistogramOp();
filter.printHist(filter.YP, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), nSelected);
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
return true;
}
private static boolean ProcessHistogramNormal(GrpSimBuffer img, int nSelected[]) {
HistogramFlat filter = new HistogramFlat();
filter.Calculation(filter.YP, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), nSelected);
//filter.Normal(filter.YP, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV));
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
return true;
}
private static boolean ProcessHistogramBinary(GrpSimBuffer img, int nIkiti) {
HistogramBinary filter = new HistogramBinary();
int param[] = new int [1];
param[0] = nIkiti;
filter.Calculation(img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), param);
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
return true;
}
// データ表現 色
/** 画像データ表現 点
* @param img 画像管理クラス
* @param rgb 決定した色
* @return 正常終了ならtrue
*/
private static boolean ProcessFillRGB(GrpSimBuffer img, int rgb) {
BufferedImage imgRGB = img.getDstImage(GrpSimBuffer.RGB);
int w = imgRGB.getWidth();
int h = imgRGB.getHeight();
int[] tmp = new int[w * h];
java.util.Arrays.fill(tmp,0xFF000000|rgb);
imgRGB.setRGB(0,0,w,h,tmp,0,1);
// RGBを変更したのでYUVも変更する。
img.syncDst(img.RGB);
return true;
}
// データ表現点
/** 画像データ表現 点
* @param img 画像管理クラス
* @param gsdd Drawデータ
* @param nZoom 拡大縮小率(パーセント)
* @return 正常終了ならtrue
*/
private static boolean ProcessDescriptPoint(GrpSimBuffer img, GrpSimVectorData gsvd, int nZoom) {
BufferedImage imgSrc = img.getSrcImage(GrpSimBuffer.RGB);
BufferedImage imgBuf = new BufferedImage(imgSrc.getWidth(), imgSrc.getHeight(), BufferedImage.TYPE_INT_ARGB);
// srcに画像を展開する
int w = imgSrc.getWidth();
int h = imgSrc.getHeight();
int[] tmp = new int[w * h];
java.util.Arrays.fill(tmp,0xFFFFFFFF);
imgBuf.setRGB(0,0,w,h,tmp,0,1);
gsvd.write(imgBuf);
// resize
imgBuf = resize(imgBuf, nZoom);
imgBuf.copyData(imgSrc.getRaster());
// RGBを変更した
img.syncSrc(img.RGB);
// Dstに線画データ自体を拡大縮小して描画する
// ofs量を計算する
int ofx = - (((nZoom * 160) / 100) - 160);
int ofy = - (((nZoom * 120) / 100) - 120);
img.getDstImage(GrpSimBuffer.RGB).setRGB(0,0,w,h,tmp,0,1);
gsvd.write(img.getDstImage(GrpSimBuffer.RGB), nZoom, ofx, ofy);
// RGBを変更した
img.syncDst(img.RGB);
return true;
}
/** 画像バッファをリサイズする
* @param img 元画像バッファ
* @param nZoom 拡大縮小率(パーセント)
* @return リサイズ後の画像バッファ
*/
private static BufferedImage resize(BufferedImage img, int nZoom) {
if (nZoom < 1) nZoom = 1;
int w = img.getWidth();
int h = img.getHeight();
int newW = w * nZoom / 100;
int newH = h * nZoom / 100;
BufferedImage after = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
int[] tmp = new int[w * h];
java.util.Arrays.fill(tmp,0xFFFFFFFF);
after.setRGB(0,0,w,h,tmp,0,1);
Graphics2D graphics = after.createGraphics();
Image resized = img.getScaledInstance(newW, newH, Image.SCALE_FAST);
graphics.drawImage(resized, (w - newW) / 2 , (h - newH) / 2, null);
graphics.dispose();
return after;
}
// 画像計測 切り出し
static MeasureTrim mt_ = null;
/** 画像計測切り出し 操作関数
* @param img 画像管理クラス
* @param nStepCount パラメタ
* @return 正常終了ならtrue
*/
private static boolean ProcessMeasureTrim(GrpSimBuffer img, int nStepCount) {
// 画像計測 切り出し
//System.out.println("Step Test : " + nStepCount); // debug
if (mt_ == null)
mt_ = new MeasureTrim();
if (nStepCount == 1) {
// 二値化データ作成
mt_.makeWB(0, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV));
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
// 計算初期化
mt_.init(0, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV));
} else if (nStepCount == 0) {
// 初期に戻る
if (mt_ != null) {
//while (mt_.checkCalcEnd()) {
// 1Step実行
// mt_.calcStep();
//}
mt_ = null;
}
} else if (nStepCount < 0) {
// 最後まで実行
while (mt_.checkCalcEnd()) {
// 1Step実行
mt_.calcStep();
}
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
// 開放
mt_ = null;
} else {
// 1Step実行
mt_.calcStep();
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
}
return true;
}
// 画像計測 細線化処理
static MeasureThinning mth_ = null;
/** 画像計測 細線化処理 操作関数
* @param img 画像管理クラス
* @param nStepCount パラメタ
* @param nHigeMax ヒゲ回避回数(nStepCountが1のとき意味を持つ)
* @return 正常終了ならtrue
*/
private static boolean ProcessMeasureThinning(GrpSimBuffer img, int nStepCount, int nHigeMax) {
// 画像計測 切り出し
//System.out.println("Step Test : " + nStepCount); // debug
if (mth_ == null)
mth_ = new MeasureThinning();
if (nStepCount == 1) {
// 二値化データ作成
mth_.makeWB(0, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV));
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
// 計算初期化
mth_.init(0, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV), nHigeMax);
} else if (nStepCount == 0) {
// 初期に戻る
if (mth_ != null) {
//while (mth_.checkCalcEnd()) {
// 1Step実行
// mth_.calcStep();
//}
mth_ = null;
}
} else if (nStepCount < 0) {
// 最後まで実行
while (mth_.checkCalcEnd()) {
// 1Step実行
mth_.calcStep();
}
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
// 開放
mth_ = null;
} else {
// 1Step実行
mth_.calcStep();
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
}
return true;
}
// 画像計測 面積
static MeasureArea mA_ = null;
/** 画像計測切り出し 操作関数
* @param img 画像管理クラス
* @param steps パラメタ
* @return 正常終了ならtrue
*/
private static boolean ProcessMeasureArea(GrpSimBuffer img, SteppingParameter steps) {
// 画像計測 切り出し
//System.out.println("Step Test : " + nStepCount); // debug
int nStepCount = steps.getStepCount();
if (mA_ == null)
mA_ = new MeasureArea();
if (nStepCount == 1) {
// 二値化データ作成
mA_.makeWB(0, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV));
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
// 計算初期化
mA_.init(0, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV));
} else if (nStepCount == 2) {
// ラベリング
mA_.labeling();
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
} else if (nStepCount == 0) {
// 初期に戻る
if (mA_ != null) {
//while (mA_.checkCalcEnd()) {
// 1Step実行
// mA_.calcStep();
//}
mA_ = null;
}
} else if (nStepCount < 0) {
// 最後まで実行
while (mA_.checkCalcEnd()) {
// 1Step実行
mA_.calcStep();
}
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
// 面積の一覧を出力する
steps.setStepResult(mA_.getArea());
// 開放
mA_ = null;
} else {
// 1Step実行
mA_.calcStep();
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
}
return true;
}
/** 画像計測 拡大縮小の処理
* @param img GrpSim画像バッファクラス
* @param nAction 処理内容
* @return 正常終了ならtrue
*/
private static boolean ProcessMeasureScale(GrpSimBuffer img, int nAction) {
MeasureScale ms = new MeasureScale();
// YUVでそうさ
ms.action(0, nAction, img.getSrcImage(img.YUV), img.getDstImage(img.YUV));
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
return true;
}
// 画像認識
static AnalyzeFourier af_ = new AnalyzeFourier();
/** 画像認識 フーリエ展開
* @param img GrpSim画像バッファクラス
* @param nAction 処理内容
* @param nCutOff 遮断次数
* @return 正常終了ならtrue
*/
private static boolean ProcessAnalyzeFourier(GrpSimBuffer img, int nAction, int nCutOff) {
switch (nAction) {
case 1:
// 二値化 境界
af_.makeWB(0, img.getSrcImage(GrpSimBuffer.YUV), img.getDstImage(GrpSimBuffer.YUV));
// YUVを変更したのでRGBも変更する。
img.syncDst(img.YUV);
af_.init(0, img.getSrcImage(GrpSimBuffer.YUV));
// 画像描画
af_.writeSrcDiag(img.getDstImage(GrpSimBuffer.RGB));
// RGBを変更したのでYUVも変更する。
img.syncDst(img.RGB);
return true;
case 2:
// 計算
af_.calcPFFT(nCutOff);
// 描画
af_.writeFFTDiag(img.getDstImage(GrpSimBuffer.RGB));
// RGBを変更したのでYUVも変更する
img.syncDst(img.RGB);
return true;
default:
return false;
}
}
/** 画像認識 投影
* @param img GrpSim画像バッファクラス
* @param nProj 投影面の位置
* @param nCame 視点の位置
* @return 正常終了ならtrue
*/
private static boolean ProcessAnalyzeProjection(GrpSimBuffer img, int nProj, int nCame) {
AnalyzeProjection ap = new AnalyzeProjection();
// ソース画像側にパラレル
ap.Parallel(img.getSrcImage(GrpSimBuffer.RGB), (double)nCame, (double)nProj);
img.syncSrc(GrpSimBuffer.RGB);
// Dst画像側にパースペクティブ
ap.Perspective(img.getDstImage(GrpSimBuffer.RGB), (double)nCame, (double)nProj);
img.syncDst(GrpSimBuffer.RGB);
return true;
}
/** 画像認識 リフレクタンス
* @param img GrpSim画像バッファクラス
* @param nPrams パラメタ8個
* @return 正常終了ならtrue
*/
private static boolean ProcessAnalyzeReflectance(GrpSimBuffer img, int[] nParams) {
AnalyzeReflectance ar = new AnalyzeReflectance(GrpSim.res_);
// ソース画像側にFace
ar.faceColor(img.getSrcImage(GrpSimBuffer.RGB), nParams[0], nParams[1], nParams[2], nParams[3], nParams[4], nParams[5], nParams[6], nParams[7]);
img.syncSrc(GrpSimBuffer.RGB);
// Dst画像側にSphere
ar.sphere(img.getDstImage(GrpSimBuffer.RGB), nParams[0], nParams[1], nParams[2], nParams[3], nParams[4], nParams[5], nParams[6], nParams[7]);
img.syncDst(GrpSimBuffer.RGB);
return true;
}
}