Invert colors when plotting a PNG file using matplotlib

I'm trying to display a PNG file using matplotlib and of course, python. For this test, I've generated the following image: Original File

Now, I load and transform the image into a multidimensional numpy matrix:

import numpy as np
import cv2
from matplotlib import pyplot as plt

cube = cv2.imread('Graphics/Display.png')
plt.imshow(cube)
plt.ion()

When I try to plot that image in matplotlib, the colors are inverted:Plot

If the matrix does not have any modifications, why the colors in the plot are wrong?

Thanks in advance.

Upvotes: 9

Views: 21045

Answers (4)

Pablo Gonzalez
Pablo Gonzalez

Reputation: 693

Color image loaded by OpenCV is in BGR mode. However, Matplotlib displays in RGB mode. So we need to convert the image from BGR to RGB:

plt.imshow(cv2.cvtColor(cube, cv2.COLOR_BGR2RGB))

Upvotes: 1

Martin Thoma
Martin Thoma

Reputation: 136865

As others have pointed out, the problem is that numpy arrays are in BGR format, but matplotlib expects the arrays to be ordered in a different way.

You are looking for scipy.misc.toimage:

import scipy.misc
rgb = scipy.misc.toimage(cube)

Alternatively, you can use scipy.misc.imshow().

Upvotes: 1

Alex Rothberg
Alex Rothberg

Reputation: 10993

Try:

plt.imshow(cv2.cvtColor(cube, cv2.COLOR_BGR2RGB))

Upvotes: 18

bogatron
bogatron

Reputation: 19159

It appears that you may somehow have RGB switched with BGR. Notice that your greens are retained but all the blues turned to red. If cube has shape (M,N,3), try swapping cube[:,:,0] with cube[:,:,2]. You can do that with numpy like so:

rgb = numpy.fliplr(cube.reshape(-1,3)).reshape(cube.shape)

From the OpenCV documentation:

Note: In the case of color images, the decoded images will have the channels stored in B G R order.

Upvotes: 23

Related Questions