Görüntüyü PIL'den openCV formatına dönüştürün


95

Ben görüntüyü dönüştürmek için çalışıyorum PILiçin OpenCVformatında. Kullanıyorum OpenCV 2.4.3. İşte şimdiye kadar denediğim şey.

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

Ancak görselin CV formatına dönüştürülmediğini düşünüyorum. Pencere bana büyük kahverengi bir görüntü gösteriyor. Nerede görüntüyü dönüştürme içinde yanlış gidiyorum PILiçin CVformatında?

Ayrıca, cv.cvişlevlere erişmek için neden yazmam gerekiyor ?



Bahsettiğiniz soruya atıfta bulundum, ancak orada verilen çözüm benim için işe yaramıyor gibi görünüyor
md1hunox

Görüntüyü RGB'den BGR'ye dönüştürmeniz gerektiğini düşünüyorum. çalışıp çalışmadığını kontrol edin.
Froyo

Yanıtlar:


163

bunu kullan:

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
Teşekkürler, lütfen son satırın ne yaptığını ayrıntılı olarak açıklar mısınız?
md1hunox

17
'De olduğu gibi, 3 boyutlu bir dizi ile temsil edilen bir RGB görüntünüz var ex = numpy.array([ [ [1, 2, 3], [4, 5, 6] ], [ [7, 8, 9], [0, 1, 2] ] ]). Öyleyse ex[0]görüntünüzün ex[0][0]ilk satırı, ilk satırın ilk sütunu ex[0][0][0], ilk pikselin kırmızı bileşeni ex[0][0][1], yeşil bileşen ve ex[0][0][2]mavi bileşendir. Görünüşe göre bir BGR görüntüsüne (RGB'nin ters sırası) ihtiyacınız olduğundan, bir pikseli tanımlayan her bir öğeyi içinde olduğu gibi ters çevirirsiniz ex[0][0][::-1]. Son satır (yararsız olanlar hariç .copy) tüm görüntü için bu işlemin eşdeğeridir.
mmgp

16
Yalnızca küçük bir performans artışı olabilir, ancak cv2.cvtColor(open_cv_image, cv2.cv.CV_BGR2RGB) biraz daha etkilidir.
GuillaumeDufay

Cevabınızda .convert ('RGB') işlevinin amacı neydi? 16 bitlik gri tonlamalı bir görüntü ile çalışıyorum (görüntü modu = I; 16) .. şimdiye kadar nparray, görüntüyü tek bir PIL.Image nesnesi olarak tutuyor. (yani, yalnızca bir girişi olan bir dizi, orijinal PIL.Image)
user391339

3
Görüntü ikiliyse (örneğin, taranmış ikili TIF), o zaman numpy dizisi olacaktır boolve bu nedenle OpenCV ile kullanamazsınız. Bu durumda, bunu OpenCV maskesine dönüştürmeniz gerekir:if image.dtype == bool: image = image.astype(np.uint8) * 255
Maksym Ganenko

90

Bu bulabildiğim en kısa sürüm, fazladan bir dönüşümü kaydedip / gizleyerek:

pil_image = PIL.Image.open('image.jpg')
opencvImage = cv2.cvtColor(numpy.array(pil_image), cv2.COLOR_RGB2BGR)

Bir URL'den bir dosya okuyorsanız:

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
import requests response = requests.get(url) opencvImage = imdecode(np.asarray(bytearray(response.content)), 1)
Lior

4
pil imajını tekrar mat'a nasıl dönüştürebilirim?

cevabınız bu hatayı döndürür: OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor
Färid Alijani

İşler. Neden python dünyasındaki herkes ithalatlarını belirtmiyor?
pscheit
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.