+"""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
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]
#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
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:
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]]]
###
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")
###
#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
import sys
import os
-import math
import argparse
try:
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")
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:
return 0
-class imsave():
+class Imsave():
def __init__(self, saving_dir):
self.saving_dir = saving_dir
self.saving_num = 0
-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)
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 = []
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):
"""Manual grid selection module"""
import pygame
-import Image, ImageDraw
+import ImageDraw
from math import atan, sin, cos, pi, sqrt, acos, copysign
class UserQuitError(Exception):
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()
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 = []
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]))