【问题标题】:Converting an image with n-bit bit depth to a 16-bit bit depth image with Intel IPP. (where 8 < n < 16)使用英特尔 IPP 将具有 n 位位深度的图像转换为 16 位位深度的图像。 (其中 8 < n < 16)
【发布时间】:2018-03-09 04:23:04
【问题描述】:

我需要对输入图像数据调用以下英特尔 IPP 方法。

  • ippiColorToGray
  • ippiLUTPalette
  • ippiScale(仅适用于 16 位图像)
  • ippiCopy
  • ippiSet
  • ippiAlphaComp

到目前为止,我一直在使用这种方法的 8 位和 16 位版本。但现在我们也允许输入 12 位图像。对于 ippiLUTPalette,我看到我们可以传递我们正在处理的 bitSize。但是对于其他 API,我们没有。

我想到的一种方法是将位深在 8 到 16 位之间的图像转换为 16 位图像,然后继续处理结果。我相信,ippiScale 执行这样的转换。但我找不到它适用于 8、16 和 32 以外的位深度。

有没有办法进行这种转换?

或者是否可以在位深不是 8 位和 16 位的图像上调用前面提到的 API?

【问题讨论】:

  • 您的 10 位或 12 位图像可能使用每个样本 16 位存储。如果是这样,您可以将其视为 16 位图像,只是其中的最大值是 1024 或 4092 而不是 65k。
  • @CrisLuengo 谢谢

标签: performance image-processing intel intel-ipp


【解决方案1】:

数据类型基于处理器架构。通常它们是word length 的分数或倍数。

因此,现代 CPU 和现代编程语言中没有 12 位数据类型。你有 64、32、16、8 的可寻址内存。

但是没有人阻止您将较少数量的位放入寄存器。

所以如果你想存储 12 位,你通常将它们存储在 16 位类型的低 12 位中。

这就是为什么图像处理算法通常支持8、16、...位的原因。您可以使用任何 16 位算法来处理 12 位强度信息,就像在 16 位上一样。

在某些情况下,您可以将 12 位信息缩放到 16 位。但在大多数情况下,这是不必要的。

将 12 位缩放到 16 位是简单的数学运算。 12bit_value / (2^12-1) = 16bit_value / (2^16-1)。 当然你也可以将你的 12bit 值引用到图像中的最大值而不是2^12。那么您将始终使用完整的 16 位。

【讨论】:

  • 感谢您的回答。不过只有一个问题,如果我们最终使用 12 位和 16 位相同数量的内存,那么使用 12 位图像有什么优势?
  • @sajas 没有优势。这只是一个量化的问题。大多数相机只有一个 8、10 或 12 位 ADC。因此,对于 12 位分辨率,任何强度值都将在 [0,4095] 区间内。他们没有理由将其扩展到 16 位。
  • 是否有任何未压缩的存储格式将 10 位或 12 位组件打包成组?例如6 * 12 位 = 72 位 = 每 2 个像素 9 个字节(对于 yuv444 或 rgb,无二次采样)。我检查了 FFmpeg 源代码,但内部的高深度格式似乎都为每个组件填充了整数字节。 (github.com/FFmpeg/FFmpeg/blob/…)
  • @PeterCordes:我不是压缩方面的专家,但我想如果没有打包位,利用图像中的冗余可能会更容易。例如。 MPEG 对像素块的移位进行编码,如果这些像素被打包,这可能很难做到。图像压缩的目标是输出尽可能多的信息内容的比特流。因此,输出流将以某种方式打包(例如霍夫曼编码),但输出流不再是每个像素的固定位数。
  • @CrisLuengo;我问的是 uncompressed 格式,即就​​像您可能在视频 RAM 中以高深度视频模式或 OpenGL 纹理找到的那样,专用硬件将在其中处理它。借助硬件支持,从位域中为一组连续像素解包组件不是问题。
猜你喜欢
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2014-08-18
  • 1970-01-01
  • 2015-08-11
相关资源
最近更新 更多