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

时间:2016-12-25 09:22:14

标签: python-2.7 image-processing computer-vision opencv3.0

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

1 个答案:

答案 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数组。