Change a few pixels color

Hi,

Imagine you have this code:

import numpy as np
import matplotlib.cm as cm
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

delta = 0.25
x = y = np.arange(-3.0, 3.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
Z = Z2-Z1 # difference of Gaussians

plt.imshow(Z, interpolation='nearest', cmap=cm.gray, origin='lower', extent=[-3,3,-3,3])

Then you want to change the color of a few pixels to red.
You have a list of coordinates (i,j) and each pixel in this list should now be red.

I could play with masked arrays like in:
http://matplotlib.sourceforge.net/examples/pylab_examples/image_masked.html
but I would prefer a simple "display this pixel (i,j) in red whatever his value is" function.

Xavier

Hi Xavier,

Xavier Gnata, on 2011-04-23 02:33, wrote:

Imagine you have this code:

import numpy as np
import matplotlib.cm as cm
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

delta = 0.25
x = y = np.arange(-3.0, 3.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
Z = Z2-Z1 # difference of Gaussians

plt.imshow(Z, interpolation='nearest', cmap=cm.gray, origin='lower', extent=[-3,3,-3,3])

Then you want to change the color of a few pixels to red.
You have a list of coordinates (i,j) and each pixel in this list should
now be red.

I could play with masked arrays like in:
http://matplotlib.sourceforge.net/examples/pylab_examples/image_masked.html
but I would prefer a simple "display this pixel (i,j) in red whatever
his value is" function.

Since you're using a gray color map for that image, you won't be
able to set a particular pixel to red. You'll have to either
overlay a new image that would be masked out everywhere except
for the pixels you want to change, as you mentioned, or create
new image patches at the corresponding positions like this:

  idx2im = lambda i,j: (x[i],x[j+1],y[i],y[j+1] )
  plt.imshow([[.9]], extent=idx2im(12,12), cmap =cm.jet, origin='lower',vmin=0,vmax=1)

or something like this:

  plt.Rectangle((x[10],y[10]),width=delta,height=delta,color='red')
  ax = plt.gca()
  ax.add_artist(r)
  plt.draw()

best,

···

--
Paul Ivanov
314 address only used for lists, off-list direct email at:
http://pirsquared.org | GPG/PGP key id: 0x0F3E28F7

Thanks. The code using "Rectangle" works very well.
Using masks is more efficient but overshoot if I want to change only a few pixels.

Xavier

···

On 04/23/2011 03:19 AM, Paul Ivanov wrote:

Hi Xavier,

Xavier Gnata, on 2011-04-23 02:33, wrote:

Imagine you have this code:

import numpy as np
import matplotlib.cm as cm
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

delta = 0.25
x = y = np.arange(-3.0, 3.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
Z = Z2-Z1 # difference of Gaussians

plt.imshow(Z, interpolation='nearest', cmap=cm.gray, origin='lower', extent=[-3,3,-3,3])
Then you want to change the color of a few pixels to red.
You have a list of coordinates (i,j) and each pixel in this list should
now be red.

I could play with masked arrays like in:
http://matplotlib.sourceforge.net/examples/pylab_examples/image_masked.html
but I would prefer a simple "display this pixel (i,j) in red whatever
his value is" function.

Since you're using a gray color map for that image, you won't be
able to set a particular pixel to red. You'll have to either
overlay a new image that would be masked out everywhere except
for the pixels you want to change, as you mentioned, or create
new image patches at the corresponding positions like this:

   idx2im = lambda i,j: (x[i],x[j+1],y[i],y[j+1] )
   plt.imshow([[.9]], extent=idx2im(12,12), cmap =cm.jet, origin='lower',vmin=0,vmax=1)

or something like this:

   plt.Rectangle((x[10],y[10]),width=delta,height=delta,color='red')
   ax = plt.gca()
   ax.add_artist(r)
   plt.draw()

best,