我试图通过使用带有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
请帮助我,对不起我不擅长英语。
答案 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
}
}