Matplotlib:缺少使用imread的频道

时间:2018-11-14 21:12:47

标签: python matplotlib png jpeg imread

当我尝试使用matplotlib加载具有三个通道的图像时,当我发出numpy shape命令时,它只有一个通道。这显示了以下图像:

One channel image with matplotlib

这是我使用的代码:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np

img = mpimg.imread('dolphin.png')
plt.imshow(img)
plt.show()

img.shape
(320, 500)

我还遵循了matplotlib image tutorial,它使用与上面相同的命令。

使用opencv加载图像,结果是具有三个通道的图像,符合预期。

import cv2
imgcv = cv2.imread('dolphin.png')
plt.imshow(imgcv)
plt.show()

imgcv.shape
(320, 500, 3)

Three channel image with cv2

我正在将Python 3.5.6与anaconda一起使用。

以下是conda list命令的简短输出:

...
matplotlib                3.0.0
...
opencv3                   3.1.0
...
pillow                    5.2.0
...

我使用的原始图像:

Original dolphin image

我是否缺少软件包,或者是否有另一个命令来加载* .png文件?一切似乎都适用于* .jpg图片

1 个答案:

答案 0 :(得分:1)

如我所见,matplotlib的imread可以正确读取图像。如果图像仅包含一个通道,则生成的numpy数组将为2D。如果图像包含3个或4个通道,则numpy数组将为3D。

从问题中获取海豚图像

plt.imread("https://i.stack.imgur.com/cInHj.png").shape
> (320, 500)

关于matplotlib文档中的stinkbug映像,确实存在一个小问题。您看到的图像也是灰度图像,

plt.imread("https://matplotlib.org/_images/stinkbug.png").shape
> (375, 500)

但是,本教程声称它是3通道图像。从本教程的角度来看,这是正确的,因为它从github存储库文件夹中的doc获取图像。

plt.imread("https://raw.githubusercontent.com/matplotlib/matplotlib/master/doc/_static/stinkbug.png").shape
> (375, 500, 3)

问题在于该文档是通过sphinx和sphinx-gallery构建的,此外还可能使用其他一些库。在此过程中,图像不会以其原始格式复制到输出文件夹。已经here报告了此问题,原因尚未完全找到。

无论如何,剩下的悬而未决的问题是,为什么cv2.imread为您提供灰度图像的3D阵列?

来自OpenCV imread documentation

  

第二个参数是一个标志,用于指定应该读取图像的方式。

     
      
  • cv2.IMREAD_COLOR:加载彩色图像。图像的任何透明度都将被忽略。这是默认标志。
  •   
  • cv2.IMREAD_GRAYSCALE:以灰度模式加载图像
  •   
  • cv2.IMREAD_UNCHANGED:加载图像,包括alpha通道
  •   
     

请注意,您可以简单地分别传递整数1、0或-1,来代替这三个标志。

因此,您需要在此处指定自己想要使用的模式。

让我们验证一下:

import cv2
import urllib.request as req

dolphinurl ="https://i.stack.imgur.com/cInHj.png"
stinkbugweburl = "https://matplotlib.org/_images/stinkbug.png"
stinkbuggiturl = "https://raw.githubusercontent.com/matplotlib/matplotlib/master/doc/_static/stinkbug.png"

def printshape(url, **kw):
    req.urlretrieve(url, "image_name.png")
    im = cv2.imread("image_name.png", **kw)
    print(im.shape)

printshape(dolphinurl)
printshape(stinkbugweburl)
printshape(stinkbugweburl)

此打印

(320, 500, 3)
(375, 500, 3)
(375, 500, 3)

如果您指定灰度,

printshape(dolphinurl,0)
printshape(stinkbugweburl,0)
printshape(stinkbugweburl,0)

它将打印

(320, 500)
(375, 500)
(375, 500)

从这种意义上说,取决于用户来决定他们如何阅读图像。