X-Git-Url: http://git.tomasm.cz/imago.git/blobdiff_plain/c98a7fb2507b7ba3ee5f539bb6a7e356000a7f9c..3a843a5f148dd7728130b33ef406c0de08cb4dcc:/gridf.py?ds=sidebyside diff --git a/gridf.py b/gridf.py index dcffd92..0c5b68f 100644 --- a/gridf.py +++ b/gridf.py @@ -1,7 +1,6 @@ """Imago grid-fitting module""" import multiprocessing -import itertools import Image, ImageDraw, ImageFilter @@ -38,6 +37,16 @@ def job_br2(args): get_grid([v1, v2], [h1, h2], size), size), x, y) +def job_4(args): + im_l, v1, v2, h1, h2, x, y, w, z, dv, dh, size = args + v1 = (v1[0] + x * dv, v1[1] + x) + v2 = (v2[0] + y * dv, v2[1] + y) + h1 = (h1[0] + w * dh, h1[1] + w) + h2 = (h2[0] + z * dh, h2[1] + z) + return (distance(im_l, + get_grid([v1, v2], [h1, h2], size), + size), x, y, w, z) + def find(lines, size, l1, l2, bounds, hough, do_something, im_h): l1 = line_from_angl_dist(l1, size) l2 = line_from_angl_dist(l2, size) @@ -64,18 +73,36 @@ def find(lines, size, l1, l2, bounds, hough, do_something, im_h): #GaussianBlur is undocumented class, may not work in future versions of PIL im_l_s = im_l.tostring() - #let's try the bruteforce aproach: - k = 30 - + #let's try the ULTRA bruteforce aproach: pool = multiprocessing.Pool(None) - tasks = [(im_l_s, v1, v2, h1, h2, x, y, delta_v, delta_h, size) for (x, y) in - itertools.product(xrange(-k, k), xrange(-k, k))] + #import time + #start = time.time() - opt_v = pool.map(job_br1, tasks, 8) - opt_h = pool.map(job_br2, tasks, 8) - _, x_v, y_v = max(opt_v) - _, x_h, y_h = max(opt_h) + k = 30 + tasks = [(im_l_s, v1, v2, h1, h2, x, y, w, z, delta_v, delta_h, size) + for x in xrange(-k, k, 2) + for y in xrange(-k, k, 2) + for z in xrange(-k, k, 2) + for w in xrange(-k, k, 2)] + + opt = pool.map(job_4, tasks) + _, x_v, y_v, x_h, y_h = max(opt) + + v1 = (v1[0] + x_v * delta_v, v1[1] + x_v) + v2 = (v2[0] + y_v * delta_v, v2[1] + y_v) + h1 = (h1[0] + x_h * delta_h, h1[1] + x_h) + h2 = (h2[0] + y_h * delta_h, h2[1] + y_h) + + k = 5 + tasks = [(im_l_s, v1, v2, h1, h2, x, y, w, z, delta_v, delta_h, size) + for x in xrange(-k, k) + for y in xrange(-k, k) + for z in xrange(-k, k) + for w in xrange(-k, k)] + + opt = pool.map(job_4, tasks) + _, x_v, y_v, x_h, y_h = max(opt) v1 = (v1[0] + x_v * delta_v, v1[1] + x_v) v2 = (v2[0] + y_v * delta_v, v2[1] + y_v) @@ -89,6 +116,8 @@ def find(lines, size, l1, l2, bounds, hough, do_something, im_h): pool.terminate() pool.join() + #print time.time() - start + ### Show error surface # # from gridf_analyzer import error_surface