From 3c7eb1408a615d8bdc5e85c04f90c45d620d1e48 Mon Sep 17 00:00:00 2001 From: Tomas Musil Date: Fri, 6 Apr 2012 15:25:05 +0200 Subject: [PATCH 1/1] hough transform --- filter.py | 15 ++++++++++++++- hough.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ image_small.jpg | Bin 0 -> 46491 bytes imago.py | 48 ++++++++++++++++++++++++++++-------------------- 4 files changed, 91 insertions(+), 21 deletions(-) create mode 100644 hough.py create mode 100644 image_small.jpg diff --git a/filter.py b/filter.py index c378f76..7421fea 100644 --- a/filter.py +++ b/filter.py @@ -1,6 +1,6 @@ from PIL import Image -def filter(image): +def edge_detection(image): image_l = image.load() new_image = Image.new('L', image.size) new_image_l = new_image.load() @@ -13,3 +13,16 @@ def filter(image): pix = 0 new_image_l[x, y] = pix return new_image + +def high_pass(image, high_pass): + image_l = image.load() + new_image = Image.new('L', image.size) + new_image_l = new_image.load() + for x in range(image.size[0]): + for y in range(image.size[1]): + if image_l[x, y] < high_pass: + new_image_l[x, y] = 0 + else: + new_image_l[x, y] = image_l[x, y] + + return new_image diff --git a/hough.py b/hough.py new file mode 100644 index 0000000..22c52f3 --- /dev/null +++ b/hough.py @@ -0,0 +1,49 @@ +from PIL import Image +from math import sin, cos, pi +import os + +def clear(): + if os.name == 'posix': + os.system('clear') + elif os.name == ('ce', 'nt', 'dos'): + os.system('cls') + +def transform(image): + + image_l = image.load() + size = image.size + + dt = pi / size[1] + initial_angle = (pi / 4) + (dt / 2) + + matrix = [[0]*size[1] for _ in xrange(size[0])] + + for x in xrange(size[0]): + clear() + print "{0}/{1}".format(x + 1, size[0]) + for y in xrange(size[1]): + if image_l[x, y]: + # for every angle: + for a in xrange(size[1]): + # find the distance: + # distance is the dot product of vector (x, y) - centerpoint + # and a unit vector orthogonal to the angle + distance = (((x - (size[0] / 2)) * sin((dt * a) + initial_angle)) + + ((y - (size[1] / 2)) * -cos((dt * a) + initial_angle)) + + size[0] / 2) + column = int(round(distance)) # column of the matrix closest to the distance + if column >= 0 and column < size[0]: + matrix[column][a] += 1 + + new_image = Image.new('L', size) + new_image_l = new_image.load() + + minimum = min([min(m) for m in matrix]) + + maximum = max([max(m) for m in matrix]) - minimum + + for y in xrange(size[1]): + for x in xrange(size[0]): + new_image_l[x, y] = (float(matrix[x][y] - minimum) / maximum) * 255 + + return new_image diff --git a/image_small.jpg b/image_small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f8714ad2dd68020428d799d9a1fb96b7eb21ae92 GIT binary patch literal 46491 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 literal 0 HcmV?d00001 diff --git a/imago.py b/imago.py index 94f90a0..0fee41f 100755 --- a/imago.py +++ b/imago.py @@ -1,39 +1,47 @@ #!/usr/bin/env python """Usage: imago.py file""" +import sys import Image import im_debug -import sys -from filter import filter +import filter +import hough -class Usage(Exception): +class UsageError(Exception): def __init__(self, msg): self.msg = msg -def main(argv=None): +def main(*argv): """Main function of the program.""" try: - if argv is None: - try: - argv = sys.argv[1] - except IndexError: - raise Usage('no arguments given') - except Usage, err: - print >>sys.stderr, err.msg - print >>sys.stderr, "for help use --help" + if argv is (): + argv = sys.argv[1:] + if argv == []: + raise UsageError('Missing filename') + if "--help" in argv: + print __doc__ + return 0 + except UsageError, err: + print >>sys.stderr, err.msg, "(\"imago.py --help\" for help)" return 2 - #TODO exception on empty argument #TODO exception on file error - image = Image.open(argv) - im_debug.show(image, "original image") + image = Image.open(argv[0]) + #im_debug.show(image, "original image") im_l = image.convert('L') - im_debug.show(im_l, "ITU-R 601-2 luma transform") + #im_debug.show(im_l, "ITU-R 601-2 luma transform") + + im_edges = filter.edge_detection(im_l) + #im_debug.show(im_edges, "edge detection") + + im_h = filter.high_pass(im_edges, 80) + #im_debug.show(im_h, "high pass filter") + + im_hough = hough.transform(im_h) + im_debug.show(im_hough, "hough transform") - im_edges = filter(im_l) - im_debug.show(im_edges, "edge detection") + return 0 if __name__ == '__main__': - main() #sys.exit(main()) - + sys.exit(main()) -- 2.4.2