首页 > 解决方案 > AttributeError: 'NoneType' 对象没有使用 OpenCV 的属性 'shape'

问题描述

我正在从安装到谷歌 colab 的谷歌驱动器中读取图像。我有两个文件夹,一个带有阳性 covid-19 胸部 X 光片,另一个带有正常胸部 X 光片。我试图并排显示这些图像以进行比较。以下是代码和错误的图像:

第一行代码

错误图像

这里也是写好的代码:

Cimages = ('/content/drive/My Drive/Data/Covid')
Nimages = ('/content/drive/My Drive/Data/Normal')

import skimage
from skimage.transform import resize
def plot(i):
  normal = cv2.imread(dataset +'Normal//' + Nimages[i])
  normal = skimage.transform.resize(normal, (150,150,3))
  covid = cv2.imread(dataset +'Covid//' + Cimages[i])
  covid = skimage.transform.resize(normal, (150,150,3), mode = reflect)
  pair = np.concatenate((normal, covid), axis = 1)
  print('Normal vs. Covid')
  plt.figure(figsize=(10,5))
  plt.imshow(pair)
  plt.show()

for i in range(0,3):
  plot(i)

这给了我一个错误:

AttributeError                            Traceback (most recent call last)
<ipython-input-52-237aff042641> in <module>()
      1 for i in range(0,3):
----> 2   plot(i)

<ipython-input-50-85bb2e03725c> in plot(i)
      3 def plot(i):
      4   normal = cv2.imread(dataset +'Normal//' + Nimages[i])
----> 5   normal = skimage.transform.resize(normal, (150,150,3))
      6   covid = cv2.imread(dataset +'Covid//' + Cimages[i])
      7   covid = skimage.transform.resize(normal, (150,150,3), mode = reflect)

/usr/local/lib/python3.6/dist-packages/skimage/transform/_warps.py in resize(image, output_shape, order, mode, cval, clip, preserve_range, anti_aliasing, anti_aliasing_sigma)
     89     output_shape = tuple(output_shape)
     90     output_ndim = len(output_shape)
---> 91     input_shape = image.shape
     92     if output_ndim > image.ndim:
     93         # append dimensions to input_shape

AttributeError:“NoneType”对象没有属性“形状”

所以它似乎发生在 skimage.tranform.resize 代码行中。请帮忙。

标签: python-2.7opencvmachine-learningartificial-intelligenceobject-detection

解决方案


问题不在于功能

skimage.tranform.resize

但随着图像的阅读

normal = cv2.imread(dataset +'Normal//' + Nimages[i])

不确定您要在那里做什么,但Nimages[i]不会给您文件夹中的第一个文件,但在您的情况下,它将产生字符串的第一个字符/。然后您将发送dataset变量 ++ Normal///这基本上是您的情况Normal///,然后您将尝试读取该路径上的图像,但毫无疑问,在这种情况下没有图像opencv将返回给您None(基本上什么都没有)。然后你尝试调整大小Noneskimage这将失败。

更好的选择是直接读取图像或在看起来像这样的循环中读取图像:

from os import listdir
from os.path import isfile, join
onlyfiles = [f for f in listdir(Nimages) if isfile(join(Nimages , f))]
for image_path in onlyfiles:
    normal = cv2.imread(join(Nimages , image_path))
    normal = skimage.transform.resize(normal, (150,150,3))

假设您提到的目录中只有图像。


推荐阅读