2014-10-31 18 views
12

Tôi đã tìm kiếm các câu hỏi tương tự, nhưng không tìm thấy bất kỳ điều gì hữu ích vì hầu hết các giải pháp đều sử dụng các phiên bản OpenCV cũ hơn.Làm thế nào để chuyển đổi một mảng numpy python sang một hình ảnh RGB với Opencv 2.4?

Tôi có một mảng hình khối 3D, và tôi muốn hiển thị và/hoặc lưu nó dưới dạng hình ảnh BGR bằng cách sử dụng OpenCV (cv2).

Như một ví dụ ngắn, giả sử tôi có:

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 

Những gì tôi muốn làm là lưu và hiển thị b như một hình ảnh màu sắc tương tự như:

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

này không hoạt động , có lẽ vì kiểu dữ liệu của b là không chính xác, nhưng sau khi tìm kiếm đáng kể, tôi không thể tìm ra cách thay đổi nó thành đúng. Nếu bạn có thể cung cấp bất kỳ con trỏ, nó sẽ được đánh giá rất nhiều!

+0

Cảm ơn @beaker bình luận! Tuy nhiên, vấn đề trong câu hỏi đó là poster đã quên một đối số trong 'imshow()'. Vấn đề của tôi là 'imshow' /' imwrite' sẽ không lấy mảng numpy như đã tạo ở trên. – jmanring220

+0

Bạn có muốn lưu nó dưới dạng 'BGR' hoặc' RGB' không? Tiêu đề và câu hỏi có cả hai. – jmunsch

+0

@ jmanring220 Có, nhưng các câu trả lời vẫn cho thấy cách chuyển đổi mảng numpy thành mat. – beaker

Trả lời

3

Những hình ảnh c, d, đ, e trong việc chuyển đổi chương trình vùng màu sau họ cũng xảy ra được mảng 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) 

Xem ở đây để biết thêm: http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#cvtcolor

Hoặc bạn có thể :

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

Bạn không cần phải chuyển đổi từ numpy mảng thành Mat vì OpenCV 0 Mô-đuncó thể chấp nhận mảng numpy. Điều duy nhất bạn cần quan tâm là {0,1} được ánh xạ tới {0,255} và bất kỳ giá trị nào lớn hơn 1 trong numpy mảng bằng 255. Vì vậy, bạn nên chia cho 255 trong mã của mình, như được hiển thị bên dưới.

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

Bạn đang tìm kiếm scipy.misc.toimage:

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

Điều này dường như không tồn tại trong scipy 0.18.0 –

+0

@AlexKreimer: http://docs.scipy.org/doc/scipy-0.18.0/reference/generated/scipy.misc.toimage.html –

Các vấn đề liên quan