::-- hoxide [2005-07-29 19:19:46]

## PIL

### 例子

#### 用PIL+Numarray处理图像

• 建模竞赛题, 读入图像搜索边界, 重构三维模型. 使用了 PIL NumArray GNUPlot

```   1 import Image
2 from numarray import array
3 from Gnuplot import Gnuplot
4 from math import ceil
5
6 imsize = (512, 512)
7 drt = (( 0,  1), (  1,  1), (  1,  0), (  1, -1),
8        ( 0, -1), ( -1, -1), ( -1,  0), ( -1,  1))
9 drt = array(drt)
10
11 def dofile(file, z):
12     im = Image.open(file)
13     a = im.getdata()
14     a = array(a).resize(*imsize)
15     r = list()
16     for i in xrange(imsize[0]):
17         for j in xrange(imsize[1]):
18             for dx, dy in drt:
19                 if ( i+dx>=0 and i+dx < imsize[0] and
20                      j+dy>=0 and j+dy < imsize[1] and
21                      a[i][j] != a[i+dx][j+dy]):
22                     r.append((i, j, z))
23     return r
24
25 def ddfile(file, z):
26     im = Image.open(file)
27     a = im.getdata()
28     a = array(a).resize(*imsize)
29     r = getedge(a, z)
30     return r
31
32 def getedge(a, z):
33     imsize = a.shape
34     r = list()
35     try:
36         for i in xrange(imsize[0]):
37             for j in xrange(imsize[1]):
38                 if (a[i,j] == 0):
39                     #print i,j
40                     raise StopIteration
41     except StopIteration:
42         r.append((i,j, z))
43     if len(r)==0 :
44         return None
45     nd = 0
46     x, y = i, j
47     r.append((z, x, y))
48     while True:
49         for d in xrange(8):
50             dd = (nd+d) %8
51             if a[x+drt[dd][0], y + drt[dd][1]] == 0:
52                 r.append((x, y, z))
53                 x, y = (x, y) + drt[dd]
54                 nd = (dd + 4 +1) %8
55                 break
56         if x == i and y == j:
57             break
58     return r
59
60
61 def out(ofp):
62     np = 30
63     for i in xrange(100):
64         fname = 'abmp/'+str(i)+'.bmp'
65         r = ddfile(fname, i)
66         l = len(r)
67         step = (l-1.0)/np
68         for i in xrange(np):
69             x, y, z = r[int(step*i)]
70             ofp.write("%d\t%d\t%d\n"%(z, y, x))
71         x, y, z = r[0]
72         ofp.write("%d\t%d\t%d\n"%(z, y, x))
73         ofp.write("\n")
74
75 def pointplot():
76     g = Gnuplot()
77     g('set pm3d')
78     g('set hidden3d')
79     g('splot [0:500] [0:500] [0:500] "oo.dat" w l')
80     raw_input("Press Enter to continue...")
81
82
83 if __name__ == '__main__':
84     ofp = open('oo.dat', 'w')
85     out(ofp)
86     ofp.close()
87     pointplot()
```

PythonImagingLibrary (last edited 2009-12-25 07:16:39 by localhost)