为了处理 8 位像素,为了在不丢失信息的情况下进行 Gamma 校正,我们通常对值进行上采样,以 16 位或其他方式工作,然后将它们下采样到 8 位。
现在,这对我来说是一个新领域,所以请原谅不正确的术语等。
根据我的需要,我选择在“非标准”Q15 中工作,我只使用范围的上半部分 (0.0-1.0),而 0x8000 代表 1.0 而不是 -1.0。这使得在 C 中计算事物变得更加容易。
但是我遇到了 SSSE3 的问题。它具有将 Q15 数字相乘的 PMULHRSW 指令,但它使用 Q15 的“标准”范围是 [-1,1-2⁻¹⁵],因此将(我的)0x8000(1.0)乘以 0x4000(0.5)得到 0xC000(- 0.5),因为它认为 0x8000 是 -1。这很烦人。
我究竟做错了什么?我应该将像素值保持在 0000-7FFF 范围内吗?这不会违背它作为定点格式的目的吗?有没有解决的办法?也许有什么技巧?
是否有某种关于 Q15 的权威性论文讨论了所有这些?
最佳答案
就个人而言,我会采用将最大值限制为 0x7FFF (~0.99something) 的解决方案。
-1.0
运行至 +1.0-one lsb
.否则,算术不会很好地进行,因为 1 lsb 的值在 0 的每一侧都不同! 除非你能想象自己成功地向一群有争议的代码审查员争论,那额外的一点对算法的运行至关重要,而不仅仅是“最后 0.01% 的性能”,坚持每个人都能理解的代码,以及哪些映射到您可用的硬件。
或者,重新安排您之前的操作,使所有像素都成为您最初拥有的负数。或者下面的操作来接受你之前发送的内容的否定。然后使用来自
-1.0
的值至 0.0
以 Q15 格式。
关于image-processing - 有没有办法强制 PMULHRSW 将 0x8000 视为 1.0 而不是 -1.0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12181740/