我试图通过将图像缩放为(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/
我在做什么错了?
答案 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')