【问题标题】:Plot augmented images using matplotlib in python3.6在 python3.6 中使用 matplotlib 绘制增强图像
【发布时间】:2017-12-15 09:35:57
【问题描述】:

我正在尝试从训练目录中绘制一堆增强图像。我正在使用 Keras 和 Tensorflow。可视化库是 matplotlib。我正在使用下面的代码在 6 行和列中绘制 256 X 256 X 1 灰色图像。我得到的错误是

Invalid Dimensions for image data.

这是我正在使用的代码:-

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

import keras
from keras.preprocessing.image import ImageDataGenerator

train_set = '/home/ai/IPI/Data/v1_single_model/Train/' # Use your own path
batch_size = 4

gen = ImageDataGenerator(rescale = 1. / 255)
train_batches = gen.flow_from_directory(
        'data/train',
        target_size=(256, 256),
        batch_size=batch_size,
        class_mode='binary')

def plot_images(img_gen, img_title):
    fig, ax = plt.subplots(6,6, figsize=(10,10))
    plt.suptitle(img_title, size=32)
    plt.setp(ax, xticks=[], yticks=[])
    plt.tight_layout(rect=[0, 0.03, 1, 0.95])
    for (img, label) in img_gen:
        for i in range(6):
            for j in range(6):
                if i*6 + j < 256:
                    ax[i][j].imshow(img[i*6 + j])
        break

plot_images(train_batches, "Augmented Images")

下面是错误和python回溯的快照:-

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-79-81bdb7f0d12e> in <module>()
----> 1 plot_images(train_batches, "Augmented Images")

<ipython-input-78-d1d4bba983d3> in plot_images(img_gen, img_title)
      8             for j in range(6):
      9                 if i*6 + j < 32:
---> 10                     ax[i][j].imshow(img[i*6 + j])
     11         break

~/anaconda3/lib/python3.6/site-packages/matplotlib/__init__.py in inner(ax, *args, **kwargs)
   1896                     warnings.warn(msg % (label_namer, func.__name__),
   1897                                   RuntimeWarning, stacklevel=2)
-> 1898             return func(ax, *args, **kwargs)
   1899         pre_doc = inner.__doc__
   1900         if pre_doc is None:

~/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_axes.py in imshow(self, X, cmap, norm, aspect, interpolation, alpha, vmin, vmax, origin, extent, shape, filternorm, filterrad, imlim, resample, url, **kwargs)
   5122                               resample=resample, **kwargs)
   5123 
-> 5124         im.set_data(X)
   5125         im.set_alpha(alpha)
   5126         if im.get_clip_path() is None:

~/anaconda3/lib/python3.6/site-packages/matplotlib/image.py in set_data(self, A)
    598         if (self._A.ndim not in (2, 3) or
    599                 (self._A.ndim == 3 and self._A.shape[-1] not in (3, 4))):
--> 600             raise TypeError("Invalid dimensions for image data")
    601 
    602         self._imcache = None

TypeError: Invalid dimensions for image data

我做错了什么?

【问题讨论】:

  • 你认为img[i*6 + j]应该做什么?
  • 获取该索引值的图像?
  • 循环中img的形状是什么? (print(img.shape))
  • :o 它正在给予 (1, 256, 256, 1)。但为什么 ?我的尺寸应该是 256、256、1
  • 你在这里没有真正回答第一个问题,但我想你想显示imshow(img[0,:,:,0])

标签: python python-3.x matplotlib plot keras


【解决方案1】:

错误告诉你哪里出了问题。您的图像形状为(1,n,m,1),在第一个循环运行中您选择img[0],这导致数组的形状为(n,m,1),因此

self._A.ndim == 3 and self._A.shape[-1] not in (3, 4)

来自matplotlib.pyplot.imshow(X, ...) documentation

X : array_like, shape (n, m) or (n, m, 3) or (n, m, 4)

但不是(n,m,1)。 除此之外,img[i*6 + j] 将在i*6 + j &gt; 0 时立即失败。

图像img 尺寸为(samples, height, width, channels)img 是单个样本,因此 samples = 1;它是灰度的,因此是channels = 1。要获取形状为(n,m) 的图像,您需要选择它

imshow(img[0,:,:,0]) 

【讨论】:

  • 我现在很清楚了。谢谢你。还有一件事。绘制图像后,输出为绿色而不是灰色。我添加了ax[i][j].imshow(img[0,:,:,0], camp = plt.get_cmap('grey'))
  • 使用cmap = "grey"
猜你喜欢
  • 2021-11-05
  • 2021-01-31
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 2016-02-09
  • 1970-01-01
  • 2011-03-31
相关资源
最近更新 更多