2014-01-06 32 views
1

我有一個大型二維數組(4000x3000)保存爲一個numpy數組,我希望顯示和保存,同時保持查看每個像素的能力。 對於顯示部分,我目前使用matplotlib imshow()函數,該函數效果很好。在Python中以全分辨率顯示和保存大型2D矩陣

對於保存部分,我不清楚如何保存此圖並保留所有12M像素中包含的信息。我嘗試調整保存圖像的圖形大小和分辨率(dpi),但不清楚應使用figsize/dpi設置來匹配顯示的大2D矩陣的分辨率。下面是我在做什麼(改編爲形狀的numpy的陣列(3000,4000))的示例代碼:

fig = pylab.figure(figsize=(16,12)) 
pylab.imshow(arr,interpolation='nearest') 
fig.savefig("image.png",dpi=500) 

一個辦法是增加保存的圖像的分辨率基本上以確保所有像素將被正確記錄,但是這具有創建尺寸非常大的圖像(至少遠大於我真正需要的4000x3000像素圖像)的顯着缺點。它也有一個缺點,就是不是所有的像素都會有完全相同的大小。

我也看了一下Python圖像庫,但我不清楚它是如何用於這個目的的,如果有的話。

任何有關這個問題的幫助將不勝感激!

+1

您是否需要保存圖像,或者只保存陣列數據本身並在以後重新創建圖像? – BrenBarn

+0

我需要保存圖像並將所有像素信息清晰地顯示在圖像中 – aurefly

回答

0

OpenCV庫專爲圖像的科學分析而設計。因此,如果沒有明確要求,圖像不會「重新採樣」圖像。要保存圖像:

import cv2 
cv2.imwrite('image.png', arr) 

其中arr是您的numpy數組。保存的圖像將與您的陣列arr的尺寸相同。

您沒有提及您使用的顏色模型。像jpegs一樣,Png通常是每個顏色通道8位。如果您要求,OpenCV將支持每個通道高達16位。

關於OpenCV imwrite的文檔是here

+0

我對顏色編碼沒有很強的限制。每種顏色8位對我來說是很好的。 感謝您指出OpenCV,我一直在努力將其安裝在OS X(Snow Leopard)上,但仍會繼續嘗試。我寧願有一個解決方案,不涉及安裝單獨的模塊,但如果有效的話,這可能會暫時伎倆。 – aurefly

0

您可以將圖像保存爲BMP:

fig.savefig("image.bmp") 
+0

我看不到bmp格式如何解決我的問題。 imshow創建的圖像(不僅具有12 Mpx矩陣,還包括軸,標籤和白色間距)可如何以位圖格式保存,同時保持3000x4000矩陣上的全分辨率。 – aurefly

0

我想我找到它的工作原理相當不錯的解決方案。我使用figimage來繪製numpy數組而不重新採樣。如果您對所創建圖形的尺寸非常小心,則可以保持您的矩陣的全分辨率,無論它有多大。

我發現figimage繪製了一個大小爲0的單個像素。01英寸(這個數字可能是依賴於系統)因此,例如下面的代碼將保存矩陣,全分辨率(改編爲形狀(3000,4000的numpy的陣列)):

rows = 3000 
columns = 4000 
fig = pylab.figure(figsize=(columns*0.01,rows*0.01)) 
pylab.figimage(arr,cmap=cm.jet,origin='lower') 
fig.savefig("image.png") 

兩個問題我仍然有與此選項:

  1. 沒有標誌指示行/列數字使得它很難知道哪些像素是除了邊緣上的那些
  2. 如果你決定以交互方式看圖像,它不可以放大/縮小

解決上述兩個問題的解決方案,如果存在的話,也是非常棒的。