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
--- /usr/lib/python2.6/dist-packages/PIL/Image.py 2009-11-16 02:51:25.000000000 +1100 +++ Image.py 2010-10-08 15:21:34.289858657 +1100 @@ -213,7 +213,7 @@ "RGBX": ('|u1', 4), "RGBA": ('|u1', 4), "CMYK": ('|u1', 4), - "YCbCr": ('|u1', 4), + "YCbCr": ('|u1', 3), } def _conv_type_shape(im):
signature.asc
Description: This is a digitally signed message part
_______________________________________________ Image-SIG maillist - Image-SIG@python.org http://mail.python.org/mailman/listinfo/image-sig