17

When I use matplotlib's imshow() in python to represent a small matrix, it produces a some sort if smoothing between pixels. Is there any way to have this in Matlab when using imshow or imagesc?

For example, using matplotlib this is the output of the identity matrix imshow(eye(3)): enter image description here

while in matlab, imagesc(eye(3)):

enter image description here

A solution I can think of is to extrapolate and smooth using some filter, but that won't be relevant for the single pixel levels. I've also tried myaa and export_fig, but they are not satisfactory. Myaa is taking all GUI usabily after being applied, so I can't zoom in or out, and export_fig makes me save the figure to a file and then operate on that file, too cumbersome. So, is there a way to tell the figure engine of matlab (java or what not) to do this smoothing while keeping the nice usability of the figure GUI?

1 Answers1

46

It is due to the default interpolation which is set to 'bilinear'. I think 'none' would be a more intuitive default. You can change the default interpolation method (eg interpolation=None) with:

mpl.rcParams['image.interpolation'] = 'none'

More information about customising Matplotlib can be found on the website

The code below will give you an overview of all interpolation methods:

methods = [None, 'none', 'nearest', 'bilinear', 'bicubic', 'spline16', 'spline36', 'hanning', 'hamming', \
           'hermite', 'kaiser', 'quadric', 'catrom', 'gaussian', 'bessel', 'mitchell', 'sinc', 'lanczos']

grid = np.random.rand(4,4)

fig, ax = plt.subplots(3,6,figsize=(12,6), subplot_kw={'xticks': [], 'yticks': []})
fig.subplots_adjust(hspace=0.3, wspace=0.05)

ax = ax.ravel()

for n, interp in enumerate(methods):
    ax[n].imshow(grid, interpolation=interp)
    ax[n].set_title(interp)

enter image description here

Rutger Kassies
  • 61,630
  • 17
  • 112
  • 97
  • otherwise this is a very nice answer. – tacaswell Feb 06 '13 at 14:39
  • Your right, i have refined my initial answer, thanks for pointing that out. The default rcParam could still be set to 'none' though. I think most graphics sotware assume (including Matlab apparently) nearest neighbor as the default, making Lama's surprise understandable. – Rutger Kassies Feb 06 '13 at 15:44
  • 1
    excuse me, but I isn't @Lama asking about how to do the smoothing in Matlab instead of asking how to remove it from matplotlib? – Francesco Montesano Feb 06 '13 at 16:30
  • 1
    I actually did... the answer is very nice and all (+1) but I did want to have the same interpolation effect in matlab (without the need to interpolate that 3x3 matrix for example) –  Feb 06 '13 at 19:52
  • 1
    @Lama, sorry for the confusion, i misunderstood. Interpolating an identity matrix sounds a bit strange to me but in general its a fair question of course. In Matlab there is an imresize functions which allows bilinear interpolation. Like: outgrid = imresize(ingrid,scalefactor,'bilinear'). But you would need to figure out the desired output size which Matplotlib does 'on-the-fly'. – Rutger Kassies Feb 07 '13 at 09:02
  • Would be willing to make PR adding this grid to the matplotlib gallery? I think this would be a nice addition. – tacaswell Nov 16 '13 at 04:33
  • @tcaswell, no problem. See: https://github.com/matplotlib/matplotlib/pull/2599 Im a bit of a github noob so hope i did it right. Otherwise feel free to just add my example yourself. – Rutger Kassies Nov 18 '13 at 08:18
  • Thanks :) That looks fine process wise. I suspect you will get some feed back from the other devs. – tacaswell Nov 18 '13 at 08:25