【问题标题】:How to handle ImgData in C#?如何在 C# 中处理 ImgData?
【发布时间】:2014-04-01 17:09:38
【问题描述】:

我正在尝试在发布here 之后实现一个 retinex 过滤器。一开始他定义:

#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# 中实现这一点的最佳方法是什么?

【问题讨论】:

标签: c# gaussian convolution iplimage


【解决方案1】:

C# 中没有无符号字符

字节。 C/C++中的char在C#中是一个字节,在C#中有字节;)

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

几乎没有。 ImageData 是某种类型的位图,他通过数组语法处理简单的位图。这在 C# 中也是可行的 - 获取位图或他使用的任何临时形式并将其放入字节数组中。现在不明白他做了什么,这是一个失败的事业。我也不确定我不会将它炸到 DirectX 表面并为此编写过滤器;)

【讨论】:

  • 好的,谢谢您的回复!我现在明白他在做什么,但我仍然无法访问图像中的每个像素。在 C# 中等效于: myimage.imageData[3*(y*myimage.width+x)+0] = 100;例如红色通道?
  • 取决于图像在位图形式中的样子 - 你什么也没说。
  • myimage 是一个具有 3 个通道的 IplImage。 myimage.ImageData 确实存在,但它返回一个 Intptr 并且不允许索引...
【解决方案2】:

好的,我解决了。这个:

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);  

元帅就是答案:)

【讨论】:

    猜你喜欢
    • 2020-12-14
    • 2010-09-18
    • 2020-08-23
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多