将PythonMagick图像对象转换为numpy数组(对于OpenCV),然后转换为PIL图像对象
我想将PythonMagick图像对象转换为可在OpenCV中使用的NumPy数组,然后将其转换为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
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阵列将出现堆栈溢出!因为您是新用户,所以您的问题需要审查。我对标题和措辞进行了编辑,以使你的问题更清楚。如果你不同意编辑,你可以进一步编辑你的问题。是的,我是全新的,我的英语很糟糕