pythonimageimage-processingcomputer-vision

Converting image to black and white and use it as array


I'm trying to convert a colored image to a black and white one.

The original image is the following:

I have a few problems. First:

import pylab as pl
import Image

im = Image.open('joconde.png')

pl.imshow(im)
pl.axis('off')
pl.show()

I get this:

First result

Why is it rotated? That's not the point but I'd like to know why.

im_gray = im.convert('1')

pl.imshow(im_gray)
pl.show() 

And here is the processed black and white image:

Now everything looks working. But I need to use that image as a numpy array in order to do some image processing. All I have to do is this:

import numpy as np

im_arr = np.array(im_gray)

pl.imshow(im_arr)
pl.axis('off')
pl.show()

But I get this:

Why is this happening? I tried also:

im_arr = np.array(im_gray, dtype='float')

or:

im_arr = np.asarray(im_gray)

But nothing seems working. Maybe the problem is in the show method but I don't know.


Solution

  • Your image is rotated because of an origin problem.

    If you use this snippet, the image will not be rotated upside-down.

    pl.imshow(im, origin='lower')
    pl.show()
    

    You could also simply use im.show() to display the image.

    Now, back to the original question. I think the problem comes from the fact that pylab cannot handle bilevel images. You certainly want to use a greyscale image and thus do this

    import pylab as pl
    import matplotlib.cm as cm
    import numpy as np
    import Image
    
    im = Image.open('your/image/path')
    im_grey = im.convert('L') # convert the image to *greyscale*
    im_array = np.array(im_grey)
    pl.imshow(im_array, cmap=cm.Greys_r)
    pl.show()