Я пытаюсь преобразовать изображение из 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
для доступа к функциям?
Ответы:
использовать это:
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()
источник
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
) является эквивалентом этой операции для всего изображения.cv2.cvtColor(open_cv_image, cv2.cv.CV_BGR2RGB)
оно немного более эффективно.TIF
), тогда будет массив numpy,bool
и вы не сможете использовать его с OpenCV. В этом случае вам нужно преобразовать его в маску OpenCV:if image.dtype == bool: image = image.astype(np.uint8) * 255
Это самая короткая версия, которую я смог найти, с сохранением / скрытием лишнего преобразования:
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 requests
response = requests.get(url)
opencvImage = imdecode(np.asarray(bytearray(response.content)), 1)
OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor