调整图像大小时出错:“错误:(-215:断言失败)func!= 0,函数'resize'中的内容”。

23

我正在尝试对以numpy数组表示的图像数据集进行预处理,图像形状为(28, 28),将它们重新缩放为(10, 10)。我写了以下的函数:

import cv2 as cv

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

但是当我尝试重新调整它们的大小时,cv.resize 函数会返回以下错误:

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

在谷歌上,我只找到那些写C++的人遇到相同错误但做的事情不一样,例如这个问题:调整图像大小和更改深度以及这个:http://answers.opencv.org/question/19715/error-215-func-0-in-function-convertto/。如何修复?
4个回答

60

哦,我终于想通了。数据集中的图像是 np.int64 类型的。我只需要将图像转换为 float32,就像这样:

import numpy as np
import cv2 as cv

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

现在它运行得很好。看起来cv.resize不能处理以int表示的图像。希望这可以帮助任何人。


7
有人知道为什么它不能与int64一起使用吗?我还发现它不能与int32一起使用,但可以与uint8一起使用。 - Neb
4
若错误信息能解释清楚这个问题就更好了。 - jtlz2
1
非常感谢您分享解决方案!我也遇到了这个问题。这是我第一次发现opencv函数只接收浮点数据,但为什么呢?而且我在文档中没有看到这个说明。 - 林彥良
uint8被接受的原因是因为0到255的范围可以用8位表示,而它也可以与float32一起使用。 - Vinayak Mikkal

7

实际上,cv2.resize 可以 处理以整数表示的图像,但需要更改默认的插值方法

以下列出了不同的插值标志,您可以使用:OpenCV调整大小插值标志

默认情况下,cv2使用INTER_LINEAR方法,顾名思义是线性的。因此,大多数情况下,它会导致给出必须表示为浮点数的值。INTER_CUBIC、INTER_AREA、INTER_LANCZOS4也是如此。

但是,也有一些方法可以应用于整数,例如INTER_NEAREST(最近邻)或INTER_LINEAR_EXACT(与INTER_LINEAR相同,但四舍五入到最近的整数)。

在上述情况下,我建议尝试:

import cv2
resized_img = cv2.resize(img, (10,10), interpolation=cv2.INTER_LINEAR_EXACT)

1
“INTER_LINEAR_EXACT” 仍然在使用 int32 图像时出现相同的错误(OpenCV(4.5.4-dev),C++)。 “INTER_NEAREST” 可以正常工作。 - fferen

1
我没有关于这个的解释。解决方法是将输入图像格式转换为uint8float32
使用numpy,变为...
my_image = np.array(my_image, dtype='uint8')

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接