簡體   English   中英

使用 cv2 調整圖像大小

[英]Resizing image with cv2

我正在嘗試將原始 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)

有時您必須將圖像從 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)

你可以把它變成一個函數並在列表理解中調用它。 我希望這能解決你的問題:)

這僅僅是因為您正在從 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)

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 中調整圖像大小

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM