চিত্রটিকে পিআইএল থেকে ওপেনসিভি ফর্ম্যাটে রূপান্তর করুন


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

তবে আমি মনে করি চিত্রটি সিভি ফর্ম্যাটে রূপান্তরিত হচ্ছে না। উইন্ডোটি আমাকে একটি বৃহত্তর বাদামী চিত্র দেখায়। আমি কোথা থেকে ইমেজ রূপান্তর ভুল যাচ্ছি PILকরার CVবিন্যাস?

এছাড়াও, আমাকে cv.cvফাংশনগুলি অ্যাক্সেস করতে টাইপ করতে হবে কেন ?


সম্ভাব্য সদৃশ: স্ট্যাকওভারফ্লো.com
টিম

আপনি উল্লিখিত প্রশ্নটি আমি উল্লেখ করেছি, তবে সেখানে প্রদত্ত সমাধানটি আমার পক্ষে কাজ করে বলে মনে হচ্ছে না
md1hunox

আমি মনে করি আপনাকে আরজিবি থেকে বিজিআরে রূপান্তর করতে হবে। এটি কাজ করে কিনা পরীক্ষা করুন।
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() 

4
ধন্যবাদ, আপনি কি আমাকে দয়া করে ব্যাখ্যা করতে পারবেন শেষ লাইনটি বিস্তারিতভাবে কী করে?
md1hunox

17
আপনি, একটি আরজিবি ছবিটি একটি 3d অ্যারের দ্বারা প্রতিনিধিত্ব আছে 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) পুরো চিত্রটির জন্য এই অপারেশনটির সমতুল্য।
এমএমজিপি

16
এটি কেবল সামান্য পারফরম্যান্সের উন্নতি হতে পারে তবে cv2.cvtColor(open_cv_image, cv2.cv.CV_BGR2RGB) এটি আরও কিছুটা দক্ষ।
গিলিয়ামডুফে

আপনার উত্তরে। কনভার্টের ('আরজিবি') উদ্দেশ্য কী ছিল? আমি একটি 16 বিট গ্রেস্কেল চিত্রের সাথে কাজ করছি (চিত্র মোড = আমি; 16) .. এখনও অবধি এনপ্যারে চিত্রটিকে একক পিআইএল.আইমেজ অবজেক্ট হিসাবে রাখছে। (অর্থাত্‍, কেবলমাত্র একটি প্রবেশদ্বার সহ একটি অ্যারে, মূল পিআইএল। চিত্র)
ব্যবহারকারী 39131339

4
যদি চিত্রটি বাইনারি হয় (উদাহরণস্বরূপ, স্ক্যান করা বাইনারি TIF), তবে অদ্ভুত অ্যারে হবে boolএবং তাই আপনি এটি ওপেনসিভি দিয়ে ব্যবহার করতে সক্ষম হবেন না। এই ক্ষেত্রে আপনাকে এটিকে if image.dtype == bool: image = image.astype(np.uint8) * 255
ওপেনসিভি

89

এটি আমার খুঁজে পাওয়া সংক্ষিপ্ততম সংস্করণ, একটি অতিরিক্ত রূপান্তর সংরক্ষণ / লুকিয়ে রাখা:

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

যদি কোনও ইউআরএল থেকে ফাইল পড়ছেন:

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)

4
যদি ইউআরএল থেকে ডাউনলোড করা হয় তবে আমি সাথে যাব:import requests response = requests.get(url) opencvImage = imdecode(np.asarray(bytearray(response.content)), 1)
লাইয়ার

4
আমি কীভাবে পাইল চিত্রটিকে আবার মাদুরে রূপান্তর করব?

আপনার উত্তরটি এই ত্রুটিটি ফিরিয়ে দেয়: OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor
ফ্রিদ আলিজানী

কাজ করে। অজগর বিশ্বের সবাই কেন তার আমদানি বর্ণনা করে না?
pscheit
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.