将图像从PIL转换为openCV格式

md1*_*nox 67 python opencv image-processing python-imaging-library

我正在尝试将图像转换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()
Run Code Online (Sandbox Code Playgroud)

但我认为图像没有转换为CV格式.窗口向我显示一个大的棕色图像.在将图像转换PILCV格式时我在哪里出错了?

另外,为什么我需要键入cv.cv访问功能?

Abh*_*kur 117

用这个:

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() 
Run Code Online (Sandbox Code Playgroud)

  • 你有一个由3d数组表示的RGB图像,如`ex = numpy.array([[[1,2,3],[4,5,6]],[[7,8,9],[0 ,1,2]]])`.所以`ex [0]`是图像的第一行,`ex [0] [0]`是第一行的第一列,`ex [0] [0] [0]`是红色的组成部分.第一个像素,`ex [0] [0] [1]`是绿色成分,而'ex [0] [0] [2]`是蓝色成分.由于您显然需要BGR图像(RGB的逆序),因此您可以将每个描述像素的元素反转为"ex [0] [0] [:: - 1]`.最后一行(无用的`.copy`除外)相当于整个图像的这个操作. (13认同)
  • 它可能只是略微提升性能,但`cv2.cvtColor(open_cv_image,cv2.cv.CV_BGR2RGB)`效率更高一些. (13认同)
  • 谢谢,您能解释一下最后一行的详细内容吗? (2认同)
  • 如果图像是二进制的(例如,扫描二进制`TIF`),则numpy数组将是`bool`,因此您将无法将其与OpenCV一起使用.在这种情况下,您需要将其转换为OpenCV掩码:`if image.dtype == bool:image = image.astype(np.uint8)*255 (2认同)

Ber*_*eux 54

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

pil_image = PIL.Image.open('image.jpg')
opencvImage = cv2.cvtColor(numpy.array(pil_image), cv2.COLOR_RGB2BGR)
Run Code Online (Sandbox Code Playgroud)

如果从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)
Run Code Online (Sandbox Code Playgroud)

  • 如何将 pil 图像再次转换为 mat? (4认同)
  • 如果从 url 下载,我会选择:`import requests``response = requests.get(url)``opencvImage = imdecode(np.asarray(bytearray(response.content)), 1)` (2认同)

小智 25

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

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)
Run Code Online (Sandbox Code Playgroud)