Chris
Chris

Reputation: 10061

imread in pylab vs opencv: returning completely different array values

I'm getting behavior I don't quite understand:

In [1]: import cv2

In [2]: pylab_img=pylab.imread('lena.jpg')

In [3]: cv_img=cv2.imread('lena.jpg')

In [4]: pylab_img[200,200,:]
Out[4]: array([228, 197, 176], dtype=uint8)

In [5]: cv_img[200,200,:]
Out[5]: array([ 84,  48, 132], dtype=uint8)

Both versions of imread read the same image into a numpy array of the same datatype, yet the values don't match. If the values were just mixed up I could chalk it up to the fact that opencv uses BGR whereas matplotlib (pylab) uses RGB, but that doesn't seem to account for this discrepancy.

Any thoughts?

Upvotes: 11

Views: 4198

Answers (1)

Sajjan Singh
Sajjan Singh

Reputation: 2553

They don't match for a couple reasons:

  1. matplotlib reads the color values as RGB whereas OpenCV uses BGR
  2. The rows in matplotlib's array appear to list pixel rows from the bottom of the image to the top (don't ask me why), whereas OpenCV goes from top to bottom

Perhaps there is a nicer way of doing this, but if you wanted to match them, you would find:

pylab_img[::-1,:,::-1] == cv_img

Upvotes: 13

Related Questions