2017-02-09 51 views
0

我有一張圖像,我想在某些特定座標上繪製(疊加)某些點。我用zorderplt.scatter刪除matplotlib圖像周圍的空間,使用重疊散點圖以保存原始大小

我想在原始大小保存所得到的圖像在Python numpy array variable而不是脫機文件(位圖格式),因爲我想進一步處理,頂部的散點圖這個圖像,而無需重新閱讀它。

我的想法是,這將是更快的疊加後的圖像保存到numpy array variable(在RGB圖像格式 - (height,width,channels))在Python,而不是使用plt.savefig,然後用cv2.imread再次重新讀取圖像,然後做必要的後續處理。

速度對我而言是一個重要因素。

我試圖設置軸界限,àxis.('off')fig.tight_layout(pad=0),`bbox_inches = 0 /「緊」,以擺脫在我的疊加後的圖像的任何結尾間隔,但是:

  1. 仍有如果使用plt.savefig
  2. 在我的圖像拖尾灰色空間(IMG時顯示帶有cv2.imshowcv2.imwrite 示出) - >在圖像周圍的空白出現

  3. 轉換爲numpy array之後的疊加圖像它沒有 原始大小。

下面的代碼,建議歡迎。所有評論的事物都代表我嘗試過並且沒有工作。我已經離開了他們,所以人們不會再提出這些建議。

import numpy as np 
import cv2 
import matplotlib.pyplot as plt 

img = cv2.imread('Lenna.png') 

h, w ,ch = np.shape(img) 

# some random coordinate points 
x = [30,40, 45, 60] 
y = [50,60, 65, 70] 

fig = plt.figure() 

# tried to set the axes, with these commands, didn't work 
#ax = plt.axes([0,0,1,1]) 
#fig_axes = fig.add_subplot(111) 


plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB), zorder=0, extent=[0,w, h, 0], interpolation="nearest") 
plt.scatter(x, y, zorder=1, facecolors='b', edgecolors='k', s=50) 

# tried to limit the axes size based on the image --> didn't work 
#plt.xlim(0,w) 
#plt.ylim(0,h) 

plt.axis('off') 

# again didn't do anything 
#fig.axes.get_xaxis().set_visible(False) 
#fig.axes.get_yaxis().set_visible(False) 


fig.tight_layout(pad=0) 
fig.canvas.draw() 

# save just for verification purpose that no space around the image is shown 
plt.savefig("test_Lenna_scatter.png", bbox_inches=0) 

# HERE I SAVE THE PLOTTED FIG IMAGE TO NUMPY ARRAY 
data_img_array = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='') 
data_img_array = data_img_array.reshape(fig.canvas.get_width_height()[::-1] + (3,)) 

# HERE I DISPLAY THE NUMPY ARRAY IMAGE AFTER SCATTER 
# ALSO PLOT ORIG IMG TO CHECK SIMILARITY 
cv2.imwrite('Lenna_scatter.png', cv2.cvtColor(data_img, cv2.COLOR_BGR2RGB)) 
cv2.imshow('Lenna Scatter', cv2.cvtColor(data_img, cv2.COLOR_BGR2RGB)) 
cv2.imshow('orig', img) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

成績

疊加後的圖像與來自plt.savefig獲得散點圖。出現一個我不想要的空白區域(如果你點擊圖片)。 overlaid image Image reconstructed numpy array

圖片plt.scatter後重建爲numpy array。用cv2.imwrite保存。注意灰色拖尾空間和不同的圖像大小。我不想要的。

+0

「無效」不是一個足夠的問題描述。在你展示的代碼中,你不要試圖將任何東西保存爲numpy數組。所以目前還不清楚你想要做什麼。請清楚說明您使用的代碼,您得到的結果以及與您的期望有多大差異。請通過[編輯]你的問題來完成。 – ImportanceOfBeingErnest

+0

'data_img'是一個numpy數組(dtype = np.uint8),它是RGB圖像。沒有任何工作 - >在此之前,我指定了我所嘗試的,我的意思是這些命令都沒有任何影響。 – Roxanne

回答

0

要在matplotlib中生成無邊框圖形,請使用plt.axes([0,0,1,1])fig.add_axes([0,0,1,1]),這將使軸線與圖形一樣大。

由於您想繪製一個帶有正方形像素的圖像,因此圖形本身必須與圖像具有相同的外觀。一個合理的方法來完成這項工作是設置figsize=(w/100.,h/100.), dpi=100其中wh是圖像的尺寸。

保存文件時,您需要選擇創建圖形時選擇的每英寸點數。其餘的應該是自我解釋。

import numpy as np 
import matplotlib.pyplot as plt 

img = plt.imread("https://i.stack.imgur.com/9qe6z.png") 
h, w ,ch = np.shape(img) 

x = [30,40, 45, 60] 
y = [50,60, 65, 70] 

fig = plt.figure(figsize=(w/100.,h/100.), dpi=100) 
ax = fig.add_axes([0,0,1,1]) 
ax.axis('off') 

ax.imshow(img, zorder=0, extent=[0,w, h, 0], interpolation="nearest") 
ax.scatter(x, y, zorder=1, facecolors='b', edgecolors='k', s=50) 

plt.savefig(__file__+".png", bbox_inches=0, dpi=100) 

img_recovered = plt.imread(__file__+".png") 
print img_recovered.shape 

在屏幕上顯示的窗口,你可能有輕微的邊界,但保存的圖像具有精確的大小與輸入圖像相同。

enter image description here