Error while resizing image: "error: (-215:Assertion failed) func != 0 in function 'resize'"
Error while resizing image: "error: (-215:Assertion failed) func != 0 in function 'resize'"
我正在尝试预处理图像数据集,通过将它们重新缩放为 (10, 10),以形状为 (28, 28) 的图像在 numpy 数组中表示。我为此写了一个函数:
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'
在 google 中,我只发现有人用 C++ 写了同样的错误,却做了非常不同的事情,比如这个:resize an image and changing its depth and this: http://answers.opencv.org/question/19715/error-215-func-0-in-function-convertto/
我该如何解决?
哦,其实我想通了。数据集中的图像类型为 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 表示的图像。希望这对任何人都有帮助
首先,让我们检查图像的范围是否在[0 1]之间。我收到一个错误,导致我的 RGB 在 255 范围内。
我对此没有任何解释。解决方案是让您的输入图像采用 uint8
格式或 float32
.
使用numpy,就变成了...
my_image = np.array(my_image, dtype='uint8')
实际上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)
我正在尝试预处理图像数据集,通过将它们重新缩放为 (10, 10),以形状为 (28, 28) 的图像在 numpy 数组中表示。我为此写了一个函数:
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'
在 google 中,我只发现有人用 C++ 写了同样的错误,却做了非常不同的事情,比如这个:resize an image and changing its depth and this: http://answers.opencv.org/question/19715/error-215-func-0-in-function-convertto/
我该如何解决?
哦,其实我想通了。数据集中的图像类型为 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 表示的图像。希望这对任何人都有帮助
首先,让我们检查图像的范围是否在[0 1]之间。我收到一个错误,导致我的 RGB 在 255 范围内。
我对此没有任何解释。解决方案是让您的输入图像采用 uint8
格式或 float32
.
使用numpy,就变成了...
my_image = np.array(my_image, dtype='uint8')
实际上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)