2010-04-17 105 views
109

Tôi đã tạo ra một mảng thusly:Làm thế nào để chuyển đổi một mảng numpy sang (và hiển thị) một hình ảnh?

import numpy as np 
data = np.zeros((512,512,3), dtype=np.uint8) 
data[256,256] = [255,0,0] 

Những gì tôi muốn điều này làm là hiển thị một dấu chấm đỏ duy nhất trong trung tâm của một hình ảnh 512x512. (Ít nhất để bắt đầu ... Tôi nghĩ mình có thể tìm ra phần còn lại từ đó)

+1

Xem thêm http://stackoverflow.com/questions/902761/saving-a-numpy-array-as- một hình ảnh mặc dù người ta áp đặt ràng buộc mà PIL không thể được sử dụng. –

Trả lời

96

Bạn có thể sử dụng để tạo ra PIL (và hiển thị) một hình ảnh:

from PIL import Image 
import numpy as np 

w, h = 512, 512 
data = np.zeros((h, w, 3), dtype=np.uint8) 
data[256, 256] = [255, 0, 0] 
img = Image.fromarray(data, 'RGB') 
img.save('my.png') 
img.show() 
+0

Công trình này đẹp mắt. Cảm ơn bạn. – jlswint

+2

Dường như có lỗi. Bạn tạo mảng với kích thước '(w, h, 3)', nhưng nó phải là '(h, w, 3)', bởi vì việc lập chỉ mục trong PIL khác với việc lập chỉ mục ở dạng khối. Có câu hỏi liên quan: http: // stackoverflow.com/questions/33725237/image-fromarray-changes-size – user502144

+0

@ user502144: Cảm ơn bạn đã chỉ ra lỗi của tôi. Tôi nên đã tạo ra một mảng hình dạng '(h, w, 3)'. (Bây giờ nó đã được cố định, ở trên.) Chiều dài của trục đầu tiên có thể được coi là số hàng trong mảng, và chiều dài của trục thứ hai, số cột. Vì vậy, '(h, w)' tương ứng với một mảng "chiều cao" 'h' và" chiều rộng "' w'. 'Image.fromarray' chuyển đổi mảng này thành hình ảnh có chiều cao' h' và chiều rộng 'w'. – unutbu

0

Sử dụng pygame, bạn có thể mở cửa sổ, lấy bề mặt làm mảng pixel và thao tác theo ý muốn từ đó. Tuy nhiên, bạn sẽ cần phải sao chép mảng numpy của bạn vào mảng bề mặt, điều này sẽ chậm hơn nhiều so với các hoạt động đồ họa thực tế trên các bề mặt pygame.

40

con đường ngắn nhất là sử dụng scipy, như thế này:

from scipy.misc import toimage 
toimage(data).show() 

Điều này cũng cần cài đặt PIL hoặc Gối.

Một cách tiếp cận tương tự cũng đòi hỏi PIL hoặc gối nhưng mà có thể gọi một người xem khác nhau là:

from scipy.misc import imshow 
imshow(data) 
+0

Vì vậy, phương pháp này không tương thích với python 3.5 ...? – bordeo

+0

@bordeo, tại sao nó không tương thích với 3.5? Nó chỉ là một nhập khẩu và một vài cuộc gọi chức năng. –

+0

PIL không tương thích với 3.5 (sẽ không cài đặt) – bordeo

145

Bạn chỉ có nghĩa là điều này?

from matplotlib import pyplot as plt 
plt.imshow(data, interpolation='nearest') 
plt.show() 
+2

Điều này chính xác hơn PIL. PIL rescales/bình thường hóa các giá trị mảng, trong khi pyplot sử dụng các giá trị RGB thực tế như chúng. – GaryO

+2

Cảm ơn! xứng đáng với huy hiệu của câu trả lời hay nhất! –

+9

Có thể cần biết: Nếu bạn muốn hiển thị hình ảnh thang độ xám, bạn nên gọi 'plt.gray()' một lần trong mã của bạn để chuyển tất cả các đồ thị sau thành thang độ xám. Không phải những gì OP mong muốn nhưng tốt để biết tuy nhiên. – Cerno

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