2014-10-31 11 views
12

Benzer sorular için arama yaptım, ancak çoğu çözüm OpenCV'nin eski sürümlerini kullandığı için yardımcı olmadı.Bir python numpy dizisi Opencv 2.4 ile bir RGB görüntüye nasıl dönüştürülür?

3D numpy dizim var ve OpenCV (cv2) kullanarak bir BGR görüntüsü olarak görüntülemek ve/veya kaydetmek istiyorum. Kısa bir örnek olarak

, ben varsayalım:

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

Bu işe yaramazsa: Ben yapmak istiyorum ne

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 

benzer bir renk görüntüsü olarak b kaydetmek ve ekran olduğunu Muhtemelen b veri türü doğru olmadığı için, ancak büyük aramadan sonra, doğru olanı nasıl değiştireceğimi anlayamıyorum. Herhangi bir işaretçi sunabilirseniz, çok takdir edilecektir!

+0

Teşekkür! Ancak, bu sorudaki konu, posterin imshow() 'da bir argümanı unutmasıdır. Benim sorunum, 'imshow'/'imwrite', yukarıda oluşturulan numpy dizisini almayacaktır. – jmanring220

+0

"BGR" veya "RGB" olarak kaydetmek istiyor musunuz? Başlık ve soru ikisine de sahip. – jmunsch

+0

@ jmanring220 Evet, ancak yanıtlar, numpy dizisini mat olarak nasıl dönüştüreceğinizi gösterir. – beaker

cevap

3

görüntüleri c, d, şu gösteri colorspace dönüşümde e ve f onlar da numpy diziler <type 'numpy.ndarray'> olmak olur:

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) 

fazla bilgi için buraya bakınız: http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#cvtcolor

VEYA yapabildin :

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

Sen OpenCV 0 çünkü Mat için numpy diziden dönüştürmek gerekmezmodülü, numpy dizisini kabul edebilir. Dikkat etmeniz gereken tek şey, {0,1} 'nin {0,255} ile eşleştirilmesi ve numpy dizisindeki 1'den büyük herhangi bir değerin 255'e eşit olmasıdır. Bu nedenle, kodunuzda aşağıda gösterildiği gibi 255'e bölün.

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

Sen scipy.misc.toimage arıyoruz: comment @beaker için

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

Bu, scipy 0.18.0 –

+0

@AlexKreimer'de mevcut görünmüyor: http://docs.scipy.org/doc/scipy-0.18.0/reference/generated/scipy.misc.toimage.html –