2014-04-01 67 views
1

我试图实现一个retinex过滤器之后发布here之一。刚开始,他定义:如何在C#中处理ImgData?

#define pc(image, x, y, c) image->imageData[(image->widthStep * y) + (image->nChannels * x) + c] 

,做高斯卷积时,他正在使用它作为:

v1 += kernel[k] * (unsigned char)pc(temp, i, source, 0); 

及更高版本:

pc(img, i, j, 0) = (char)int2smallint(v1); 

我不能把这种到C#,我也不明白他在做什么。 C#中没有无符号字符,并且访问图像数据的方式也完全不同。那么,在C#中实现这个最好的方法是什么?

+0

http://www.aforgenet.com/framework/docs/html/f074e0dd-865c-fd5f -ba0a-80e336a0eaea.htm –

回答

0

好的我解决了它。这:

v1 += kernel[k] * (unsigned char)pc(temp, i, source, 0); 

被翻译成:

IntPtr ptr = img.ImageData; 
v1 += kernel[k] * Marshal.ReadByte(ptr, (i * img.WidthStep) + (source * img.NChannels) + 0); 

元帅就是答案:)

1

有在C#

字节不无符号字符。在C/C++中的字符是C#中的一个字节,并且在C#中有字节;)

也是他访问图像数据的方式完全不同。

几乎没有。 ImageData是某种类型的位图,他通过数组语法完成简单的位图。这在C#中也是可行的 - 抓住位图或他使用的任何临时表单并将其放入一个字节数组中。现在不理解他所做的是失败的原因。我也不确定我Woudl没有把它吹到一个DirectX表面并为它写一个过滤器;)

+0

好的谢谢你的回复!我现在明白他在做什么,但我仍然无法访问图像中的每个像素。 C#中的等价物是什么:myimage.imageData [3 *(y * myimage.width + x)+0] = 100;例如红色通道? –

+0

取决于图像如何在位图形式中看起来像 - 你什么都没说。 – TomTom

+0

myimage是一个3通道IplImage。 myimage.ImageData确实存在,但它返回一个Intptr并且不允许索引... –