1

以下は、画像ファイラーを適用して画像をクリアしようとしている私のコードの一部です

       //Convert the image to integer array
        uint[,] image = new uint[use.Width, use.Height];
        for (i = 0; i < use.Width; i++)
        {
            for (j = 0; j < use.Height; j++)
            {
                image[i, j] = Convert.ToUInt32(use.GetPixel(i, j).R);
            }
        }

        int Block = 5;
        int BlockSqr = 25;

        // Internal Block Processing
        for (i = Block; i < use.Width- Block; i = i + 1)
            for (j = Block; j < use.Height- Block; j = j + 1)
            {
                int lM, lVAR;

                // Calculating the Mean of the Block
                tmp = 0;
                for (int k = i - Block; k < i + Block; k = k + 1)
                {
                    for (int l = j - Block; l < j + Block; l = l + 1)
                    {
                        tmp = tmp + image[k, l];
                    }
                }
                lM = Convert.ToInt32(Math.Abs(tmp / BlockSqr));

                // Calculating the Variance of the Block
                tmp = 0;
                M1 = 0;
                for (int k = i - Block; k < Block + i; k = k + 1)
                {
                    for (int l = j - Block; l < Block + j; l = l + 1)
                    {
                        M1 = ((image[k, l] - Convert.ToUInt32(lM)) * (image[k, l] - Convert.ToUInt32(lM)));
                        tmp = tmp + M1;
                    }
                }
                lVAR = Convert.ToInt32(Math.Abs(tmp / BlockSqr));

                //Putting the filtered value

                float tm = (lVAR - mVAR);
                float tm1 = tm / lVAR;
                int mm = Convert.ToInt32(image[i, j] - lM);
                float tm2 = tm1 * (image[i, j] - lM);
                int A = lM + Convert.ToInt32(tm2);

                if (A < 255)
                    Wiener.SetPixel(i, j, Color.FromArgb(255, A, A, A));

            }

問題は、画像を処理するときに以下のエラーが発生することです

Int32 の値が大きすぎるか小さすぎます。

の上

int A = lM + Convert.ToInt32(tm2);

問題は何ですか?

編集:いくつかのデバッグを行いました

lM ホールド 0 および lVAR ホールド 0

4

2 に答える 2

2

tm2 は、Int32 の最大値よりも大きいか、Int32 の最小値よりも小さい値である可能性があります...次のようなチェックを追加します...

double AD = lM + Convert.ToInt32(tm2);
if((AD >= 0) && (AD < 255)) {
  int A = Convert.ToInt32(AD);
  Wiener.SetPixel(i, j, Color.FromArgb(255, A, A, A));
}

または似たようなもの...

于 2012-08-08T19:00:01.817 に答える
1

符号付き整数は、-2,147,483,648 から 2,147,483,647 の間の値のみを格納できます。

unsigned負の値が必要ない場合は、整数で 40 億を超える数値を取得できます。

それだけでは不十分な場合は、longはるかに大きな数値を格納できる型を使用できます。

また、NaN「数値ではない」という意味です。おそらくデバッガーを使用して、その数値がどのように計算されるかを確認する必要があります。ゼロで除算したり、他の NAN で算術を行ったり、数学的にならない他のことを行ったりしていないことを確認してください。検出。

于 2012-08-08T18:54:18.790 に答える