2016-01-20 99 views
1

我正在使用python试验JPEG压缩。我加载一个tiff图像并将其存储为numpy uint8 RGB数组。我是这样做的颜色映射。颜色空间映射YCbCr到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) 

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

看来,什么是错的我的色彩转换,我无法弄清楚什么是错的。我正在使用由 Wikipedia提供的JPEG色彩空间转换。感谢您的帮助。

回答

6

你必须做浮点中间计算。分页会让你失望;你有很多“热”(饱和)像素。

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 
    return np.uint8(rgb.dot(xform.T))