当我尝试使用matplotlib加载具有三个通道的图像时,当我发出numpy shape
命令时,它只有一个通道。这显示了以下图像:
这是我使用的代码:
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)
我正在将Python 3.5.6与anaconda一起使用。
以下是conda list
命令的简短输出:
...
matplotlib 3.0.0
...
opencv3 3.1.0
...
pillow 5.2.0
...
我使用的原始图像:
我是否缺少软件包,或者是否有另一个命令来加载* .png文件?一切似乎都适用于* .jpg图片
答案 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)
从这种意义上说,取决于用户来决定他们如何阅读图像。