3

C# で emgu Cv を使用して、グレー スケール イメージのピクセルを取得および設定しようとしています。大きな画像サイズを使用すると、「インデックスが配列の範囲外でした」というエラー メッセージが表示されます。

200x200 以下の画像を使用するとエラーは発生しませんが、その理由がわかりません。

以下は私のコードです:

 Image<Gray , byte> grayImage;
--------------------------------------------------------------------

        for (int v = 0; v < grayImage.Height; v++)
        {
            for (int u = 0; u < grayImage.Width; u++)
            {
                byte a = grayImage.Data[u , v , 0]; //Get Pixel Color | fast way
                byte b = (byte)(myHist[a] * (K - 1) / M);
                grayImage.Data[u , v , 0] = b; //Set Pixel Color | fast way
            }
        }
--------------------------------------------------------------------

http://i306.photobucket.com/albums/nn262/neji1909/9-6-25565-10-39.png

私を助けてください。申し訳ありませんが、私は英語が苦手です。

4

2 に答える 2

5

(x,y) ではなく (row, col) でインデックスを作成しています - 反転。200x200 の画像を使用した場合、幅を使用しても高さを使用しても同じでした。

インデックスを使用している場合、EmguCV はすべてのピクセルに対して内部的に opencv の呼び出しを使用するため、ポインターを使用してそれを行うことができます (はるかに高速です)。

それで:

byte* ptr = (byte*)image.MIplImage.imageData;
int stride = image.MIplImage.widthStep;

int width = image.Width;
int height = image.Height;

for(int j = 0; j < height; j++) 
{
  for(int i = 0; i < width; i++)
  {
     ptr[i] = (byte)(myHist[a] * (K - 1) / M);
  }

  ptr += stride;
} 
于 2013-06-30T11:18:20.467 に答える
4

これは、x と y が Data 配列で反転されているためです。コードを次のように変更する必要があります (u と v を反転)。

    for (int v = 0; v < grayImage.Height; v++)
    {
        for (int u = 0; u < grayImage.Width; u++)
        {
            byte a = grayImage.Data[v , u , 0]; //Get Pixel Color | fast way
            byte b = (byte)(myHist[a] * (K - 1) / M);
            grayImage.Data[v , u , 0] = b; //Set Pixel Color | fast way
        }
    }

emgu cv を使用して画像のピクセルを反復処理するも参照してください。

于 2013-06-09T13:56:44.143 に答える