颜色 Space 将 YCbCr 映射到 RGB
Color Space Mapping YCbCr to RGB
我正在尝试使用 python 进行 JPEG 压缩。我加载了一个 tiff 图像并将其存储为 numpy uint8 RGB 数组。我这样做是为了颜色映射。
def rgb2ycbcr(im):
cbcr = np.empty_like(im)
r = im[:,:,0]
g = im[:,:,1]
b = im[:,:,2]
# Y
cbcr[:,:,0] = .299 * r + .587 * g + .114 * b
# Cb
cbcr[:,:,1] = 128 - .169 * r - .331 * g + .5 * b
# Cr
cbcr[:,:,2] = 128 + .5 * r - .419 * g - .081 * b
return np.uint8(cbcr)
def ycbcr2rgb(im):
rgb = np.empty_like(im)
y = im[:,:,0]
cb = im[:,:,1] - 128
cr = im[:,:,2] - 128
# R
rgb[:,:,0] = y + 1.402 * cr
# G
rgb[:,:,1] = y - .34414 * cb - .71414 * cr
# B
rgb[:,:,2] = y + 1.772 * cb
return np.uint8(rgb)
我做了一个简单的 RGB 到 YCbCr 的转换,然后进行了逆变换。
img = rgb2ycbcr(img)
imshow(img)
img = ycbcr2rgb(img)
imshow(img)
经过颜色space变换后,我将这两个输出图像分别作为YCbCr和RGB输出。
看来我的颜色转换出了点问题,我也搞不清楚是什么地方出了问题。我正在使用由提供的 JPEG 颜色 space 转换
Wikipedia。谢谢你的帮助。
您必须使用浮点数进行中间计算。后代化应该给你提示;你有很多 "hot"(饱和)像素。
def rgb2ycbcr(im):
xform = np.array([[.299, .587, .114], [-.1687, -.3313, .5], [.5, -.4187, -.0813]])
ycbcr = im.dot(xform.T)
ycbcr[:,:,[1,2]] += 128
return np.uint8(ycbcr)
def ycbcr2rgb(im):
xform = np.array([[1, 0, 1.402], [1, -0.34414, -.71414], [1, 1.772, 0]])
rgb = im.astype(np.float)
rgb[:,:,[1,2]] -= 128
rgb = rgb.dot(xform.T)
np.putmask(rgb, rgb > 255, 255)
np.putmask(rgb, rgb < 0, 0)
return np.uint8(rgb)
我正在尝试使用 python 进行 JPEG 压缩。我加载了一个 tiff 图像并将其存储为 numpy uint8 RGB 数组。我这样做是为了颜色映射。
def rgb2ycbcr(im):
cbcr = np.empty_like(im)
r = im[:,:,0]
g = im[:,:,1]
b = im[:,:,2]
# Y
cbcr[:,:,0] = .299 * r + .587 * g + .114 * b
# Cb
cbcr[:,:,1] = 128 - .169 * r - .331 * g + .5 * b
# Cr
cbcr[:,:,2] = 128 + .5 * r - .419 * g - .081 * b
return np.uint8(cbcr)
def ycbcr2rgb(im):
rgb = np.empty_like(im)
y = im[:,:,0]
cb = im[:,:,1] - 128
cr = im[:,:,2] - 128
# R
rgb[:,:,0] = y + 1.402 * cr
# G
rgb[:,:,1] = y - .34414 * cb - .71414 * cr
# B
rgb[:,:,2] = y + 1.772 * cb
return np.uint8(rgb)
我做了一个简单的 RGB 到 YCbCr 的转换,然后进行了逆变换。
img = rgb2ycbcr(img)
imshow(img)
img = ycbcr2rgb(img)
imshow(img)
经过颜色space变换后,我将这两个输出图像分别作为YCbCr和RGB输出。
看来我的颜色转换出了点问题,我也搞不清楚是什么地方出了问题。我正在使用由提供的 JPEG 颜色 space 转换 Wikipedia。谢谢你的帮助。
您必须使用浮点数进行中间计算。后代化应该给你提示;你有很多 "hot"(饱和)像素。
def rgb2ycbcr(im):
xform = np.array([[.299, .587, .114], [-.1687, -.3313, .5], [.5, -.4187, -.0813]])
ycbcr = im.dot(xform.T)
ycbcr[:,:,[1,2]] += 128
return np.uint8(ycbcr)
def ycbcr2rgb(im):
xform = np.array([[1, 0, 1.402], [1, -0.34414, -.71414], [1, 1.772, 0]])
rgb = im.astype(np.float)
rgb[:,:,[1,2]] -= 128
rgb = rgb.dot(xform.T)
np.putmask(rgb, rgb > 255, 255)
np.putmask(rgb, rgb < 0, 0)
return np.uint8(rgb)