Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将PythonMagick图像对象转换为numpy数组(对于OpenCV),然后转换为PIL图像对象_Python_Numpy_Opencv_Image Processing_Pythonmagick - Fatal编程技术网

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

将PythonMagick图像对象转换为numpy数组(对于OpenCV),然后转换为PIL图像对象,python,numpy,opencv,image-processing,pythonmagick,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.imr

我想将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中,因此有必要更改通道的顺序(
[:,:,::-1]


Image.fromarray()
获取一个带有dtype的NumPy数组
np.uint8

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

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()
获取一个数据类型为
np.uint8

的NumPy数组,您的问题是什么?如果你不提问,你就不能期待和回答。也展示了自己的一些努力。谢谢,我已经更改了它,我只想将它们转换为不同的格式,比如直接从PythonMagick图像对象转换为Numpy阵列将出现堆栈溢出!因为您是新用户,所以您的问题需要审查。我对标题和措辞进行了编辑,以使你的问题更清楚。如果你不同意编辑,你可以进一步编辑你的问题。是的,我是全新的,我的英语很糟糕。你的问题是什么?如果你不提问,你就不能期待和回答。也展示了自己的一些努力。谢谢,我已经更改了它,我只想将它们转换为不同的格式,比如直接从PythonMagick图像对象转换为Numpy阵列将出现堆栈溢出!因为您是新用户,所以您的问题需要审查。我对标题和措辞进行了编辑,以使你的问题更清楚。如果你不同意编辑,你可以进一步编辑你的问题。是的,我是全新的,我的英语很糟糕