PIL에서 openCV 형식으로 이미지 변환


95

이미지 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함수에 액세스 하기 위해 입력해야하는 이유는 무엇입니까?



나는 당신이 언급 한 질문에 언급,하지만 거기에 주어진 솔루션 나던 날 위해 작동하는 것
— md1hunox

이미지를 RGB에서 BGR로 변환해야한다고 생각합니다. 작동하는지 확인하십시오.
— Froyo

답변:


163

이것을 사용하십시오 :

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 2013 년

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]. 마지막 줄 (쓸모없는 줄 제외 .copy)은 전체 이미지에 대해이 작업과 동일합니다.
— mmgp

16
약간의 성능 향상 일 수 있지만 cv2.cvtColor(open_cv_image, cv2.cv.CV_BGR2RGB) 좀 더 효율적입니다.
— GuillaumeDufay

답변에서 .convert ( 'RGB')의 목적은 무엇입니까? 16 비트 그레이 스케일 이미지로 작업하고 있습니다 (이미지 모드 = I; 16) .. 지금까지 nparray는 이미지를 단일 PIL.Image 객체로 유지하고 있습니다. (즉, 하나의 항목 만있는 배열, 원본 PIL.Image)
— user391339

3
이미지가 바이너리 인 경우 (예 : scan binary TIF), numpy 배열이 bool되므로 OpenCV와 함께 사용할 수 없습니다. 이 경우 OpenCV의 마스크로 변환해야합니다if image.dtype == bool: image = image.astype(np.uint8) * 255
— Maksym Ganenko

90

이것은 내가 찾을 수있는 가장 짧은 버전으로, 추가 변환을 저장 / 숨 깁니다.

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)

1
URL에서 다운로드하는 경우 다음과 같이 이동합니다.import requests response = requests.get(url) opencvImage = imdecode(np.asarray(bytearray(response.content)), 1)
— Lior

4
필 이미지를 매트로 다시 변환하려면 어떻게합니까?

ur 대답은 다음 오류를 반환합니다. OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor
— Färid Alijani

공장. 파이썬 세계의 모든 사람들이 수입품을 언급하지 않는 이유는 무엇입니까?
— pscheit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.