[英]Convert PythonMagick Image object to numpy array (for OpenCV) and then to PIL image object
我想將一個 PythonMagick Image Object 轉換成一個可以在 OpenCV 中使用的 NumPy 數組,然后我想將它轉換成一個 PIL 圖像對象。 我已經搜索過谷歌,但找不到任何解釋如何做到這一點的來源。 有人可以告訴我如何在這些不同模塊之間轉換圖像對象嗎?
我發現的最快方法是保存和打開它:
import PythonMagic
import cv2
# pm_img is a PythonMagick.Image
pm_img.write('path/to/temporary/file.png')
np_img = cv2.imread('path/to/temporary/file.png')
我還沒有找到任何令人滿意的方法將 PythonMagick 圖像轉換為 NumPy 數組而不保存它們,但是有一種涉及使用 python 循環的緩慢方法:
import PythonMagick
import numpy as np
pm_img = PythonMagick.Image('path/to/image.jpg')
h, w = pm_img.size().height(), pm_img.size().width()
np_img = np.empty((h, w, 3), np.uint16) # PythonMagick opens images with 16 bit depth
# It seems to store the same byte twice (weird)
for i in range(h):
for j in range(w):
# OpenCV stores pixels as BGR
np_img[i, j] = (pm_img.pixelColor(j, i).quantumBlue(),
pm_img.pixelColor(j, i).quantumGreen(),
pm_img.pixelColor(j, i).quantumRed())
np_img = np_img.astype(np.uint8)
將 NumPy 數組轉換為 PIL 圖像更容易:
from PIL import Image
pil_img = Image.fromarray(np_img[:, :, ::-1].astype(np.uint8))
由於 PIL 將圖像存儲在 RGB 中,而 OpenCV 將它們存儲在 BGR 中,因此有必要更改通道的順序( [:, :, ::-1]
)。
Image.fromarray()
取NumPy的陣列與D型np.uint8
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.