获取并设置像素灰度图像使用Emgu CV

时间:2013-06-08 22:25:35

标签: emgucv

我试图通过使用带有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

请帮助我,对不起我不擅长英语。

2 个答案:

答案 0 :(得分: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;
} 

答案 1 :(得分:4)

那是因为x和y在数据数组中被反转。您应该以这种方式更改代码(反转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
        }
    }

另见Iterate over pixels of an image with emgu cv