2014-10-31 8 views
12

मैंने इसी तरह के प्रश्नों की खोज की है, लेकिन कुछ समाधान उपयोगी नहीं पाए हैं क्योंकि अधिकांश समाधान ओपनसीवी के पुराने संस्करणों का उपयोग करते हैं।ओपनसीवी 2.4 के साथ एक आरजीबी छवि में एक पायथन numpy सरणी कैसे परिवर्तित करें?

मेरे पास एक 3 डी numpy सरणी है, और मैं इसे OpenCV (cv2) का उपयोग कर बीजीआर छवि के रूप में प्रदर्शित और/या सहेजना चाहता हूं।

एक छोटी उदाहरण के रूप में, मान लीजिए मैं था:

cv2.imwrite('color_img.jpg', b) 
cv2.imshow('Color image', b) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

यह काम नहीं करता:

import numpy, cv2 
b = numpy.zeros([5,5,3]) 

b[:,:,0] = numpy.ones([5,5])*64 
b[:,:,1] = numpy.ones([5,5])*128 
b[:,:,2] = numpy.ones([5,5])*192 

मैं करना चाहते हैं क्या बचाने के लिए और प्रदर्शन ख के समान एक रंग छवि के रूप में है , संभवतः क्योंकि बी का डेटा प्रकार सही नहीं है, लेकिन पर्याप्त खोज के बाद, मैं यह नहीं समझ सकता कि इसे सही तरीके से कैसे बदला जाए। यदि आप किसी भी पॉइंटर्स की पेशकश कर सकते हैं, तो इसकी सराहना की जाएगी!

+0

टिप्पणी @beaker के लिए धन्यवाद! हालांकि, उस प्रश्न में मुद्दा यह है कि पोस्टर 'imshow() 'में एक तर्क भूल गया। मेरा मुद्दा यह है कि 'imshow'/'imwrite' ऊपर बनाए गए numpy सरणी नहीं ले जाएगा। – jmanring220

+0

क्या आप इसे 'बीजीआर' या' आरजीबी 'के रूप में सहेजना चाहते हैं? शीर्षक और प्रश्न दोनों में है। – jmunsch

+0

@ jmanring220 हां, लेकिन उत्तर अभी भी दिखाते हैं कि कैसे एक मैट में एक numpy सरणी को परिवर्तित करने के लिए। – beaker

उत्तर

3

छवियों सी, डी, ई, और निम्न शो colorspace रूपांतरण में च वे भी NumPy सरणी <type 'numpy.ndarray'> होने के लिए होती हैं:

import numpy, cv2 
def show_pic(p): 
     ''' use esc to see the results''' 
     print(type(p)) 
     cv2.imshow('Color image', p) 
     while True: 
      k = cv2.waitKey(0) & 0xFF 
      if k == 27: break 
     return 
     cv2.destroyAllWindows() 

b = numpy.zeros([200,200,3]) 

b[:,:,0] = numpy.ones([200,200])*255 
b[:,:,1] = numpy.ones([200,200])*255 
b[:,:,2] = numpy.ones([200,200])*0 
cv2.imwrite('color_img.jpg', b) 


c = cv2.imread('color_img.jpg', 1) 
c = cv2.cvtColor(c, cv2.COLOR_BGR2RGB) 

d = cv2.imread('color_img.jpg', 1) 
d = cv2.cvtColor(c, cv2.COLOR_RGB2BGR) 

e = cv2.imread('color_img.jpg', -1) 
e = cv2.cvtColor(c, cv2.COLOR_BGR2RGB) 

f = cv2.imread('color_img.jpg', -1) 
f = cv2.cvtColor(c, cv2.COLOR_RGB2BGR) 


pictures = [d, c, f, e] 

for p in pictures: 
     show_pic(p) 
# show the matrix 
print(c) 
print(c.shape) 

अधिक जानकारी के लिए देखें: http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#cvtcolor

या आप कर सकते थे :

img = numpy.zeros([200,200,3]) 

img[:,:,0] = numpy.ones([200,200])*255 
img[:,:,1] = numpy.ones([200,200])*255 
img[:,:,2] = numpy.ones([200,200])*0 

r,g,b = cv2.split(img) 
img_bgr = cv2.merge([b,g,r]) 
5

आप numpy सरणी से Mat कन्वर्ट करने के लिए क्योंकि OpenCV 0 की जरूरत नहीं हैमॉड्यूल numpy सरणी स्वीकार कर सकते हैं। केवल एक चीज जिसकी आपको देखभाल करने की आवश्यकता है वह यह है कि {0,1} को {0,255} पर मैप किया गया है और numpy सरणी में 1 से बड़ा कोई भी मान 255 के बराबर है। इसलिए आपको नीचे दिखाए गए अनुसार अपने कोड में 255 तक विभाजित करना चाहिए।

img = numpy.zeros([5,5,3]) 

img[:,:,0] = numpy.ones([5,5])*64/255.0 
img[:,:,1] = numpy.ones([5,5])*128/255.0 
img[:,:,2] = numpy.ones([5,5])*192/255.0 

cv2.imwrite('color_img.jpg', img) 
cv2.imshow("image", img); 
cv2.waitKey(); 
1

आप scipy.misc.toimage लिए देख रहे हैं:

import scipy.misc 
rgb = scipy.misc.toimage(np_array) 
+1

यह scipy 0.18.0 –

+0

@AlexKreimer में मौजूद प्रतीत नहीं होता है: http://docs.scipy.org/doc/scipy-0.18.0/reference/generated/scipy.misc.toimage.html –

संबंधित मुद्दे