2017-06-23 56 views
1

我正在嘗試使用散點圖來繪製圖像數據。這聽起來可能很愚蠢,但我希望能夠將它擴展到3維,以便嘗試查看3維。使用散點圖顯示圖像

當我做

pylab.imshow(my_img, cmap=pylab.cm.gist_yarg) 

我沒有問題看到我的形象。但是,當我嘗試

ax.scatter(np.arange(my_img.shape[0]), 
      np.arange(my_img.shape[1]), 
      c=my_img, cmap=plt.cm.gist_yarg) 

我得到大多是黑色的像素。爲什麼是這樣?有沒有辦法做到這一點?

回答

2

scatter()函數爲您傳遞的數組中的每對值繪製一個點,分別爲xy參數。在你的例子中,這些數組的值將是[0, 1, 2, ..., my_img.shape[0]-1][0, 1, 2, ..., my_img.shape[1]-1]。充其量,這將繪製一條對角線,並且如果xy的大小不相同(即,您的圖像不是方形),則scatter()應該拋出錯誤x and y must be the same size

爲了繪製圖像中的所有像素,必須通過scatter()每個像素的座標。獲取數組中每個元素的座標的一種方法是從numpy得到的indicies()命令。您只需要最外側值的索引,而不是每個像素存儲的RGB值,因此只傳遞該形狀的前兩個值。

y, x = np.indices(my_img.shape[:2]) 

現在xy是2- d陣列,它們表示2-d的圖像中的每個點的座標。

您需要做的另一件事是重塑圖像數組,使其具有維度Nx3,其中N是圖像中像素總數的長度。這是通過數組的.reshape()方法完成的。

colors = my_img.reshape((-1,3)) 

-1通過重塑告訴reshape()自動計算該維度,所以你不必明確地傳遞給它的像素數。

現在scatter()命令是:

ax.scatter(x, y, c=colors) 
ax.invert_yaxis() #make y=0 appear at the top, similar to imshow() 

最後,你要申請一個彩色地圖。如果您將RGB值傳遞給顏色,則scatter()imshow()將忽略cmap參數。您必須將RGB值轉換爲單個值,如matplotlib Image tutorial中所示。

注意:以這種方式繪製圖很慢,可能不適合大圖像!

+1

非常好的答案。但它隱含地假設圖像具有多個顏色通道,並且散射中的顏色將對應於圖像中的顏色。看到這個問題使用了色彩映射,我認爲可以認爲這裏的圖像是一個簡單的二維數組,使得解決方案變得更加容易,'y,x = np.indices(my_img.shape); ax.scatter(x,y,c = my_img)'。 – ImportanceOfBeingErnest