Automatic commit. Thu Aug 23 16:00:08 WST 2012
[matches/honours.git] / research / TCS / pressure / process_digits.py
1 #! /usr/bin/python
2
3 from PIL import Image
4 import Image, ImageDraw
5 import sys
6 import numpy
7
8
9
10
11 def PixelGood(pixel, threshold):
12         #print str(pixel)
13         return GreyScale(pixel) < threshold;
14         #return (pixel[1] > (pixel[0] + pixel[2]) and pixel[1] > threshold)
15
16 def rect_size(e):
17         return (e[3] - e[1]) * (e[2] - e[0])
18
19 def GreyScale(pixel):
20         greyscale = 0
21         for i in range(0, len(pixel)):
22                 greyscale += pixel[i]
23         greyscale = greyscale / len(pixel)
24         return greyscale
25
26 def SubDivide(pix, bounds, fill_fraction=0.1, threshold=200, seperation=4, min_area=250):
27         rect = []
28
29         xStart = bounds[2]
30         xEnd = bounds[0]
31         yStart = bounds[3]
32         yEnd = bounds[1]
33         xLast = bounds[0]
34         good = 0
35         for x in range(bounds[0], bounds[2]):
36                 for y in range(bounds[1], bounds[3]):
37                         if PixelGood(pix[x, y], threshold):
38                                 if (x - xLast) > seperation:
39                                         if ((xEnd - xStart) * (yEnd - yStart) > min_area):
40                                                 rect.append([xStart, yStart, xEnd, yEnd])
41                                                 
42                                         xStart = bounds[2]
43                                         xEnd = bounds[0]
44                                         yStart = bounds[3]
45                                         yEnd = bounds[1]
46                                         good = 0
47
48                                 if (x < xStart):
49                                         xStart = x
50                                 if (y < yStart):
51                                         yStart = y
52                                 if (x > xEnd):
53                                         xEnd = x
54                                 if (y > yEnd):
55                                         yEnd = y
56                                 xLast = x
57                                 good += 1
58
59         rect.append([xStart, yStart, xEnd, yEnd])
60
61         return rect
62
63 def GoodFraction(pix, bounds,threshold=200):
64         good = 0
65         for x in range(int(bounds[0]), int(bounds[2])):
66                 for y in range(int(bounds[1]), int(bounds[3])):
67                         if PixelGood(pix[x, y], threshold):
68                                 good += 1       
69
70         return float(good) / float(int(bounds[2] - bounds[0])*int(bounds[3] - bounds[1]))
71
72 def PickDigit(pix, r):
73
74         # top, mid, bot, ltop, lbot, rtop, rmid
75         d = {
76                 "1111011" : 9,
77                 "1111111" : 8,
78                 "1000011" : 7,
79                 "1111101" : 6,
80                 "1111001" : 5,
81                 "0101011" : 4,
82                 "1110011" : 3,
83                 "1110110" : 2,
84                 "0000011" : 1,
85                 "1011111" : 0
86         }
87
88         w = r[2] - r[0]
89         h = r[3] - r[1]
90
91         if (w < 0.3 * h):
92                 return 1
93
94         
95         top = GoodFraction(pix,(r[0], r[1], r[0]+w, r[1]+0.15*h)) # Top
96         mid = GoodFraction(pix,(r[0], r[1]+0.45*h, r[0]+w, r[1]+0.55*h)) # Middle
97         bot = GoodFraction(pix,(r[0], r[1]+0.9*h, r[0]+w, r[1]+h)) # Bottom
98         ltop = GoodFraction(pix,(r[0], r[1], r[0]+0.4*w, r[1]+0.5*h)) # Left Top
99         lbot = GoodFraction(pix,(r[0], r[1]+0.5*h, r[0]+0.4*w, r[1]+h)) #Left Bottom
100         rtop = GoodFraction(pix,(r[0]+0.6*w, r[1],r[0]+w, r[1]+0.5*h)) # Right Top
101         rbot = GoodFraction(pix,(r[0]+0.6*w, r[1]+0.5*h, r[0]+w, r[1]+h)) # Right Bottom
102
103         filled = ""
104         
105         fraction = 0.42
106         for f in [top,mid,bot,ltop,lbot,rtop,rbot]:
107                 if f > fraction:
108                         filled += "1"
109                 else:
110                         filled += "0"
111         
112         
113
114         
115                 #Check where the boxes are
116         """
117         img = Image.new("RGB", (r[2]-r[0], r[3]-r[1]), "white")
118         draw = ImageDraw.Draw(img)
119         for x in range(r[0], r[2]):
120                 for y in range(r[1], r[3]):
121                         draw.rectangle((x-r[0], y-r[1], x-r[0], y-r[1]), fill=pix[x, y], outline=None)
122
123         boxes = []
124         boxes.append((0, 0, w, 0.15*h)) # Top
125         boxes.append((0, 0.45*h, w, 0.55*h)) # Middle
126         boxes.append((0, 0.9*h, w, h)) # Bottom
127         boxes.append((0, 0, 0.4*w, 0.5*h)) # Left Top
128         boxes.append((0, 0.5*h, 0.4*w, h)) # Left Bottom
129         boxes.append((0.6*w, 0, w, 0.5*h)) # Right Top
130         boxes.append((0.6*w, 0.5*h, w, h)) # Right Bottom
131         for box in boxes:
132                 draw.rectangle(box, fill=None, outline="blue")
133         img.show()
134         
135
136         print("I think this is a " + str(d[filled]))
137         """
138         return d[filled]
139 def Process(fileName):
140         
141         results = []
142         image = Image.open(fileName)
143         pix = image.load()              
144         rect = SubDivide(pix, (0, 0, image.size[0], image.size[1]))                     
145         #print "Found " + str(len(rect)) + " rectangles"
146         #test = Image.new("RGB", image.size, "white")
147         #test.paste(image)
148         #draw1 = ImageDraw.Draw(test)
149         #for i in range(0, len(rect)):
150         #       draw1.rectangle(rect[i], fill=None, outline="red")
151                 
152
153                 #img = Image.new("RGB", (rect[i][2]-rect[i][0], rect[i][3]-rect[i][1]), "white")
154                 #draw2 = ImageDraw.Draw(img)
155                 #for x in range(rect[i][0], rect[i][2]):
156                 #       for y in range(rect[i][1], rect[i][3]):
157                 #               draw2.rectangle((x-rect[i][0], y-rect[i][1], x-rect[i][0], y-rect[i][1]), fill=pix[x, y], outline=None)
158                 #img.show()
159
160         #test.show()
161         
162         for r in rect:
163                 results.append(PickDigit(pix, r))               
164         return results
165
166 def PixToList(pix, bounds):
167         a = []
168         for x in range(bounds[0], bounds[2]):
169                 a.append([])
170
171         for x in range(bounds[0], bounds[2]):
172                 for y in range(bounds[1], bounds[3]):
173                         
174                         a[x - bounds[0]].append(GreyScale(pix[x, y]))
175                         #print(str(x) + "," + str(y), len(fft[x - bounds[0]]))
176                         #print(str(fft[x - bounds[0]][y - bounds[1]]))
177         return a
178
179         
180 if __name__ == "__main__":
181         
182         if (len(sys.argv) != 2):
183                 print("Usage " + str(sys.argv[0]) + " input_image")
184
185         
186
187                 
188         #sys.exit(0)
189         r = Process(sys.argv[1])
190         print(str(r[0]) + "." + str(r[1]) + str(r[2]) + "e-"  + str(r[3]))
191
192
193         sys.exit(0)
194
195
196

UCC git Repository :: git.ucc.asn.au