使用 cv2 调整图像大小

Resizing image with cv2

我正在尝试将从 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)

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

有时您必须将图像从 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)

你可以把它做成一个函数,然后在列表理解中调用它。我希望这能解决您的问题:)

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