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


95

이미지 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

답변:


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.