使用 pylab.imshow() 显示图像

Posted

技术标签:

【中文标题】使用 pylab.imshow() 显示图像【英文标题】:Showing an image with pylab.imshow() 【发布时间】:2013-02-07 02:50:37 【问题描述】:

我对这一切都比较陌生,我开始学习图像分析教程here。当尝试执行pylab.imshow(dna) 步骤时,它返回以下错误:

In [10]: pylab.imshow(dna)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-10-fc86cadb4e46> in <module>()
----> 1 pylab.imshow(dna)

 /usr/lib/pymodules/python2.7/matplotlib/pyplot.pyc in imshow(X, cmap, norm, aspect,    interpolation, alpha, vmin, vmax, origin, extent, shape, filternorm, filterrad, imlim, resample, url, hold, **kwargs)
   2375         ax.hold(hold)
   2376     try:
-> 2377         ret = ax.imshow(X, cmap, norm, aspect, interpolation, alpha, vmin, vmax, origin, extent, shape, filternorm, filterrad, imlim, resample, url, **kwargs)
   2378         draw_if_interactive()
   2379     finally:

/usr/lib/pymodules/python2.7/matplotlib/axes.pyc in imshow(self, X, cmap, norm, aspect, interpolation, alpha, vmin, vmax, origin, extent, shape, filternorm, filterrad, imlim, resample, url, **kwargs)
   6794                        filterrad=filterrad, resample=resample, **kwargs)
   6795 
-> 6796         im.set_data(X)
   6797         im.set_alpha(alpha)
   6798         self._set_artist_props(im)

/usr/lib/pymodules/python2.7/matplotlib/image.pyc in set_data(self, A)
    409         if (self._A.ndim not in (2, 3) or
    410             (self._A.ndim == 3 and self._A.shape[-1] not in (3, 4))):
--> 411             raise TypeError("Invalid dimensions for image data")
    412 
    413         self._imcache =None

TypeError: Invalid dimensions for image data

可以肯定的是,我已经完全按照教程中的所有说明进行操作,但我无法确定是出了什么问题。

【问题讨论】:

什么是dna? (type(dna)dna.shape 给出了什么?)它正在提升 TypeError,因为它不是 imshow 知道如何处理的类型或形状。 这正是图像保存为dna = mahotas.imread('dna.jpeg') type(dna) 给出 numpy.ndarray 和 dna.shape 给出 (1024, 1344, 1) 的内容 【参考方案1】:

这正是图像保存为 dna = mahotas.imread('dna.jpeg') type(dna) 给出 numpy.ndarray 和 dna.shape 给出 (1024, 1344, 1)

这就是问题所在,如果您传递一个 3D ndarray,它预计您将有 3 或 4 个平面(RGB 或 RGBA)(阅读堆栈跟踪最后一帧中第 410 行的代码)。

您只需要使用删除额外的维度

dna = dna.squeeze()

imshow(dna.squeeze())

要查看squeeze 在做什么,请参见以下示例:

a = np.arange(25).reshape(5, 5, 1)
print a.shape # (5, 5, 1)
b = a.squeeze()
print b.shape # (5, 5)

【讨论】:

【参考方案2】:

从v3.3 开始,此错误不再出现,因为大小为 MxNx1 的 3d 数组现在被强制转换为 MxN 进行显示。

【讨论】:

【参考方案3】:
import matplotlib.pyplot as plt

plt.imshow(img.reshape(48, 48)) # for example: 48

【讨论】:

感谢您提供答案。您能否编辑您的答案以包括对您的代码的解释?这将有助于未来的读者更好地理解正在发生的事情,尤其是那些不熟悉该语言并努力理解这些概念的社区成员。当社区已经验证了已接受的答案时,这一点尤其重要。在什么条件下你的方法可能更受欢迎?您是否在利用新功能?

以上是关于使用 pylab.imshow() 显示图像的主要内容,如果未能解决你的问题,请参考以下文章

同时使用css显示图像裁剪图像的顶部和底部

在VueJS中使用'require'显示图像时如何保存图像链接?

使用OpenGL显示图像?

使用媒体查询未显示图像

使用 LayerDrawable 相互堆叠的图像数组。(在单个图像视图中显示多个图像)

简单的UICollectionView显示图像表现奇怪:某些图像显示正确,有些图像位置错误,有些图像丢失