【问题标题】:Error while resizing image: "error: (-215:Assertion failed) func != 0 in function 'resize'"调整图像大小时出错:“错误:(-215:Assertion failed) func != 0 in function 'resize'”
【发布时间】:2023-03-07 10:56:01
【问题描述】:

我正在尝试通过将图像重新缩放为 (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++ 上写同样错误的人在做非常不同的事情,比如这个:resize an image and changing its depth 和这个:http://answers.opencv.org/question/19715/error-215-func-0-in-function-convertto/

我该如何解决?

【问题讨论】:

    标签: python cv2 image-preprocessing


    【解决方案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 表示的图像。希望这对任何人都有帮助

    【讨论】:

    • 有谁知道为什么它不适用于int64?我还发现它不适用于int32,但它确实适用于uint8
    • 如果错误信息能解释这一点就好了:\
    • 感谢您分享解决方案!我也被这个问题困住了。这是我第一次发现 opencv 函数只接收浮点数据,但为什么呢?而且我没有在文档中看到这一点。
    【解决方案2】:

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

    这里列出了您可以使用的不同插值标志:cv2 resize interpolation flags

    默认情况下,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)
    

    【讨论】:

    • INTER_LINEAR_EXACT 仍然给我同样的错误 int32 图像(OpenCV(4.5.4-dev),C++)。 INTER_NEAREST 工作。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      使用numpy,就变成了……

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

      【讨论】:

        猜你喜欢
        • 2021-04-09
        • 2020-10-13
        • 1970-01-01
        • 2022-08-12
        • 2019-12-07
        • 1970-01-01
        • 2015-11-06
        • 2019-11-12
        • 2020-09-03
        相关资源
        最近更新 更多