我有一些问题需要将RGB照片转换为YCbCr格式,修改亮度通道后再转换回RGB格式。通常情况下这个过程能够完美地完成,但是对于某些边缘情况,它会返回负值或大于255的值,因此当我将其转换回uint8格式以便在matplotlib中显示时,会出现明亮的斑点。
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
转换YUV到RGB:
def ycbcr2rgb(data):
res = np.empty(data.shape)
data[...,1] = data[...,1] - 128
data[...,2] = data[...,2] - 128
res[...,0] = data[...,0] * 1 + data[...,2] * 1.4
res[...,1] = data[...,0] * 1 + data[...,1] * -0.343 + data[...,2] * -0.711
res[...,2] = data[...,0] * 1 + data[...,1] * 1.765
return res
奇怪的是,当我不修改 Y 通道时,照片可以成功转换(我知道在修改 Y 通道时需要保持数值范围内)。