我在将rgb照片转换为ycbcbr、修改y通道并转换回rgb时遇到了一些问题,通常它工作得很好,但对于某些边缘情况,它返回负值或大于255的值,因此当我将其转换回matplotlib的uint8时,它会显示亮点。在
RGB到YCbCr
def rgb2ycbcr(data):
res = np.empty(data.shape)
res[...,0] = (data[...,0] * 0.299 + data[...,1] * 0.587 + data[...,2] * 0.114)
res[...,1] = 128 + (data[...,0] * -0.169 + data[...,1] * -0.331 + data[...,2] * 0.5)
res[...,2] = 128 + (data[...,0] * 0.5 + data[...,1] * -0.419 + data[...,2] * -0.081)
return res
以及YCbCr到RGB:
^{pr2}$奇怪的是,当我不接触Y通道时,照片转换正常(我知道当我修改Y通道时,我会将值保持在范围内)
由于精度问题,您将得到负值和大于1的值,因此您必须舍入/转换为整数:
现在的一个主要问题是,您使用的常量舍入太多,与Recommendation ITU-T T.871不一致,因此根据4个小数舍入引用稍微调整代码:
^{pr2}$您仍然需要转换为整数,但应该在一个更好的地方。 我注意到您正在修改
data
在ycbcr2rgb
中的适当位置,您应该在输入定义时复制一个数组,否则您将有非常严重的意外。在我建议在不从Recommendation ITU-T T.871取整的情况下实现该版本。在
我们维护的Colour有一个非常solid and complete implementation of Y'CbCr,您可以使用它来验证您的计算:
我还建议使用BT.709权重,而不是ITU-T T.871/BT.601中的权重,前者更广泛。在
相关问题 更多 >
编程相关推荐