用CV2调整图像大小

时间:2018-10-18 13:52:46

标签: python tensorflow cv2

我正在尝试将从原始32x32的cifar10检索到的图像调整为与MobileNetV2一起使用的96x96,但是我遇到了这个错误。尝试了各种解决方案,但似乎无济于事。

我的代码:

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)

3 个答案:

答案 0 :(得分: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)

您可以将其变成函数并在列表推导中调用它。我希望这可以解决您的问题:)

答案 1 :(得分:0)

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

答案 2 :(得分: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实现的详细信息:How to resize images in OpenCV python