-from math import sin, cos, pi
+"""Hough transform module."""
+
+from math import pi
from PIL import Image
import pcf
class Hough:
- def __init__(self, size):
+ def __init__(self, size, dt, init_angle, image):
self.size = size
- self.dt = pi / size[1]
- self.initial_angle = (pi / 4) + (self.dt / 2)
+ self.dt = dt
+ self.initial_angle = init_angle
+ self.image = image
+
+ @classmethod
+ def Transform(cls, image):
+ size = image.size
+ dt = pi / size[1]
+ initial_angle = (pi / 4) + (dt / 2)
+ image_s = pcf.hough(size, image.tostring(), initial_angle, dt)
+ image_t = Image.fromstring('L', size, image_s)
+ return cls(size, dt, initial_angle, image_t)
- def transform(self, image):
- image_s = pcf.hough(image.size, image.tostring(), self.initial_angle, self.dt)
- image = Image.fromstring('L', image.size, image_s)
- return image
+ def apply_filter(self, filter_f):
+ return Hough(self.size, self.dt, self.initial_angle,
+ filter_f(self.image))
def lines_from_list(self, p_list):
lines = []
lines.append(self.angle_distance(p))
return lines
- def all_lines_h(self, image):
- im_l = image.load()
+ def all_lines_h(self):
+ im_l = self.image.load()
lines1 = []
- for x in xrange(image.size[0] / 2):
- for y in xrange(image.size[1]):
+ for x in xrange(self.size[0] / 2):
+ for y in xrange(self.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]):
+ for x in xrange(self.size[0] / 2, self.size[0]):
+ for y in xrange(self.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()
+ def all_lines(self):
+ im_l = self.image.load()
lines = []
- for x in xrange(image.size[0]):
- for y in xrange(image.size[1]):
+ for x in xrange(self.size[0]):
+ for y in xrange(self.size[1]):
if im_l[x, y]:
lines.append(self.angle_distance((x, y)))
return lines
def angle_distance(self, point):
- return (self.dt * point[1] + self.initial_angle, point[0] - self.size[0] / 2)
+ return (self.dt * point[1] + self.initial_angle,
+ point[0] - self.size[0] / 2)