Python映像:YCbCr问题

dav*_*ver 5 python python-imaging-library

我正在使用PIL在Python中进行一些图像处理,我需要从一系列图像中提取亮度层,并使用numpy对它进行一些处理,然后将编辑后的亮度层放回图像中并保存。问题是,我似乎无法获得YCbCr格式的图像的任何有意义的表示,或者至少我不了解PIL在YCbCr中给了我什么。PIL文档声称YCbCr格式提供了三个通道,但是当我使用np.asarray从图像中获取数据时,我获得了4个通道。好的,所以我认为其中一个必须为alpha。

这是我用来测试此过程的一些代码:

import Image as im
import numpy as np    
pengIm = im.open("Data\\Test\\Penguins.bmp")
yIm = pengIm.convert("YCbCr")
testIm = np.asarray(yIm)

grey = testIm[:,:,0]
grey = grey.astype('uint8')
greyIm = im.fromarray(grey, "L")
greyIm.save("Data\\Test\\grey.bmp")
Run Code Online (Sandbox Code Playgroud)

我期望图像的灰度版本,但是我得到的是这个混乱的混乱:

http://i.imgur.com/zlhIh.png

有人可以向我解释我要去哪里哪里吗?matlab中的相同代码完全符合我的预期。

msw*_*msw 5

由于YCbCr是从RGB颜色空间进行的简单的,数学上确定的转换,因此经过YCbCr的中间阶段只是从图像中提取计算的(不是绝对的)亮度值的间接方法。您可以使用以下方法直接完成此操作:

yIm = pengIm.convert('L')
Run Code Online (Sandbox Code Playgroud)

我怀疑通过numpy asarray或fromarray或您的numpy代码中的转换存在问题,因为该序列为:

>>> import Image
>>> import ImageOps
>>> import ImageChops
>>> c = Image.open('squished_levels.png')
>>> c
<PngImagePlugin.PngImageFile image mode=RGB size=320x240 at 0xB7686DAC>
>>> c.getbands()
('R', 'G', 'B')
>>> d = c.convert('L')
>>> d.getextrema()       # squished_levels.png has squished levels for testing
(77, 182)
>>> d.getbands()
('L',)
>>> e = ImageOps.equalize(d)
>>> e.getextrema()
(0, 255)
>>> f = e.convert('RGB')
>>> g = ImageChops.lighter(c, f)
>>> g.show()             # not  squished in luminance
Run Code Online (Sandbox Code Playgroud)

所有工作均按预期进行。偶然,

>>> h = c.convert('YCbCr')
>>> h
<Image.Image image mode=YCbCr size=320x240 at 0xB761378C>
>>> h.getpixel((0,0))
(119, 127, 128)
>>> h.getbands()
('Y', 'Cb', 'Cr')
Run Code Online (Sandbox Code Playgroud)

给我三个渠道,而不是四个。