当我在python中使用matplotlib的imshow()
来表示一个小矩阵时,如果在像素之间平滑,它会产生一些排序。在使用imshow
或imagesc
?
例如,使用matplotlib,这是单位矩阵imshow(eye(3))
的输出:
在matlab中,imagesc(eye(3))
:
我能想到的解决方案是使用某些滤镜进行外推和平滑处理,但这不符合单个像素级别。我还试过了myaa和export_fig,但他们并不满意。 Myaa在应用后可以使用所有的GUI,所以我无法放大或缩小,而export_fig让我将图形保存到文件然后对该文件进行操作,太麻烦了。那么,有没有办法告诉matlab的数字引擎(java或什么不是)做这个平滑,同时保持图形GUI的良好可用性?
答案 0 :(得分:36)
这是由于默认插值设置为'bilinear'。我认为'none'将是一个更直观的默认值。您可以使用:
更改默认插值方法(例如插值=无)mpl.rcParams['image.interpolation'] = 'none'
有关自定义Matplotlib的更多信息,请参阅website
下面的代码将概述所有插值方法:
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)