From: Tomas Musil Date: Fri, 6 Apr 2012 13:25:05 +0000 (+0200) Subject: hough transform X-Git-Url: http://git.tomasm.cz/imago.git/commitdiff_plain/3c7eb1408a615d8bdc5e85c04f90c45d620d1e48?ds=inline;hp=cb5f68ed0aa3a0f1f8ae416d090a7faadace81b5 hough transform --- 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 0000000..f8714ad Binary files /dev/null and b/image_small.jpg differ 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())