ノーマル解析
ナビゲーションに移動
検索に移動
差分処理、単波長処理、任意波長間処理、積分処理、NDSI処理のプログラム処理は以下のとおりとなっています。
差分処理(NDVI処理)
当初、NDVIを算出するために実装しているため、IR,Rという表記になっています。
double ir = 0, r = 0;
double sum = 0;
if(IR.d < IR.u)バンド範囲の値に応じてIR値を求める
{
for(int i = IR.d; i <= IR.u; i++) IRのバンド範囲のデータを加算
{
sum += data[i];
}
ir = (double)sum / (double)(IR.u - IR.d); バンド範囲の平均をIR値とする
}
else if (IR.d == IR.u)
{
sum = data[IR.u];
ir = (double)sum;
}
else
{
for (int i = IR.u; i <= IR.d; i++)
{
sum += data[i];
}
ir = (double)sum / (double)(IR.u - IR.d);
}
sum = 0;
if(R.d < R.u)バンド範囲の値に応じてR値を求める
{
for(int i = R.d; i <= R.u; i++) Rのバンド範囲のデータを加算
{
sum += data[i];
}
r = (double)sum / (double)(R.u - R.d); バンド範囲の平均をR値とする
}
else if (R.d == R.u)
{
sum = data[R.u];
r = (double)sum;
}
else
{
for (int i = R.u; i <= R.d; i++)
{
sum += data[i];
}
r = (double)sum / (double)(R.u - R.d);
}
double NDVI = (ir - r) / (ir + r); NDVI値を求める
return NDVI;
}
単波長処理
1点の座標について、スペクトルデータから任意の1バンドのデータを取り出します。この処理を全ての座標に対して行います。
public double getStandAloneWave(int cal, int x, int y, int k) スペクトルデータ取出し方、座標、バンドを引数として受け取る
{
double data = 0;
double[] buff;
if (cal == 0)
{
data = (double)HSData[x, y, k]; 3次元配列から任意の座標、バンドのデータを取得する
}
else
{
buff = getData(cal, x, y); 反射率、正規化などのデータから任意のバンドのデータを取得する
data = buff[k];
}
return data;
}
任意波長間処理
1点の座標について、スペクトルデータ中の任意のバンド間での平均を求めます。この処理を全ての座標に対して行います。
public struct WAVEZONE バンド範囲を表す構造体
{
public int u; 範囲の上限
public int d; 範囲の下限
public WAVEZONE(int a, int b) コンストラクタ
{
u = a;
d = b;
}
};
public double getAaverageWave(double[] data, WAVEZONE w)スペクトルデータとバンド範囲を引数として受け取る
{
double ave = 0;
WAVEZONE ww; バンド範囲
if (w.u < w.d) 引数のバンド範囲が上下逆だった場合は逆にして代入する
{
ww.u = w.d;
ww.d = w.u;
}
else
{
ww = w; 引数をそのまま代入する
}
for (int i = ww.d; i <= ww.u; i++) バンド範囲内のデータを加算
{
ave += data[i];
}
try
{
ave /= Math.Abs(ww.u - ww.d) + 1; バンド範囲で割る
}
catch
{
ave = 0;
}
return ave;
}
積分処理
1点の座標について、スペクトルデータ中の任意のバンド間のデータを加算します。この処理を全ての座標に対して行います。
public double getIntegral(double[] data, WAVEZONE w) スペクトルデータとバンド範囲を引数として受け取る
{
double inte = 0;
WAVEZONE ww; バンド範囲
if (w.u < w.d) 引数のバンド範囲が上下逆だった場合は逆にして代入する
{
ww.u = w.d;
ww.d = w.u;
}
else
{
ww = w; 引数をそのまま代入する
}
for (int i = ww.d; i <= ww.u; i++) バンド範囲内のデータを加算
{
inte += data[i];
}
return inte;
}
NDSI処理
全波長の組み合わせで差分処理を行っています。
//NDSI計算を行う
private void CalcNDSI()
{
int r, ir;
//data = sel.getData(x, y);
for (ir = Form1.HSDSobj.bands - 1; ir > 0; ir--)
{
for (r = 0; r < ir; r++)
{
R.d = R.u = r;
IR.d = IR.u = ir;
ndvi[r, Form1.HSDSobj.bands - 1 - ir] = sel.getNDVI(data, IR, R);
}
}
}