ios – 如何修复此YCrCb – > RBG转换公式?

ios – 如何修复此YCrCb – > RBG转换公式?,第1张

概述我使用 this question的公式: 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 * 我使用 this question的公式:

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转换公式?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1069611.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存