Próbuję przekonwertować obraz z PIL
do OpenCV
formatu. Używam OpenCV 2.4.3
. oto co próbowałem do tej pory.
>>> 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()
Ale myślę, że obraz nie jest konwertowany do formatu CV. Okno pokazuje duży brązowy obraz. Gdzie popełniam błąd podczas konwertowania obrazu z PIL
na CV
format?
Dlaczego muszę pisać, cv.cv
aby uzyskać dostęp do funkcji?
Odpowiedzi:
Użyj tego:
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()
źródło
ex = numpy.array([ [ [1, 2, 3], [4, 5, 6] ], [ [7, 8, 9], [0, 1, 2] ] ])
. Podobnieex[0]
jak pierwsza linia obrazu,ex[0][0]
pierwsza kolumna pierwszej linii,ex[0][0][0]
to czerwony składnik pierwszego piksela,ex[0][0][1]
zielony iex[0][0][2]
niebieski. Ponieważ najwyraźniej potrzebujesz obrazu BGR (odwrotna kolejność RGB), odwracasz każdy element, który opisuje piksel, tak jak wex[0][0][::-1]
. Ostatnia linia (oprócz bezużytecznych.copy
) jest odpowiednikiem tej operacji dla całego obrazu.cv2.cvtColor(open_cv_image, cv2.cv.CV_BGR2RGB)
jest nieco wydajniejsza.TIF
), to tablica numpy będzie taka,bool
więc nie będziesz mógł jej używać z OpenCV. W takim przypadku musisz przekonwertować ją na maskę OpenCV:if image.dtype == bool: image = image.astype(np.uint8) * 255
To najkrótsza wersja, jaką udało mi się znaleźć, zapisująca / ukrywająca dodatkową konwersję:
pil_image = PIL.Image.open('image.jpg') opencvImage = cv2.cvtColor(numpy.array(pil_image), cv2.COLOR_RGB2BGR)
Jeśli czytasz plik z adresu 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)
źródło
import requests
response = requests.get(url)
opencvImage = imdecode(np.asarray(bytearray(response.content)), 1)
OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor
Skomentowany kod również działa, po prostu wybierz, który wolisz
import numpy as np from PIL import Image def convert_from_cv2_to_image(img: np.ndarray) -> Image: # return Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) return Image.fromarray(img) def convert_from_image_to_cv2(img: Image) -> np.ndarray: # return cv2.cvtColor(numpy.array(img), cv2.COLOR_RGB2BGR) return np.asarray(img)
źródło