坐标到图像的值

时间:2016-04-28 09:22:51

标签: python gis python-imaging-library

我有一个包含测量数据的文本文件,如下所示。

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来做到这一点,但这非常慢,我确信必须有更好的方法来做到这一点。

我目前的代码:     basePath = os.path.dirname(os.path.realpath( file ))#定义当前文件所在的目录 srcFiles = glob.glob('*。pts')

用于srcFiles中的fileName:

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')

1 个答案:

答案 0 :(得分: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 请注意,imsave不会保存我在此处显示的图形,但是您想要的图像不会对3x3像素感兴趣。