using PIL for PCA analysis

Paul McGuire ptmcg at austin.rr.com
Thu Feb 21 09:57:17 EST 2008


On Feb 21, 1:41 am, "dev... at gmail.com" <dev... at gmail.com> wrote:
> hi guys
> i am trying out  PCA analysis using python.I have a set of
> jpeg(rgbcolor) images whose pixel data i need to extract and make a
> matrix .( rows =num of images and cols=num of pixels)
> For this i need to represent an image as an array.
> i was able to do this using java's BufferedImage as below
>
> <javacode>
> int[] rgbdata = new int[width * height];
> image.getRGB(0,0,width,height,rgbdata,0,width);
>
> doubles = new double[rgbdata.length];
> int i;
> for ( i = 0; i < bytes.length; i++) {
>    doubles[i]  = (double)(rgbdata[i]);}
>
> </javacode>
>
> this doubles[] now represent a single image's pixels
>
> then i can get a matrix of say 4 images ..(each of 4X3 size)
> <sampledata>
> images[][]  rows=4,cols=12
> [
> [-4413029.0, -1.0463919E7,... -5201255.0]
>
> [-5399916.0, -9411231.0, ... -6583163.0]
>
> [-3886937.0, -1.0202292E7,... -6648444.0]
>
> [-5597295.0, -7901339.0,... -5989995.0]
> ]
> </sampledata>
> i can normalise the above matrix to zeromean and then find covariance
> matrix by
> images * transpose(images)
>
> my problem is how i can use PIL to do the same thing..if i extract
> imagedata using im.getdata()
> i will get
> <sampledata>
> [
> [(188, 169, 155), (96, 85, 81),.. (176, 162, 153)]
>
> [(173, 154, 148), (112, 101, 97),.. (155, 140, 133)]
>
> [(196, 176, 167), (100, 83, 76), ... (154, 141, 132)]
>
> [(170, 151, 145), (135, 111, 101), ... (164, 153, 149)]
> ]
> </sampledata>
> i donot know how to find covariance matrix from such a matrix..it
> would'v been ideal if they were single values instead of tuples..i
> can't use greyscale images since the unput images are all rgb jpeg
>
> can someone suggest a solution?
> thanks
> dn

I'm surprised PIL doesn't have a grayscale conversion, but here is one
that can manipulate your RGB values:

sampledata = [
[(188, 169, 155), (96, 85, 81), (176, 162, 153)],
[(173, 154, 148), (112, 101, 97), (155, 140, 133)],
[(196, 176, 167), (100, 83, 76), (154, 141, 132)],
[(170, 151, 145), (135, 111, 101), (164, 153, 149)],
]

# following approx from http://www.dfanning.com/ip_tips/color2gray.html
grayscale = lambda (R,G,B) : int(0.3*R + 0.59*G + 0.11*B)
print [ [ grayscale(rgb) for rgb in row ] for row in sampledata ]

prints (reformatted to match your sampledata):

[
[173, 87, 165],
[159, 103, 143],
[181, 87, 143],
[156, 117, 155]
]



More information about the Python-list mailing list