Показывать изображение OpenCV на вспомогательных участках matplotlib - PullRequest
0 голосов
/ 12 января 2020

У меня проблемы с отображением изображений OpenCV в подспоте matplotlib

#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 * subplot.


ValueError                                Traceback (most recent call last)

<ipython-input-56-38cc921c1724> in <module>()
     10   #image = Image.open(si)
     11   #print(type(image))
---> 12   ax[i, j].plot(image)
     13 plt.show()

3 frames

/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_base.py in _xy_from_xy(self, x, y)
    271         if x.ndim > 2 or y.ndim > 2:
    272             raise ValueError("x and y can be no greater than 2-D, but have "
--> 273                              "shapes {} and {}".format(x.shape, y.shape))
    274 
    275         if x.ndim == 1:

ValueError: x and y can be no greater than 2-D, but have shapes (64,) and (64, 64, 3)

РЕДАКТИРОВАТЬ Я забыл упомянуть, что я пытался тестировать на одном изображении, и это работает ( даже если это формат JPG и все еще используются каналы RGB)

enter image description here

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 12 января 2020

Вы используете 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)
0 голосов
/ 12 января 2020

Ссылаясь на этот пост , в котором обсуждаются изображения на вспомогательных участках matplotlib, кажется, что поддерживаются только типы файлов PNG.

См. Также учебник для изображений , связанный в то же самое.

Я полагаю, что ошибка вызвана тем, что субплот принимает только двухмерные изображения, а поскольку JPG имеет три цветовых канала, matplotlib не уверен, какую информацию сопоставить с размерами x & y.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...