为什么在IPython-notebook上使用matplotlib的plt.imshow显示bmp图像颜色不正确?

6
下面是需要翻译的内容:

下面有一张bmp图片,如第一张图片所示,它的信息列在第二张图片中。但是当在IPython-notebook上使用matplotlib的plt.imshow()函数显示时,它的颜色不正确,就像第三张图片一样。那么我能知道原因吗?
谢谢!

enter image description here

enter image description here

enter image description here


原始文件已分享到Dropbox:https://dl.dropboxusercontent.com/u/26518813/test2.bmp

在IPython-notebook上显示图像的代码如下:

%pylab inline --no-import-all
from PIL import Image
plt.imshow(Image.open("./test/test2.bmp")) 

你能否包括原始的 .bmp 文件和所有代码?这样我们可以下载并尝试它... - G M
@GM,文件和代码已经粘贴在上面了。 - Honghe.Wu
1个回答

9

这是因为您实际上是使用matplotlib.pyplot将图像绘制为矩阵。Matplotlib不支持.bmp格式,因此我认为默认的颜色映射存在一些错误。在您的特定情况下,您有一张灰度图像。因此,您可以通过cmap =“gray”更改颜色映射为灰度。

from PIL import Image
img= Image.open(r'./test/test2.bmp')
plt.imshow(img,cmap='gray',vmin=0,vmax=255)

请注意,如果您想复制原始图像的相同亮度,则需要设置vmin和vmax,否则我认为Python默认会将值拉伸到最小值和最大值。 这是一种不使用导入PIL的解决方案:
img=matplotlib.image.imread(r'/Users/giacomo/Downloads/test2.bmp')
plt.imshow(img,cmap='gray',vmin=0,vmax=255)

或者您可以使用PIL来显示图片,或者在之前将您的图片转换为.png

如果您想使用PIL.Image来显示图片,您可以使用以下代码:

from PIL import Image
img= Image.open( r'./test/test2.bmp')
img.show()

注意,如果您正在使用I-Python Notebook,则图像将显示在新的外部窗口中

另一个选项是将图像的模式更改为'P'(调色板编码:每个像素一个字节,带有ImagePalette类的调色板将像素转换为颜色)。使用.convert然后用matplotlib plt.imshow绘制图像:

convertedimg=img.convert('P')
plt.imshow(convertedimg)

enter image description here


在我的IPython笔记本上,img.show()无法在浏览器上显示任何内容。 - Honghe.Wu
但是图像失真了。谢谢! - Honghe.Wu
@Honghe.Wu 这不是我的问题(请看图片),您使用的是哪种浏览器和操作系统?您是否尝试过在Python Shell中执行代码?发生了什么事情? - G M
Ubuntu服务器将IPython-notebook作为后端运行。谢谢。 - Honghe.Wu
@Honghe.Wu 我已经添加了我找到的最后一个解决方案,希望能对你有所帮助!谢谢!好问题,希望有人能添加一些信息。 - G M
为了参考,导入matplotlib后添加行%matplotlib inline也可以。使用.show()仍然很有用,因为它避免在实际图像之前打印类似于[<matplotlib.lines.Line2D at 0x10b49b450>]的内容。 - BrechtDeMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接