blah_crusader
blah_crusader

Reputation: 434

Plotting RGB matrix in numpy & matplotlib

I'm trying to plot a numpy array with shape [height x width x 3] containing RGB values. As a simple example suppose you have the Belgian flag:

import numpy as np
import matplotlib.pyplot as plt

flag = np.empty((1,3,3))
flag[0,0,:] = (0,0,0)
flag[0,1,:] = (254,240,71)
flag[0,2,:] = (255,55,14)
plt.imshow(flag)
plt.show()

This results in the following output: enter image description here

Can anyone tell me why it is not plotting the right RGB values? Did I make a mistake in the dimensionality? Probably an easy answer to this, but can't seem to find it .. Thanks a lot for any advice!

Upvotes: 3

Views: 6350

Answers (2)

Joonho Park
Joonho Park

Reputation: 563

Try to use the float values between 0 ~ 1. So change the code like this,

flag[0,0,:] = (0,0,0)
flag[0,1,:] = (254/255,240/255,71/255)
flag[0,2,:] = (255/255,55/255,14/255)

Upvotes: 0

Warren Weckesser
Warren Weckesser

Reputation: 114791

The default data type for the array created by numpy.empty is floating point, and imshow treats floating point values differently than integer values. (imshow expects floating point values to be in the range 0.0 to 1.0.)

Change this

flag = np.empty((1,3,3))

to

flag = np.empty((1,3,3), dtype=np.uint8)

The reason you got those particular colors when flag is floating point is that imshow apparently converted your array to integer without checking that the input values were in the range 0.0 to 1.0. Here's what happens in that case:

In [25]: flag
Out[25]: 
array([[[   0.,    0.,    0.],
        [ 254.,  240.,   71.],
        [ 255.,   55.,   14.]]])

In [26]: img = (flag*255).astype(np.uint8)

In [27]: img
Out[27]: 
array([[[  0,   0,   0],
        [  2,  16, 185],
        [  1, 201, 242]]], dtype=uint8)

If you then run imshow(img), you get the black, blue and cyan plot.

Upvotes: 2

Related Questions