uint8_t *rgbBuffer = malloc(imageWIDth * imageHeight * 3);// .. iterate over height and wIDth// from ITU-R BT.601,rounded to integersrgbOutput[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 == 0x2ACBErgbOutput[0] = 684; // 684 == 0x2AC
rgbOutput [0]可以容纳的最大值是255.您正在尝试为其分配684,从而导致截断.分配给它的实际值是172(0xAC).
编辑1
根据您发布的公式,您的第一个计算应如下:
rgbOutput[0] = ((298 * y) >> 8) + ((409 * cr) >> 8) - 223;
这导致(假设y和cr的最大值)为480的值,这也导致截断.
编辑2
据说推荐以下等式:
使用它,您的第一次计算应该是这样的:
rgbOutput[0] = ((255 * (y - 16)) / 219) + ((179 * (cr - 128)) / 112;
这导致(假设y和cr的最大值)为480(编辑1中的相同答案)的值,这也导致截断.
编辑3
请参阅@Robert的答案以获取完整的解决方案.
编辑4
当y == 0且cr == 0时,写入y的值也将导致截断,除非执行钳位.
总结以上是内存溢出为你收集整理的ios – 如何修复此YCrCb – > RBG转换公式?全部内容,希望文章能够帮你解决ios – 如何修复此YCrCb – > RBG转换公式?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)