ノーマル解析

提供: HSDAnalyzerWiki
ナビゲーションに移動 検索に移動

差分処理、単波長処理、任意波長間処理、積分処理、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);
                }
            }
        }