使用cv2调整图像大小

3
我正在尝试将从cifar10中检索的图像从原始的32x32大小调整为96x96大小,以便与MobileNetV2一起使用,但是我遇到了这个错误。尝试了各种解决方案,但似乎都不起作用。
我的代码:
for a in range(len(train_images)):
    train_images[a] = cv2.resize(train_images[a], dsize=(minSize, minSize), interpolation=cv2.INTER_CUBIC)

我遇到的错误是:

----> 8     train_images[a] = cv2.resize(train_images[a], dsize=(minSize, minSize), interpolation=cv2.INTER_CUBIC)
ValueError: could not broadcast input array from shape (96,96,3) into shape (32,32,3)

1
由于您没有在其他任何地方使用索引“a”,因此您可以将“for”循环更改为“for img in train_images:”,并将“train_images [a]”替换为“img”。 - Hemerson Tacon
3个回答

1
这是因为您正在从train_images读取32x32图像,并尝试将重塑后的图像(96x96)保存在同一数组中,这是不可能的!请尝试以下方法:
train_images_reshaped = np.array((num_images, 96, 96, 3))
for a in range(len(train_images)):
    train_images_reshaped[a] = cv2.resize(train_images[a], dsize=(minSize, minSize), interpolation=cv2.INTER_CUBIC)

那么数组中的图像无法被替换吗? - Clement Ong
不行,因为原始的numpy数组大小是固定的。 - Ary
它可以被替换。 - Smit Shilu
当我将其附加到新数组中时,错误不再出现。有什么办法可以检查图像是否确实被调整大小了吗? - Clement Ong
我在打印图像长度之前和之后,发现值确实从32变为了96。谢谢。 - Clement Ong

1
有时候你需要将图像从RGB转换为灰度。如果是这个问题,你需要做的唯一一件事就是gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)调整图像大小,然后再次使用resized_image = cv2.cvtColor(gray_image, cv2.COLOR_GRAY2RGB)
我从未遇到过这个错误,但如果第一个选项不起作用,你可以尝试使用pillow来调整图像大小,方法如下:
from PIL import Image

im = Image.fromarray(cv2_image)
nx, ny = im.size
im2 = im.resize((nx*2, ny*2), Image.LANCZOS)
cv2_image = cv2.cvtColor(numpy.array(im2), cv2.COLOR_RGB2BGR)

你可以将此转换为一个函数,并在列表推导式中调用它。希望这能解决你的问题 :)

无论如何,感谢您的回答,我已经点赞了它,使其不再是负数了。显然,有人在这个页面中对所有答案进行了投票。通过重新分配并将其附加到新数组中而不是替换,我设法让它工作。我不确定转换为灰度是否会影响结果,所以现在我只会坚持不替换!还是非常感谢您。 - Clement Ong
通道数(单色 vs RGB 或 BGR)并非问题所在。正如 Ary 在他的回答中指出的那样,问题在于 OP 正试图将形状为 (96, 96, 3) 的数组保存到形状为 (32, 32, 3) 的固定大小的数组子集中。 - M57

0

OpenCV中有一些插值算法,例如-

  • INTER_NEAREST - 最近邻插值
  • INTER_LINEAR - 双线性插值(默认使用)
  • INTER_AREA - 使用像素面积关系进行重采样。它可能是图像降采样的首选方法,因为它可以得到无莫尔纹的结果。但当图像被缩放时,它类似于INTER_NEAREST方法。
  • INTER_CUBIC - 在4×4像素邻域上进行双三次插值
  • INTER_LANCZOS4 - 在8×8像素邻域上进行Lanczos插值

代码:

image_scaled=cv2.resize(image,None,fx=.75,fy=.75,interpolation = cv2.INTER_LINEAR)
img_double=cv2.resize(image,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)
image_resize=cv2.resize(image,(200,300),interpolation=cv2.INTER_AREA)
image_resize=cv2.resize(image,(500,400),interpolation=cv2.INTER_LANCZOS4)

关于Python实现的详细信息,您也可以在这里找到:如何在OpenCV Python中调整图像大小


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