将图像从 PIL 转换为 openCV 格式

我试图转换图像从 PILOpenCV格式。我使用 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 格式,窗口显示了一个大的棕色图像。 我在转换图像从 PILCV格式的错误在哪里?

还有,为什么我需要键入 cv.cv来访问函数?

219809 次浏览

使用:

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()

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

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)

注释的代码也可以工作,只需选择您喜欢的代码即可

import numpy as np
from PIL import Image




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




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

下面是在 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 图像。

枕头图片到 OpenCV 图片:

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

OpenCV 图片到枕头图片:

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