gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:38:24 29 4
gpt4 key购买 nike

我想将 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com