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