将图像从PIL转换为openCV格式


101

我正在尝试将图像从转换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访问功能?



我提到了您提到的问题,但是给出的解决方案似乎对我不起作用
md1hunox

我认为您需要将图像从RGB转换为BGR。检查是否有效。
Froyo 2013年

Answers:


172

用这个:

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

2
谢谢,您能解释一下最后一行的详细内容吗?
md1hunox

17
您有一个由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]。最后一行(useless除外.copy)等效于整个图像的此操作。
mmgp 2013年

16
可能只是性能略有改善,但 cv2.cvtColor(open_cv_image, cv2.cv.CV_BGR2RGB) 效率更高。
GuillaumeDufay'3

您的答案中.convert('RGB')的目的是什么?我正在使用16位灰度图像(图像模式= I; 16)..到目前为止,nparray会将图像保留为单个PIL.Image对象。(即,只有一个条目的数组,即原始PIL.Image)
user391339,2015年

3
如果图像是二进制的(例如,扫描的binary TIF),则numpy数组将是bool,因此您将无法在OpenCV中使用它。在这种情况下,您需要将其转换为OpenCV掩码:if image.dtype == bool: image = image.astype(np.uint8) * 255
Maksym Ganenko '17

99

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

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)

2
如果从url下载,我将使用:import requests response = requests.get(url) opencvImage = imdecode(np.asarray(bytearray(response.content)), 1)
Lior

4
如何将pil图像再次转换为mat?

乌尔答案返回此错误: OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor
法里德Alijani

作品。为什么python世界中的每个人都没有声明其导入?
pscheit
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.