【问题标题】:Resizing image with cv2使用 cv2 调整图像大小
【发布时间】:2019-04-27 06:56:22
【问题描述】:

我正在尝试将原始 32x32 中从 cifar10 检索到的图像调整为 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)

【问题讨论】:

  • 由于您没有在其他任何地方使用索引a,您可以将for 循环更改为for img in train_images: 并将train_images[a] 替换为img

标签: python tensorflow cv2


【解决方案1】:

有时您必须将图像从 RGB 转换为灰度。如果这是问题所在,您唯一应该做的就是gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)调整图像大小,然后再次resized_image = cv2.cvtColor(gray_image, cv2.COLOR_GRAY2RGB)

我从来没有遇到过这个错误,但是如果第一个选项不起作用,您可以尝试使用枕头调整图像大小,如下所示:

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)

你可以把它变成一个函数并在列表推导中调用它。我希望这能解决你的问题:)

【讨论】:

  • 无论如何感谢您的回答,我支持它以使其不再是负面的,显然有些人否决了此页面中的所有答案。设法通过重新分配并将其附加到新数组而不是替换来使其工作。而且我不确定更改为灰度是否会影响结果,所以我会坚持暂时不更换!还是谢谢
【解决方案2】:

这仅仅是因为您正在从 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)

【讨论】:

  • 所以数组中的图片无法替换?
  • 不,因为原来的numpy数组大小是固定的。
  • 可以更换。
  • 当我将它附加到一个新数组中时,该错误不再出现。知道如何检查图像是否确实调整了大小吗?
  • 我打印出前后图像的长度,值确实从 32 变为 96。谢谢
【解决方案3】:

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 实现的详细信息:How to resize images in OpenCV python

【讨论】:

    猜你喜欢
    • 2020-03-03
    • 1970-01-01
    • 2015-10-16
    • 2021-02-26
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    相关资源
    最近更新 更多