我使用的公式来自 this question :
uint8_t *rgbBuffer = malloc(imageWidth * imageHeight * 3);
// .. iterate over height and width
// from ITU-R BT.601, rounded to integers
rgbOutput[0] = (298 * (y - 16) + 409 * cr - 223) >> 8;
rgbOutput[1] = (298 * (y - 16) + 100 * cb + 208 * cr + 136) >> 8;
rgbOutput[2] = (298 * (y - 16) + 516 * cb - 277) >> 8;
我假设是基于 ITU-R_BT.601 formula in the wiki article .
但是我认为公式不太正确,因为输出图像看起来像这样:
如何修改公式?
最佳答案
假设第一次计算的最大值(y == 255
和 cr == 255
):
rgbOutput[0] = (298 * (255 - 16) + 409 * 255 - 223) >> 8;
rgbOutput[0] = (298 * 239 + 104295 - 223) >> 8;
rgbOutput[0] = (71222 + 104295 - 223) >> 8;
rgbOutput[0] = 175294 >> 8; // 175294 == 0x2ACBE
rgbOutput[0] = 684; // 684 == 0x2AC
rgbOutput[0]
可以容纳的最大值是 255
。您试图将 684
分配给它,导致截断。分配给它的实际值是172
(0xAC
)。
编辑 1
根据您发布的公式,您的第一次计算应如下所示:
rgbOutput[0] = ((298 * y) >> 8) + ((409 * cr) >> 8) - 223;
这会导致 480
的值(假设 y
和 cr
的最大值),这也会导致截断。
编辑 2
据说建议使用以下等式:
改用它,您的第一个计算应该是这样的:
rgbOutput[0] = ((255 * (y - 16)) / 219) + ((179 * (cr - 128)) / 112;
这导致 480
的值(假设 y
和 cr
的最大值)(编辑 1 中的相同答案),这也会导致截断。
编辑 3
请参阅@Robert 的回答以获得完整的解决方案。
编辑 4
当 y == 0
和 cr == 0
时,写入 y
的值也将导致截断,除非钳位是执行。
关于ios - 如何修复此 YCrCb -> RBG 转换公式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25210852/