首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >颜色空间将YCbCr映射到RGB

颜色空间将YCbCr映射到RGB
EN

Stack Overflow用户
提问于 2016-01-21 07:59:57
回答 1查看 15.2K关注 0票数 6

我正在尝试使用python进行JPEG压缩。我加载了一个tiff图像,并将其存储为numpy uint8 RGB数组。我这样做是为了颜色映射。

代码语言:javascript
复制
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的转换,然后是一个逆转换。

代码语言:javascript
复制
img = rgb2ycbcr(img)
imshow(img)
img = ycbcr2rgb(img)
imshow(img)

经过颜色空间转换后,我得到了这两个输出图像作为YCbCr和RGB输出。

似乎我的颜色转换出了问题,我找不出哪里出了问题。我使用的是Wikipedia提供的JPEG色空间转换。谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-21 09:45:54

你必须用浮点数做中间计算。色调效果应该会让你大吃一惊;你有很多“热”(饱和)像素。

代码语言:javascript
复制
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)
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34913005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档