我想将PythonMagick图像对象转换为可以在OpenCV中使用的NumPy数组,然后我想将其转换为PIL图像对象。我搜索过谷歌,但找不到任何解释如何执行此操作的来源。有人能告诉我如何在这些不同模块之间转换图像对象吗?
答案 0 :(得分: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为np.uint8
的NumPy数组。