отображение нескольких изображений в одном каталоге с помощью imshow python

#python #matplotlib #imshow

#python #matplotlib #imshow

Вопрос:

Я пытаюсь отобразить несколько изображений в одном каталоге.

 import os
import cv2
import numpy as np
import random
import math

import matplotlib
from matplotlib.pyplot import imshow
from matplotlib import pyplot as plt
import matplotlib.image as mpimg
%matplotlib inline

dir_path = 'img'
images = os.listdir(dir_path)
img_paths = [os.path.join(dir_path, i) for i in images]
img_paths.sort()
img_all = np.array([cv2.cvtColor(cv2.imread(p), cv2.COLOR_BGR2RGB) for p in img_paths])


def display_helper(images, cmap=None):
    fig, ax = plt.subplots(nrows=20, ncols=2, figsize=(15,6))
    for a in ax:
        a.imshow(img, interpolation='none')

display_helper(img_all)
  

Но я получаю эту ошибку

 AttributeError: 'numpy.ndarray' object has no attribute 'imshow'
  

Как я могу отобразить несколько изображений с помощью imshow?

Спасибо!

Комментарии:

1. вам нужен plt.imshow() или в длинной версии matplotlib.pyplot.imshow()

2. Я откатил редактирование, потому что это сделало проблему более неясной. Теперь, как у вас есть, есть две проблемы: (1) ax является 2D, поэтому для перебора всех осей используйте for a in ax.flat: (2), который вы забыли указать в своем цикле, как img относится к images .

Ответ №1:

Проблема здесь

 fig, ax = plt.subplots(nrows=20, ncols=2, figsize=(15,6))
  

это дает ax np.array форму (20,2) . Поэтому, когда вы это делаете for a in ax , a это np.array из 2 осей. Чтобы исправить это, измените следующую строку на:

 for a in ax.flatten():