1

我想将 PythonMagick 图像对象转换为可在 OpenCV 中使用的 NumPy 数组,然后将其转换为 PIL 图像对象。我搜索了谷歌,但找不到任何解释如何执行此操作的资源。有人可以告诉我如何在这些不同的模块之间转换图像对象吗?

4

1 回答 1

0

我发现最快的方法是保存和打开它:

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()接受一个带有 dtype 的 NumPy 数组np.uint8

于 2019-11-07T15:31:49.850 回答