From: Tomas Musil Date: Sat, 25 Aug 2012 15:13:12 +0000 (+0200) Subject: second hough -- better center-finding mechanism X-Git-Url: http://git.tomasm.cz/imago.git/commitdiff_plain/129886d4580041098317fa70be6f03cc731b26a0?ds=sidebyside;hp=5575c909e2d345773367d1da42149b758f7e4865 second hough -- better center-finding mechanism --- diff --git a/filters.py b/filters.py index a5d00e6..2f3c12d 100644 --- a/filters.py +++ b/filters.py @@ -103,33 +103,3 @@ def components(image): return new_image - -def half_centers(image): - image_l = image.load() - new_image = Image.new('L', image.size) - new_image_l = new_image.load() - - x_s = 0 - y_s = 0 - n = 0 - for x in range(0, image.size[0] / 2): - for y in range(0, image.size[1]): - if image_l[x, y] > 127: - x_s += x - y_s += y - n += 1 - new_image_l[x_s / n, y_s / n] = 255 - - x_s = 0 - y_s = 0 - n = 0 - for x in range(image.size[0] / 2, image.size[0]): - for y in range(0, image.size[1]): - if image_l[x, y] > 127: - x_s += x - y_s += y - n += 1 - new_image_l[x_s / n, y_s / n] = 255 - - return new_image - diff --git a/hough.py b/hough.py index f39784b..9d44bcb 100644 --- a/hough.py +++ b/hough.py @@ -46,6 +46,26 @@ class Hough: return new_image + def lines_from_list(self, p_list): + lines = [] + for p in p_list: + lines.append(self.angle_distance(p)) + return lines + + def all_lines_h(self, image): + im_l = image.load() + lines1 = [] + for x in xrange(image.size[0] / 2): + for y in xrange(image.size[1]): + if im_l[x, y]: + lines1.append(self.angle_distance((x, y))) + lines2 = [] + for x in xrange(image.size[0] / 2, image.size[0]): + for y in xrange(image.size[1]): + if im_l[x, y]: + lines2.append(self.angle_distance((x, y))) + return [lines1, lines2] + def all_lines(self, image): im_l = image.load() lines = [] diff --git a/imago.py b/imago.py index 9e1697c..cf04f53 100755 --- a/imago.py +++ b/imago.py @@ -100,7 +100,10 @@ def main(): if verbose: print >> sys.stderr, "second hough transform" - hough2 = Hough(im_h2.size) + hough2 = Hough(im_h2.size) + # im_hough might be used instead im_h2, but at the moment it brings a lot of + # noise to the second transform, which later confuses the center-finding + # mechanism (which is not very robust yet) im_hough2 = hough2.transform(im_h2) if show_all: do_something(im_hough2, "second hough transform") @@ -109,26 +112,33 @@ def main(): if show_all: do_something(im_h3, "third high pass filter") - im_h3 = filters.half_centers(im_h3) + im_h3 = filters.components(im_h3) if show_all: do_something(im_h3, "half centers") if verbose: print >> sys.stderr, "finding the grid" - lines_m = hough2.all_lines(im_h3) + lines_m = hough2.all_lines_h(im_h3) lines = [] + im_c = im_h2.convert('RGB').convert('RGB', (1, 0.5, 0.5, 0)) + draw_c = ImageDraw.Draw(im_c) - for line in lines_m: + for line_l in lines_m: im_line = Image.new('L', im_h2.size) draw = ImageDraw.Draw(im_line) - draw.line(line_from_angl_dist(line, im_h2.size), fill=255, width=5) - if show_all: - do_something(im_line, "line") - im_c = combine(im_h2, im_line) - if show_all: - do_something(im_c, "hough x lines") - lines.append(hough1.all_lines(im_c)) + line_points = set() + for line in line_l: + draw.line(line_from_angl_dist(line, im_h2.size), fill=255, width=5) + draw_c.line(line_from_angl_dist(line, im_c.size), fill=(70, 70, 70), width=5) + for p in combine(im_h2, im_line): + line_points.add(p) + for point in line_points: + draw_c.point(point, fill=(120, 255, 120)) + lines.append(hough1.lines_from_list(line_points)) + + if show_all: + do_something(im_c, "hough x lines") image_g = image.copy() draw = ImageDraw.Draw(image_g) @@ -179,14 +189,13 @@ def combine(image1, image2): im_l1 = image1.load() im_l2 = image2.load() - im_n = Image.new('L', image1.size) - im_nl = im_n.load() + on_both = [] for x in xrange(image1.size[0]): for y in xrange(image1.size[1]): if im_l1[x, y] and im_l2[x, y]: - im_nl[x, y] = 255 - return im_n + on_both.append((x, y)) + return on_both def line_from_angl_dist((angle, distance), size): x1 = - size[0] / 2 @@ -199,7 +208,7 @@ def intersections_from_angl_dist(lines, size): intersections = [] for (angl1, dist1) in sorted(lines[1], key=itemgetter(1)): line = [] - for (angl2, dist2) in lines[0]: + for (angl2, dist2) in sorted(lines[0], key=itemgetter(1)): if abs(angl1 - angl2) > 0.4: x = - ((dist2 / math.cos(angl2))-(dist1 / math.cos(angl1))) / (math.tan(angl1) - math.tan(angl2)) y = (math.tan(angl1) * x) - (dist1 / math.cos(angl1))