Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在matplotlib'中显示OpenCV图像;s子地块_Python_Opencv_Matplotlib - Fatal编程技术网

Python 在matplotlib'中显示OpenCV图像;s子地块

Python 在matplotlib'中显示OpenCV图像;s子地块,python,opencv,matplotlib,Python,Opencv,Matplotlib,我在matplotlib的子绘图中显示OpenCV图像时遇到问题 #Read random images from multiple directories import random animals = os.listdir('signs/train') sample_images = [] for a in animals: dirname = 'signs/train/' + a files = random.sample(os.listdir(dirname), 5) fil

我在matplotlib的子绘图中显示OpenCV图像时遇到问题

#Read random images from multiple directories
import random
animals = os.listdir('signs/train')
sample_images = []
for a in animals:
  dirname = 'signs/train/' + a
  files = random.sample(os.listdir(dirname), 5)
  files = [dirname + '/' + im for im in files]
  sample_images.extend(files)

del files, dirname,   animals
print(sample_images)

# Output: ['signs/train/rooster/00000327.jpg', 'signs/train/rooster/00000329.jpg', 'signs/train/rooster/00000168.jpg', ...,  'signs/train/rooster/00000235.jpg', 'signs/train/rooster/00000138.jpg']

#Read using OpenCV and show in matplotlib's subplots

fig, ax = plt.subplots(12, 5,figsize=(15,15), sharex=True)
for idx, si in enumerate(sample_images):
  i = idx % 5 # Get subplot row
  j = idx // 5 # Get subplot column
  image = cv2.imread(si)
  image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 
  image = cv2.resize(image, (64, 64))
  ax[i, j].plot(image)
plt.show()
我已经检查了是否使用opencv成功加载了每个图像并调整了其大小,但我不知道为什么在
matplotlib
子地块上绘制图像时会出现以下错误


ValueError回溯(最近一次调用)
在()
10#image=image.open(si)
11#打印(类型(图像))
--->12轴[i,j]。绘图(图像)
13 plt.show()
3帧
/usr/local/lib/python3.6/dist-packages/matplotlib/axes//u base.py in\u xy\u from\u xy(self,x,y)
271如果x.ndim>2或y.ndim>2:
272提升值错误(“x和y不能大于2-D,但有”
-->273“形状{}和{}”。格式(x.shape,y.shape))
274
275如果x.ndim==1:
ValueError:x和y不能大于二维,但具有形状(64,)和(64,64,3)
编辑 我忘了提到我已经试过在一张图像上测试过了,它可以工作(即使它是JPG格式并且仍然使用RGB通道)

我做错了什么

关于matplotlib子图中讨论的图像,似乎只支持PNG文件类型

另请参见同一页中的链接


我认为错误是因为子绘图只接受二维图像,而且由于JPG有三个颜色通道,matplotlib不确定要映射到x&y维度的信息。

您使用的
ax.plot()
不正确,因为它只打印y与x数据。正确的函数是
plt.imshow()
,它是matplotlib显示图像数据的内置函数。下面的示例很有效,可以根据您的需要进行扩展

import cv2 as cv
from matplotlib import pyplot as plt
image1 = cv.imread('image1.jpg')
image2 = cv.imread('image2.jpg')
plt.subplot(1, 2, 1)
plt.imshow(image1)
plt.subplot(1, 2, 2)
plt.imshow(image2)

plot
的意图应仅适用于二维数据(例如灰度图像),当您添加三维图像时,应使用
imshow
应用它。因此,您需要做的就是将
ax[i,j].plot(image)
替换为
ax[i,j].imshow(image)
,然后一切都会好起来。

关于细节,这并不是完全错误的。Ax应该使用“imshow”而不是“plot”,一切正常
import cv2 as cv
from matplotlib import pyplot as plt
image1 = cv.imread('image1.jpg')
image2 = cv.imread('image2.jpg')
plt.subplot(1, 2, 1)
plt.imshow(image1)
plt.subplot(1, 2, 2)
plt.imshow(image2)