छवि को पीआईएल से ओपनसीवी प्रारूप में बदलें


101

मैं छवि 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()

लेकिन मुझे लगता है कि छवि सीवी प्रारूप में परिवर्तित नहीं हो रही है। विंडो मुझे एक बड़ी भूरी छवि दिखाती है। मैं कहां से छवि परिवर्तित में गलत जा रहा हूँ PILकरने के लिए CVप्रारूप?

इसके अलावा, मुझे cv.cvफ़ंक्शन का उपयोग करने की आवश्यकता क्यों है ?


संभव डुप्लिकेट: stackoverflow.com/questions/1650568/…
टिम

मैंने आपके द्वारा बताए गए प्रश्न का उल्लेख किया है, लेकिन वहां दिए गए समाधान मेरे लिए काम नहीं करते हैं
md1hunox

मुझे लगता है कि आपको छवि को RGB से BGR में बदलने की आवश्यकता है। जाँच करें कि क्या यह काम करता है।
फरो

जवाबों:


172

इसे इस्तेमाल करो:

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

17
आपके पास आरजीबी छवि एक 3 डी सरणी द्वारा दर्शाई गई है, जैसे कि 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]नीला घटक है। चूंकि आपको स्पष्ट रूप से एक बीजीआर छवि (आरजीबी के विपरीत क्रम) की आवश्यकता होती है, आप प्रत्येक तत्व को उल्टा करते हैं जो पिक्सेल का वर्णन करता है ex[0][0][::-1]। अंतिम पंक्ति (बेकार को छोड़कर .copy) पूरी छवि के लिए इस ऑपरेशन के बराबर है।
22

16
यह केवल एक मामूली प्रदर्शन में सुधार हो सकता है, लेकिन cv2.cvtColor(open_cv_image, cv2.cv.CV_BGR2RGB) थोड़ा अधिक कुशल है।
गुइल्यूमडूफ़े

आपके उत्तर में .convert ('RGB') का उद्देश्य क्या था? मैं एक 16 बिट greyscale छवि (छवि मोड = I; 16) के साथ काम कर रहा हूं .. अब तक nparray छवि को एक PIL.Image ऑब्जेक्ट के रूप में रख रहा है। (यानी, केवल एक प्रविष्टि, मूल PIL.Image के साथ एक सरणी)
user391339

3
यदि छवि बाइनरी है (उदाहरण के लिए, स्कैन बाइनरी TIF), तो संख्यात्मक सरणी होगी boolऔर इसलिए आप इसे OpenCV के साथ उपयोग करने में सक्षम नहीं होंगे। इस मामले में आपको इसे OpenCV मास्क में बदलने की आवश्यकता है:if image.dtype == bool: image = image.astype(np.uint8) * 255
मकिस्म गनेंको

99

यह सबसे छोटा संस्करण है जिसे मैं पा सकता हूं, अतिरिक्त रूपांतरण को सहेजना / छिपा सकता है:

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)

2
अगर url से डाउनलोड किया जाता है, तो मैं इसके साथ जाऊंगा:import requests response = requests.get(url) opencvImage = imdecode(np.asarray(bytearray(response.content)), 1)
Lior

4
मैं कैसे फिर से चटाई करने के लिए पायलट छवि परिवर्तित करूँ?

ur answer ने यह त्रुटि दी: OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor
Färid Alijani

काम करता है। अजगर दुनिया में हर कोई अपने आयात को क्यों नहीं बताता है?
pscheit
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.