X-Git-Url: http://git.tomasm.cz/imago.git/blobdiff_plain/f2f525ee1484b0d7f361f9b3f0dab302a94a1d47..db4fb6da5dc88a3944352cff38cb92f68bead88c:/gridf.py?ds=inline diff --git a/gridf.py b/gridf.py index bc84ea8..23e4d04 100644 --- a/gridf.py +++ b/gridf.py @@ -3,6 +3,7 @@ import Image, ImageDraw, ImageFilter 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 @@ -15,7 +16,7 @@ class MyGaussianBlur(ImageFilter.Filter): def filter(self, image): return image.gaussian_blur(self.radius) -class V(): +class V(object): def __init__(self, x, y): self.x = x self.y = y @@ -29,16 +30,29 @@ class V(): def __rmul__(self, other): return V(other * self.x, other * self.y) - def t(self): - return (self.x, self.y) + def __len__(self): + return 2; + def __getitem__(self, key): + if key == 0: + return self.x + elif key == 1: + return self.y + elif type(key) != int: + raise TypeError("V indices must be integers") + else: + raise KeyError("V index ({}) out of range".format(key)) + + def __iter__(self): + yield self.x + yield self.y + + @property 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))) + return V(*intersection(g_line(point, point + vector.normal), g_line(*line))) def error_surface(lines, a, b, c, d, hough, size, v1): import matplotlib.pyplot as plt @@ -49,12 +63,12 @@ def error_surface(lines, a, b, c, d, hough, size, v1): Y = [] Z = [] s = 0.001 - k = 5 + k = 200 for i in range(-k, k): X.append(range(-k, k)) Y.append(2*k*[i]) - start = time.clock() + 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, @@ -62,7 +76,7 @@ def error_surface(lines, a, b, c, d, hough, size, v1): size) for y in range(0, 2* k)]) except Exception: Z.append(Z[-1]) - o = ((time.clock() - start) * (2 * k - (x + 1))) / (60 * (x + 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) @@ -131,8 +145,8 @@ def find(lines, size, l1, l2, bounds, hough, do_something): return grid, grid_lines 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()]) + l1 = hough.lines_from_list([a, b]) + l2 = hough.lines_from_list([c, d]) 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]) @@ -154,7 +168,8 @@ def distance(lines, grid, size): for line in grid[0] + grid[1]: dr_g.line(line, width=1, fill=255) #im_g = im_g.filter(MyGaussianBlur(radius=3)) - im_d, distance = combine(im_l, im_g) + #im_d, distance = combine(im_l, im_g) + distance = pcf.combine(im_l.tostring(), im_g.tostring()) return distance def combine(bg, fg):