From: Tomas Musil Date: Sat, 22 Sep 2012 20:50:20 +0000 (+0200) Subject: code reorganisation X-Git-Url: http://git.tomasm.cz/imago.git/commitdiff_plain/890c6fc05c289fa41d3db2f17037f3b7428151fb?hp=959b701ec1f7297cf55f2a68bac0ab23440e052e code reorganisation --- diff --git a/commons.py b/commons.py deleted file mode 100644 index fcfe469..0000000 --- a/commons.py +++ /dev/null @@ -1,7 +0,0 @@ -import os - -def clear(): - if os.name == 'posix': - os.system('clear') - elif os.name in ('ce', 'nt', 'dos'): - os.system('cls') diff --git a/greyscale_test.py b/greyscale_test.py deleted file mode 100755 index 160bc78..0000000 --- a/greyscale_test.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python - -import Image, ImageMath - -import im_debug - -im = Image.open('./image.jpg') -im_debug.show(im, 'Original image') - -im_l = im.convert('L') -im_debug.show(im_l, 'ITU-R 601-2 luma transform') - -im_rgb = im.convert('L', (float(1)/3, float(1)/3, float(1)/3, 0)) -im_debug.show(im_rgb, '(R+G+B)/3 transform') - -s1, s2 = im.size -im2 = Image.new('L', (s1 * 2, s2)) -im2.paste(im_l, (0, 0, s1, s2)) -im2.paste(im_rgb, (s1, 0, 2*s1, s2)) -im_debug.show(im2, 'Both transforms side by side') - -im_debug.show(ImageMath.eval("convert(abs(a - b)*5, 'L')", a=im_l, b=im_rgb), 'Difference') diff --git a/imago.py b/imago.py index 552a359..ea9ee6c 100755 --- a/imago.py +++ b/imago.py @@ -15,8 +15,7 @@ except ImportError, msg: sys.exit(1) import im_debug -import filters -from hough import Hough +import linef Saving_dir = '' Saving_num = 0 @@ -56,96 +55,7 @@ def main(): global Saving_dir Saving_dir = "saved/" + args.file[0][:-4] + "_" + str(image.size[0]) + "/" - if verbose: - print >> sys.stderr, "preprocessing" - - if show_all: - do_something(image, "original image") - - im_l = image.convert('L') - if show_all: - do_something(im_l, "ITU-R 601-2 luma transform") - - if verbose: - print >> sys.stderr, "edge detection" - - im_edges = filters.edge_detection(im_l) - if show_all: - do_something(im_edges, "edge detection") - - im_h = filters.high_pass(im_edges, 100) - if show_all: - do_something(im_h, "high pass filters") - - if verbose: - print >> sys.stderr, "hough transform" - - hough1 = Hough(im_h.size) - im_hough = hough1.transform(im_h) - if show_all: - do_something(im_hough, "hough transform") - - im_hough = filters.peaks(im_hough) - if show_all: - do_something(im_hough, "peak extraction") - - im_h2 = filters.high_pass(im_hough, 120) - if show_all: - do_something(im_h2, "second high pass filters") - - im_h2 = filters.components2(im_h2) - if show_all: - do_something(im_h2, "components centers") - - if verbose: - print >> sys.stderr, "second hough transform" - - 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") - - im_h3 = filters.high_pass(im_hough2, 120) - if show_all: - do_something(im_h3, "third high pass filter") - - 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_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_l in lines_m: - im_line = Image.new('L', im_h2.size) - draw = ImageDraw.Draw(im_line) - line_points = set() - for line in line_l: - draw.line(line_from_angl_dist(line, im_h2.size), fill=255, width=7) - draw_c.line(line_from_angl_dist(line, im_c.size), fill=(70, 70, 70), width=7) - 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) - for line in [l for s in lines for l in s]: - draw.line(line_from_angl_dist(line, image.size), fill=(120, 255, 120)) - if show_all: - do_something(image_g, "the grid") + lines = linef.find_lines(image, show_all, do_something, verbose) intersections = intersections_from_angl_dist(lines, image.size) image_g = image.copy() @@ -200,13 +110,6 @@ def combine(image1, image2): on_both.append((x, y)) return on_both -def line_from_angl_dist((angle, distance), size): - x1 = - size[0] / 2 - y1 = int(round((x1 * math.sin(angle) - distance) / math.cos(angle))) + size[1] / 2 - x2 = size[0] / 2 - y2 = int(round((x2 * math.sin(angle) - distance) / math.cos(angle))) + size[1] / 2 - return [(0, y1), (size[0] - 1, y2)] - def intersections_from_angl_dist(lines, size): intersections = [] for (angl1, dist1) in sorted(lines[1], key=itemgetter(1)): diff --git a/linef.py b/linef.py new file mode 100755 index 0000000..ebfdbea --- /dev/null +++ b/linef.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python + +"""Go image recognition lines-finding module""" + +import sys +import math + +try: + import Image, ImageDraw +except ImportError, msg: + print >> sys.stderr, msg + sys.exit(1) + +import filters +from hough import Hough + +def find_lines(image, show_all, do_something, verbose): + + if verbose: + print >> sys.stderr, "preprocessing" + + if show_all: + do_something(image, "original image") + + im_l = image.convert('L') + if show_all: + do_something(im_l, "ITU-R 601-2 luma transform") + + if verbose: + print >> sys.stderr, "edge detection" + + im_edges = filters.edge_detection(im_l) + if show_all: + do_something(im_edges, "edge detection") + + im_h = filters.high_pass(im_edges, 100) + if show_all: + do_something(im_h, "high pass filters") + + if verbose: + print >> sys.stderr, "hough transform" + + hough1 = Hough(im_h.size) + im_hough = hough1.transform(im_h) + if show_all: + do_something(im_hough, "hough transform") + + im_hough = filters.peaks(im_hough) + if show_all: + do_something(im_hough, "peak extraction") + + im_h2 = filters.high_pass(im_hough, 120) + if show_all: + do_something(im_h2, "second high pass filters") + + im_h2 = filters.components2(im_h2) + if show_all: + do_something(im_h2, "components centers") + + if verbose: + print >> sys.stderr, "second hough transform" + + 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") + + im_h3 = filters.high_pass(im_hough2, 120) + if show_all: + do_something(im_h3, "third high pass filter") + + 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_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_l in lines_m: + im_line = Image.new('L', im_h2.size) + draw = ImageDraw.Draw(im_line) + line_points = set() + for line in line_l: + draw.line(line_from_angl_dist(line, im_h2.size), fill=255, width=7) + draw_c.line(line_from_angl_dist(line, im_c.size), fill=(70, 70, 70), width=7) + 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) + for line in [l for s in lines for l in s]: + draw.line(line_from_angl_dist(line, image.size), fill=(120, 255, 120)) + if show_all: + do_something(image_g, "the grid") + + return lines + +def combine(image1, image2): + im_l1 = image1.load() + im_l2 = image2.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]: + on_both.append((x, y)) + return on_both + +def line_from_angl_dist((angle, distance), size): + x1 = - size[0] / 2 + y1 = int(round((x1 * math.sin(angle) - distance) / math.cos(angle))) + size[1] / 2 + x2 = size[0] / 2 + y2 = int(round((x2 * math.sin(angle) - distance) / math.cos(angle))) + size[1] / 2 + return [(0, y1), (size[0] - 1, y2)]