调整图像大小时出错:“错误:(-215:声明失败)函数'resize'中的func!= 0”

时间:2019-03-30 06:46:54

标签: python cv2 image-preprocessing

我试图通过将图像缩放为(10,10)来预处理形状为(28,28)的numpy数组(33600,784)表示的图像数据集(mnist)。我为此写了一个函数:

def resize_dataset(images):
    resized_images = []
    for img in images:
            img = img.reshape((28,28))
            resized_img = cv2.resize(img, dsize=(10, 10))
            resized_images.append(resized_img)
    return numpy.array(resized_images)

但是当我实际尝试重新缩放它们时

x_tr_resc = resize_dataset(x_tr)

我收到以下错误:

---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-38-fc680e0206f0> in <module>()
----> 1 x_tr_resc = resize_dataset(x_tr)

<ipython-input-37-bd0b64255821> in resize_dataset(images)
      6     for img in images:
      7             img = img.reshape((28,28))
----> 8             resized_img = cv2.resize(img, dsize=(10, 10))
      9             resized_images.append(resized_img)
     10     return numpy.array(resized_images)

error: OpenCV(4.0.0) /io/opencv/modules/imgproc/src/resize.cpp:3662: error: (-215:Assertion failed) func != 0 in function 'resize'

我尝试通过Google搜索此错误,但只发现在用c ++编写时发生相同错误的人做了非常不同的事情,例如:resize an image and changing its depth和这个:http://answers.opencv.org/question/19715/error-215-func-0-in-function-convertto/

我在做什么错了?

3 个答案:

答案 0 :(得分:1)

哦,我实际上知道了。数据集中的图像类型为numpy.int64。我只需要将图像转换为float32,就像这样:

def resize_dataset(images):
    resized_images = []
    for img in images:
            img = img.reshape((28,28)).astype('float32')  # <-- convert image to float32
            resized_img = cv2.resize(img, dsize=(10, 10))
            resized_images.append(resized_img)
    return numpy.array(resized_images)

现在,它运行良好。看来cv2.resize无法使用int表示的图像。希望这会帮助任何人

答案 1 :(得分:0)

首先,让我们检查图像的范围是否在 [0 1] 之间。我的 RGB 范围为 255,因此出现错误。

答案 2 :(得分:0)

我对此没有解释。解决方案是让您的输入图像采用 uint8 格式或 float32

使用 numpy,它变成...

my_image = np.array(my_image, dtype='uint8')