簡體   English   中英

將 PythonMagick Image 對象轉換為 numpy 數組(用於 OpenCV),然后轉換為 PIL 圖像對象

[英]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.

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