将图像从 PIL 转换为 openCV 格式

问题描述 投票:0回答:5

我正在尝试将图像从

PIL
转换为
OpenCV
格式。我正在使用
OpenCV 2.4.3
。 这是我到目前为止所做的尝试。

>>> from PIL import Image
>>> import cv2 as cv
>>> pimg = Image.open('D:\\traffic.jpg')                           #PIL Image
>>> cimg = cv.cv.CreateImageHeader(pimg.size,cv.IPL_DEPTH_8U,3)    #CV Image
>>> cv.cv.SetData(cimg,pimg.tostring())
>>> cv.cv.NamedWindow('cimg')
>>> cv.cv.ShowImage('cimg',cimg)
>>> cv.cv.WaitKey()

但我认为图像没有转换为 CV 格式。窗口向我展示了一张大的棕色图像。 将图像从

PIL
转换为
CV
格式时我哪里出错了?

另外,为什么我需要输入

cv.cv
才能访问功能?

python image-processing opencv python-imaging-library
5个回答
264
投票

使用这个:

pil_image = PIL.Image.open('Image.jpg').convert('RGB') 
open_cv_image = numpy.array(pil_image) 
# Convert RGB to BGR 
open_cv_image = open_cv_image[:, :, ::-1].copy() 

164
投票

这是我能找到的最短版本,保存/隐藏额外的转换:

pil_image = PIL.Image.open('image.jpg')
opencvImage = cv2.cvtColor(numpy.array(pil_image), cv2.COLOR_RGB2BGR)

如果从 URL 读取文件:

import cStringIO
import urllib
file = cStringIO.StringIO(urllib.urlopen(r'http://stackoverflow.com/a_nice_image.jpg').read())
pil_image = PIL.Image.open(file)
opencvImage = cv2.cvtColor(numpy.array(pil_image), cv2.COLOR_RGB2BGR)

23
投票

注释的代码也有效,只需选择您喜欢的代码即可

import numpy as np
from PIL import Image


def convert_from_cv2_to_image(img: np.ndarray) -> Image:
    # return Image.fromarray(img)
    return Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))


def convert_from_image_to_cv2(img: Image) -> np.ndarray:
    # return np.asarray(img)
    return cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)

2
投票

枕头图像到 OpenCV 图像:

cv2_img = np.array(pil_img)
cv2_img = cv2.cvtColor(cv2_img, cv2.COLOR_RGB2BGR)

OpenCV 图像到 Pillow 图像:

cv2_img = cv2.cvtColor(cv2_img, cv2.COLOR_BGR2RGB)
pil_img = Image.fromarray(cv2_img)

来源:https://medium.com/analytics-vidhya/the-ultimate-handbook-for-opencv-pillow-72b7eff77cd7


1
投票

这里有两个在 PIL 和 OpenCV 之间转换图像的函数:

def toImgOpenCV(imgPIL): # Conver imgPIL to imgOpenCV
    i = np.array(imgPIL) # After mapping from PIL to numpy : [R,G,B,A]
                         # numpy Image Channel system: [B,G,R,A]
    red = i[:,:,0].copy(); i[:,:,0] = i[:,:,2].copy(); i[:,:,2] = red;
    return i; 

def toImgPIL(imgOpenCV): return Image.fromarray(cv2.cvtColor(imgOpenCV, cv2.COLOR_BGR2RGB));

从 OpenCV img 转换为 PIL img 将丢失透明通道。而将 PIL img 转换为 OpenCV img 将能够保持透明通道,虽然 cv2.imshow 不显示它但保存为 png 会正常给出结果。

  • 可以调用 cv2.imwrite("./"+"fileName.png", img); 导出并查看 OpenCV img 的透明结果。
  • toImgPIL(img).save('test.png', 'PNG') 检查 PIL img。
© www.soinside.com 2019 - 2024. All rights reserved.