1

我的相机给了我 14 位灰度图像,但 API 的函数返回一个 long* 到图像数据。(所以我假设每个像素有 4 个字节)

我的应用程序是用 C++/CLI 编写的,pictureBox 是 .NET 类型的。
我目前正在使用该BitmapData.LockBits()机制来获得对图像数据的指针访问,并使用
memcpy(bmpData.Scan0.ToPointer(), imageData, sizeof(long)*height*width)
将图像数据复制到位图。
目前,唯一有效的 PixelFormat 是 32 位 RGB,并且图像显示为带有轮廓的蓝色阴影。

尝试将位图初始化为 16bppGrayscale 不起作用。
理想情况下,我希望将数组从 long 转换为 word 并使用 16 位格式(希望 14 位数据能够正确显示),但我不确定这是否有效。此外,我不想迭代图像数据,因此找到最小/最大值然后直方图拉伸到 [0..255] 对我来说不是一个选项(显示必须尽可能高效)

谢谢

4

1 回答 1

1

是的,它看起来很蓝,高强度像素的一些绿色阴影。你有一个像素格式不匹配,32bppRgb 有一个蓝色字节,一个绿色字节,一个红色字节和一个未使用字节。直接复制灰度图会设置蓝色字节,最多6位绿色。

16bppGrayScale 会很棒,如果只有 GDI+ 实际支持它。问题是没有主流视频适配器处理这种格式。您需要将像素值转换为 RGB 三元组。为了让它看起来是灰色的,你需要将蓝色、绿色和红色字节设置为相同的值。这将是一个有损转换,因为您需要将 14 位压缩为 8 位。这并不重要,人眼还不足以区分 16,384 个不同的灰度级。假设相机为高亮度像素生成 16383 的像素值,只需将像素值右移 6 即可。24bppRgb 或 32bppRgb 像素格式都可以,后者会更快,因为它适合 int 并且您不必大步向前。

请注意,伪彩色图像也是可能的。您可以任意将 14 位灰度值映射到颜色。最快的方法是使用 int[16384] 映射表。您在表格中粘贴的内容完全取决于您,常见的映射是深红色表示低强度,紫色表示高强度值。

这对于图像显示来说已经足够了。但是,如果您进行任何图像处理,那么您可能希望利用相机的分辨率。您需要远离位图。查看像 LeadTools 这样的图形库供应商。

于 2010-05-17T12:45:52.563 回答