2016-04-28 89 views
2

我有一個測量數據文本文件,看起來像這樣。座標值爲圖像

x y z 
1 3 -2 
2 1 -3 
3 1 1 
2 2 3 
1 2 2 
2 3 0 

這將意味着在以下測量(上一個x,y網格)

-2 0 
2 3 
    -3 1 

我想創建從這些值的圖像,其中沒有測量將意味着該圖像是透明的。如果可能的話,我想將z值(從例如-9.4到+3.2)映射到一個顏色映射表,比如colormap.jet

我試圖用Python Image Library和putpixel來做這個,但是這很緩慢,我相信必須有更好的方式來做到這一點。

我當前的代碼: 基本路徑= os.path.dirname(os.path.realpath(文件))#定義了當前文件駐留 srcFiles = glob.glob( '* PTS。')的目錄

在srcFiles

爲文件名:

data = pd.read_csv(os.path.join(basePath, fileName), names=['x', 'y', 'z'], delim_whitespace=True) 

print fileName 
maxX = data.x.max() 
minX = data.x.min() 
maxY = data.y.max() 
minY = data.y.min() 
minZ = data.z.min() 
maxZ = data.z.max() 

width = maxX-minX 
height = maxY-minY 

img = Image.new('L', (int(width), int(height))) 


for x in range(int(width)): 
    for y in range(int(height)): 
     value = data[(data['x'] == (minX+x)) & (data['y'] == (minY+y))]['z'] 
     if len(value) == 0: 
      value = 99.; 

     img.putpixel((x,y),int(value)) 

img.save('test.png') 

回答

2

也許你應該只使用一個numpy的矩陣來處理圖像。我沒有做你已經擁有的csv閱讀部分。蒙面陣列讓你擁有透明像素。

import numpy as np 
import matplotlib.pyplot as plt 

INPUT = np.array(
[[1, 3, -2] 
,[2, 1, -3] 
,[3, 1, 1] 
,[2, 2, 3] 
,[1, 2, 2] 
,[2, 3, 0]]) 

# get ranges 
xmin = INPUT[:,0].min() 
xmax = INPUT[:,0].max() 
ymin = INPUT[:,1].min() 
ymax = INPUT[:,1].max() 
zmin = INPUT[:,2].min() 
zmax = INPUT[:,2].max() 

# create array for image : zmax+1 is the default value 
shape = (xmax-xmin+1,ymax-ymin+1) 
img = np.ma.array(np.ones(shape)*(zmax+1)) 

for inp in INPUT: 
    img[inp[0]-xmin,inp[1]-ymin]=inp[2] 

# set mask on default value 
img.mask = (img==zmax+1) 

# set a gray background for test 
img_bg_test = np.zeros(shape) 
cmap_bg_test = plt.get_cmap('gray') 
plt.imshow(img_bg_test,cmap=cmap_bg_test,interpolation='none') 

# plot 
cmap = plt.get_cmap('jet') 
plt.imshow(img,cmap=cmap,interpolation='none',vmin=zmin,vmax=zmax) 
plt.colorbar() 

plt.imsave("test.png",img) 
plt.show() 
plt.close() 

output 注意,只要你想這不會告發T爲用3×像素有趣imsave不保存數字我在這裏展示,但形象。