3

我正在尝试通过将 emgu Cv 与 C# 一起使用来获取和设置灰度图像的像素。如果我使用较大的图像尺寸,则会出现此错误消息:“索引超出了数组的范围。”

如果我使用 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 回答