[Image-SIG] PIL Image array interface has the wrong size for YCbCr

Fredrik Lundh fredrik at pythonware.com
Tue Nov 9 02:01:46 CET 2010


Just committed a fix to trunk (including some simple tests for this
operation & mode...).

Thanks! /F

On Fri, Oct 8, 2010 at 6:51 AM, David Coles <coles.david at gmail.com> wrote:
> PIL's Image class has incorrect dimension specified for YCbCr images.
> This causes issues when converting to or from NumPy arrays.
>
> According to http://www.pythonware.com/library/pil/handbook/concepts.htm
> YCbCr should be "3x8-bit pixels, colour video format". Instead it
> appears to be converted to a 4x8-bit format.
>
> The incorrect definition is at line 206 of
> http://svn.effbot.python-hosting.com/pil/PIL/Image.py.
>
> Example: Load up any image and convert to YCbCr.
>
>>>> import numpy
>>>> import Image as im
>>>> image = im.open('bush640x360.png')
>>>> ycbcr = image.convert('YCbCr')
>
> Using the Array interface produces a HxWx4 array, which is the wrong
> dimensions for YCbCr. Thus when selecting a single channel it displays
> incorrectly:
>
>>>> A = numpy.asarray(ycbcr)
>>>> print A.shape
> (360, 640, 4)
>>>> im.fromarray(A[:,:,0], "L").show()
>
> Here's an example decoding the image byte string ourselves gives the
> correct result:
>
>>>> B = numpy.ndarray((image.size[1], image.size[0], 3), 'u1',
> ycbcr.tostring())
>>>> print B.shape
> (360, 640, 3)
>>>> im.fromarray(B[:,:,0], "L").show()
>
> Attached is a patch against the 1.1.7-2 (python-imaging) package in
> Ubuntu as I can't find the development repository for 1.1.7. See
> https://bugs.edge.launchpad.net/ubuntu/+source/python-imaging/+bug/656666 for details.
>
> Cheers,
> David
>
> _______________________________________________
> Image-SIG maillist  -  Image-SIG at python.org
> http://mail.python.org/mailman/listinfo/image-sig
>
>


More information about the Image-SIG mailing list