18

我正在尝试通过将图像重新缩放为 (10, 10) 来预处理图像数据集,该数据集以 numpy 数组表示,形状为 (28, 28) 的图像。我为此写了一个函数:

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)

但是当我真正尝试重新调整它们时,我收到以下错误cv2.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

4 回答 4

50

哦,其实我想通了。数据集中的图像类型为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 表示的图像。希望这会帮助任何人

于 2019-03-30T07:03:16.070 回答
3

实际上cv2.resize 可以使用以整数表示的图像,但您需要使用默认的插值方法。

下面列出了您可以使用的不同插值标志:cv2 调整插值标志

默认情况下,cv2 使用 INTER_LINEAR 方法,顾名思义,该方法是线性的。因此,大多数情况下,它会为您提供必须表示为浮点数的值。与 INTER_CUBIC、INTER_AREA、INTER_LANCZOS4 相同...

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

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

resized_img = cv2.resize(img, (10,10), interpolation=cv2.INTER_LINEAR_EXACT)
于 2021-08-19T09:58:54.870 回答
0

首先,让我们检查图像的范围是否在 [0 1] 之间。我收到一个错误,导致我的 RGB 在 255 范围内。

于 2021-02-04T22:37:15.003 回答
0

我对此没有任何解释。解决方案是将您的输入图像设置为uint8格式或float32.

使用numpy,它变成...

my_image = np.array(my_image, dtype='uint8')
于 2021-03-31T18:30:46.967 回答