From: Tomas Musil Date: Wed, 28 Nov 2012 17:14:54 +0000 (+0100) Subject: cleaner code X-Git-Url: http://git.tomasm.cz/imago.git/commitdiff_plain/f16fe1e775f2159741146264a6494e63b0e2d618?ds=sidebyside cleaner code --- diff --git a/geometry.py b/geometry.py index 09b0199..b8aea09 100644 --- a/geometry.py +++ b/geometry.py @@ -1,5 +1,7 @@ """Imago geometry module""" +from manual import line, intersection + class V(object): def __init__(self, x, y): self.x = x @@ -15,7 +17,7 @@ class V(object): return V(other * self.x, other * self.y) def __len__(self): - return 2; + return 2 def __getitem__(self, key): if key == 0: @@ -35,5 +37,5 @@ class V(object): def normal(self): return V(-self.y, self.x) -def projection(point, line, vector): - return V(*intersection(g_line(point, point + vector.normal), g_line(*line))) +def projection(p, l, v): + return V(*intersection(line(p, p + v.normal), line(*l))) diff --git a/gridf.py b/gridf.py index 0955d7e..d39bdd5 100644 --- a/gridf.py +++ b/gridf.py @@ -1,9 +1,11 @@ +"""Imago grid-fitting module""" + import multiprocessing import Image, ImageDraw, ImageFilter -from geometry import V -from manual import lines as g_grid, l2ad, intersection, line as g_line +from geometry import V, projection +from manual import lines as g_grid, l2ad from intrsc import intersections_from_angl_dist from linef import line_from_angl_dist import pcf @@ -19,24 +21,21 @@ class MyGaussianBlur(ImageFilter.Filter): def filter(self, image): return image.gaussian_blur(self.radius) -def projection(point, line, vector): - return V(*intersection(g_line(point, point + vector.normal), g_line(*line))) - def job_br1(args): X, Y, im_l, a, b, c, d, s, v1, v2, k, hough, size = args return [(distance(im_l, - get_grid(a + X[y] * s * v1, - b + Y[y] * s * v1, - c, d, hough, size), - size), a + X[y] * s * v1, b + Y[y] * s * v1) for y in range(2 *k)] + get_grid(a + X[y] * s * v1, + b + Y[y] * s * v1, + c, d, hough, size), + size), a + X[y] * s * v1, b + Y[y] * s * v1) for y in range(2 *k)] def job_br2(args): X, Y, im_l, a, b, c, d, s, v1, v2, k, hough, size = args return [(distance(im_l, - get_grid(a, b, c + X[y] * s * v2, - d + Y[y] * s * v2, - hough, size), - size), c + X[y] * s * v2, d + Y[y] * s * v2) for y in range(2 *k)] + get_grid(a, b, c + X[y] * s * v2, + d + Y[y] * s * v2, + hough, size), + size), c + X[y] * s * v2, d + Y[y] * s * v2) for y in range(2 *k)] def find(lines, size, l1, l2, bounds, hough, do_something, im_h): a, b, c, d = [V(*a) for a in bounds] @@ -63,7 +62,6 @@ def find(lines, size, l1, l2, bounds, hough, do_something, im_h): #error_surface(im_l, a, b, c, d, hough, size, v1 ,v2) grid = get_grid(a, b, c, d, hough, size) - dist = distance(im_l_s, grid, size) #let's try the bruteforce aproach: s = 0.001 @@ -75,13 +73,13 @@ def find(lines, size, l1, l2, bounds, hough, do_something, im_h): pool = multiprocessing.Pool(None) - tasks = [(X[x], Y[x], im_l_s, a, b, c, d, s, v1, v2, k, hough, size) for x in xrange(0, 2 * k)] + tasks = [(X[x], Y[x], im_l_s, a, b, c, d, s, + v1, v2, k, hough, size) for x in xrange(0, 2 * k)] import time start = time.time() opt_ab = pool.map(job_br1, tasks, 1) opt_cd = pool.map(job_br2, tasks, 1) - an, bn, cn, dn = 4 * [0] d1 = 0 for lst in opt_ab: for tpl in lst: @@ -96,7 +94,8 @@ def find(lines, size, l1, l2, bounds, hough, do_something, im_h): c, d = tpl[1], tpl[2] print time.time() - start grid = get_grid(a, b, c, d, hough, size) - grid_lines = [[l2ad(l, size) for l in grid[0]], [l2ad(l, size) for l in grid[1]]] + grid_lines = [[l2ad(l, size) for l in grid[0]], + [l2ad(l, size) for l in grid[1]]] ### @@ -107,12 +106,11 @@ def find(lines, size, l1, l2, bounds, hough, do_something, im_h): for y in xrange(im_t.size[1]): im_t_l[x, y] = (im_l_l[x, y], 0, 0) - im_t_d = ImageDraw.Draw(im_t) - - for l in grid[0] + grid[1]: - im_t_d.line(l, width=1, fill=(0, 255, 0)) + #im_t_d = ImageDraw.Draw(im_t) + #for l in grid[0] + grid[1]: + # im_t_d.line(l, width=1, fill=(0, 255, 0)) - do_something(im_t, "lines and grid") + #do_something(im_t, "lines and grid") ### @@ -148,5 +146,5 @@ def distance(im_l, grid, size): #im_g = im_g.filter(MyGaussianBlur(radius=3)) #GaussianBlur is undocumented class, may not work in future versions of PIL #im_d, distance = combine(im_l, im_g) - distance = pcf.combine(im_l, im_g.tostring()) - return distance + distance_d = pcf.combine(im_l, im_g.tostring()) + return distance_d diff --git a/imago.py b/imago.py index fcba0a4..66c758f 100755 --- a/imago.py +++ b/imago.py @@ -4,7 +4,6 @@ import sys import os -import math import argparse try: @@ -26,10 +25,12 @@ def main(): parser.add_argument('files', metavar='file', nargs='+', help="image to analyse") parser.add_argument('-w', type=int, default=640, - help="scale image to the specified width before analysis") - parser.add_argument('-m', '--manual', dest='manual_mode', action='store_true', + help="scale image to the specified width before analysis") + parser.add_argument('-m', '--manual', dest='manual_mode', + action='store_true', help="manual grid selection") - parser.add_argument('-d', '--debug', dest='show_all', action='store_true', + parser.add_argument('-d', '--debug', dest='show_all', + action='store_true', help="show every step of the computation") parser.add_argument('-s', '--save', dest='saving', action='store_true', help="save images instead of displaying them") @@ -53,7 +54,7 @@ def main(): image.size[1])), Image.ANTIALIAS) do_something = im_debug.show if args.saving: - do_something = imsave("saved/" + args.files[0][:-4] + "_" + + do_something = Imsave("saved/" + args.files[0][:-4] + "_" + str(image.size[0]) + "/").save if args.manual_mode: @@ -94,7 +95,7 @@ def main(): return 0 -class imsave(): +class Imsave(): def __init__(self, saving_dir): self.saving_dir = saving_dir self.saving_num = 0 diff --git a/intrsc.py b/intrsc.py index cead665..00165b1 100644 --- a/intrsc.py +++ b/intrsc.py @@ -1,7 +1,7 @@ -from math import sin, cos, tan +from math import cos, tan from operator import itemgetter -import Image, ImageDraw +import ImageDraw def board(image, lines, show_all, do_something): intersections = intersections_from_angl_dist(lines, image.size) @@ -14,12 +14,12 @@ def board(image, lines, show_all, do_something): if show_all: do_something(image_g, "intersections") - board = [] + board_r = [] for line in intersections: - board.append([stone_color(image, intersection) for intersection in + board_r.append([stone_color(image, intersection) for intersection in line]) - return board + return board_r def intersections_from_angl_dist(lines, size, get_all=False): intersections = [] @@ -27,7 +27,8 @@ def intersections_from_angl_dist(lines, size, get_all=False): line = [] for (angl2, dist2) in sorted(lines[0], key=itemgetter(1)): if abs(angl1 - angl2) > 0.4: - x = - ((dist2 / cos(angl2)) - (dist1 / cos(angl1))) / (tan(angl1) - tan(angl2)) + x = (- ((dist2 / cos(angl2)) - (dist1 / cos(angl1))) + / (tan(angl1) - tan(angl2))) y = (tan(angl1) * x) - (dist1 / cos(angl1)) if get_all or (-size[0] / 2 < x < size[0] / 2 and -size[1] / 2 < y < size[1] / 2): diff --git a/manual.py b/manual.py index e60a848..a4e94f7 100644 --- a/manual.py +++ b/manual.py @@ -1,7 +1,7 @@ """Manual grid selection module""" import pygame -import Image, ImageDraw +import ImageDraw from math import atan, sin, cos, pi, sqrt, acos, copysign class UserQuitError(Exception): @@ -14,8 +14,8 @@ class Screen: pygame.display.set_caption("Imago manual mode") self._screen = pygame.display.get_surface() - def display_picture(self, im): - pg_img = pygame.image.frombuffer(im.tostring(), im.size, im.mode) + def display_picture(self, img): + pg_img = pygame.image.frombuffer(img.tostring(), img.size, img.mode) self._screen.blit(pg_img, (0,0)) pygame.display.flip() @@ -31,7 +31,7 @@ def find_lines(im_orig): hoshi = lambda c: draw.ellipse((c[0] - 1, c[1] - 1, c[0] + 1, c[1] + 1), fill=(255, 64, 64)) corners = [] - color=(64, 64, 255) + color = (64, 64, 255) line_width = 1 lines_r = [] @@ -94,8 +94,8 @@ def _lines(corners, n): c = intersection(line(x[0], corners[2]), line(corners[1], corners[3])) d = intersection(line(corners[0], corners[3]), line(corners[1], corners[2])) if d: - l = (intersection(line(corners[0], corners[1]), line(c,d)), - intersection(line(corners[2], corners[3]), line(c,d))) + l = (intersection(line(corners[0], corners[1]), line(c, d)), + intersection(line(corners[2], corners[3]), line(c, d))) else: lx = line(c, (c[0] + corners[0][0] - corners[3][0], c[1] + corners[0][1] - corners[3][1]))