python - 将 PythonMagick Image 对象转换为 numpy 数组(用于 OpenCV),然后转换为 PIL 图像对象

标签 python numpy opencv image-processing pythonmagick

我想将 PythonMagick 图像对象转换为可在 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 中,因此有必要更改 channel 的顺序 ([:, :, ::-1])。
Image.fromarray()采用 dtype np.uint8 的 NumPy 数组.

关于python - 将 PythonMagick Image 对象转换为 numpy 数组(用于 OpenCV),然后转换为 PIL 图像对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41319967/

相关文章:

Python OpenCV - VideoCapture.release() 在 Linux 中不起作用

python - 为什么我的代码会出现此错误?

python - 从 svg 转换为 pdf

python - 有效地删除 numpy 图像数组的行/列

python - 在对数对数图上插入一条直线 (NumPy)

python - 图像匹配会导致图像不应该是一个图像(Python opencv教程)

c++ - dlib图像转换为opencv

python - 我在哪里可以获得 'Dive into Python' 的练习?

python - 根据数据帧的列在 python 中创建字典

python - C中的numpy数组类型转换