X-Git-Url: http://git.tomasm.cz/imago.git/blobdiff_plain/10466a9c920f1d67bf85d85af671bcb8e5fbd533..04fed003945a46c6399db7eb94e81f2b215b87a8:/gridf.py?ds=sidebyside diff --git a/gridf.py b/gridf.py index 17be372..50beb81 100644 --- a/gridf.py +++ b/gridf.py @@ -1,8 +1,9 @@ import Image, ImageDraw, ImageFilter -from manual import lines as g_grid, l2ad +from manual import lines as g_grid, l2ad, intersection, line as g_line from intrsc import intersections_from_angl_dist from linef import line_from_angl_dist +import pcf class GridFittingFailedError(Exception): pass @@ -32,15 +33,62 @@ class V(): def t(self): return (self.x, self.y) + def normal(self): + return V(-self.y, self.x) + +def projection(point, line, vector): + n = vector.normal() + l2 = g_line(point.t(), (point + n).t()) + return V(*intersection(l2, g_line(*line))) + +def error_surface(lines, a, b, c, d, hough, size, v1): + import matplotlib.pyplot as plt + from matplotlib import cm + import time + import pickle + X = [] + Y = [] + Z = [] + s = 0.001 + k = 200 + for i in range(-k, k): + X.append(range(-k, k)) + Y.append(2*k*[i]) + + start = time.time() + for x in range(0, 2*k): + try: + Z.append([distance(lines, get_grid(a + X[x][y] * s * v1, b + Y[x][y] * s * v1, + c, d, hough, size), + size) for y in range(0, 2* k)]) + except Exception: + Z.append(Z[-1]) + o = ((time.time() - start) * (2 * k - (x + 1))) / (60 * (x + 1)) + print x + 1, "{0} h {1:2.2f} m".format(int(o) / 60, o % 60) + s_file = open('surface' + str(k), 'w') + pickle.dump((X, Y, Z), s_file) + s_file.close() + plt.imshow(Z, cmap=cm.gnuplot2, interpolation='bicubic', + origin='upper', extent=(-k, k, -k, k), aspect='equal') + plt.colorbar() + + plt.show() + def find(lines, size, l1, l2, bounds, hough, do_something): a, b, c, d = [V(*a) for a in bounds] l1 = line_from_angl_dist(l1, size) l2 = line_from_angl_dist(l2, size) v1 = V(*l1[0]) - V(*l1[1]) v2 = V(*l2[0]) - V(*l2[1]) + a = projection(a, l1, v1) + b = projection(b, l1, v1) + c = projection(c, l2, v2) + d = projection(d, l2, v2) grid = get_grid(a, b, c, d, hough, size) dist = distance(lines, grid, size) print dist + + #error_surface(lines, a, b, c, d, hough, size, v1) s = 0.02 while True: @@ -87,6 +135,7 @@ def get_grid(a, b, c, d, hough, size): l1 = hough.lines_from_list([a.t(), b.t()]) l2 = hough.lines_from_list([c.t(), d.t()]) c = intersections_from_angl_dist([l1, l2], size, get_all=True) + #TODO do something when a corner is outside the image corners = (c[0] + c[1]) if len(corners) < 4: print l1, l2, c @@ -100,19 +149,21 @@ def distance(lines, grid, size): for line in sum(lines, []): dr_l.line(line_from_angl_dist(line, size), width=1, fill=255) im_l = im_l.filter(MyGaussianBlur(radius=3)) - # GaussianBlur is undocumented class, may not work in future versions of PIL + #GaussianBlur is undocumented class, may not work in future versions of PIL im_g = Image.new('L', size) dr_g = ImageDraw.Draw(im_g) for line in grid[0] + grid[1]: dr_g.line(line, width=1, fill=255) - im_d, distance = combine(im_l, im_g) + #im_g = im_g.filter(MyGaussianBlur(radius=3)) + #im_d, distance = combine(im_l, im_g) + distance = pcf.combine(im_l.tostring(), im_g.tostring()) return distance def combine(bg, fg): bg_l = bg.load() fg_l = fg.load() - res = Image.new('L', fg.size) - res_l = res.load() + #res = Image.new('L', fg.size) + #res_l = res.load() score = 0 area = 0 @@ -120,8 +171,9 @@ def combine(bg, fg): for x in xrange(fg.size[0]): for y in xrange(fg.size[1]): if fg_l[x, y]: - res_l[x, y] = bg_l[x, y] + #res_l[x, y] = bg_l[x, y] * fg_l[x, y] score += bg_l[x, y] area += 1 - return res, float(score)/area + #return res, float(score)/area + return None, float(score)/area