Skip to content
Snippets Groups Projects
Commit cfd20b63 authored by Fabien's avatar Fabien
Browse files

merged conflicts

parents 4b6c52d5 6103bbdd
No related branches found
No related tags found
No related merge requests found
...@@ -9,4 +9,7 @@ class Character: ...@@ -9,4 +9,7 @@ class Character:
def show(self): def show(self):
from pylab import imshow, show from pylab import imshow, show
imshow(self.data, cmap="gray") imshow(self.data, cmap="gray")
show() show()
\ No newline at end of file
def get_feature_vector(self):
pass
from svmutil import svm_model, svm_problem, svm_parameter, svm_predict, LINEAR
from cPicle import dump, load
class Classifier:
def __init__(self, c=None, filename=None):
if filename:
# If a filename is given, load a modl from the fiven filename
f = file(filename, 'r')
self.model, self.param, self.character_map = load(f)
f.close()
else:
self.param = svm_parameter()
self.param.kernel_type = LINEAR
self.param.C = c
self.character_map = {}
self.model = None
def save(self, filename):
"""Save the SVM model in the given filename."""
f = file(filename, 'w+')
dump((self.model, self.param, self.character_map), f)
f.close()
def train(self, learning_set):
"""Train the classifier with a list of character objects that have
known values."""
classes = []
features = []
for char in learning_set:
# Map the character to an integer for use in the SVM model
if char.value not in self.character_map:
self.character_map[char.value] = len(self.character_map)
classes.append(self.character_map[char.value])
features.append(char.get_feature_vector())
problem = svm_problem(self.c, features)
self.model = svm_model(problem, self.param)
# Add prediction function that returns a numeric class prediction
self.model.predict = lambda self, x: svm_predict([0], [x], self)[0][0]
def classify(self, character):
"""Classify a character object and assign its value."""
prediction = self.model.predict(character.get_feature_vector())
for value, svm_class in self.character_map.iteritems():
if svm_class == prediction:
return value
...@@ -6,7 +6,7 @@ from scipy.misc import imresize, imsave ...@@ -6,7 +6,7 @@ from scipy.misc import imresize, imsave
class GrayscaleImage: class GrayscaleImage:
def __init__(self, image_path = None, data = None): def __init__(self, image_path = None, data = None):
if image_path: if image_path != None:
self.data = imread(image_path) self.data = imread(image_path)
extension = image_path.split('.',3)[-1] extension = image_path.split('.',3)[-1]
...@@ -15,7 +15,7 @@ class GrayscaleImage: ...@@ -15,7 +15,7 @@ class GrayscaleImage:
self.data = self.data[::-1] self.data = self.data[::-1]
self.convert_to_grayscale() self.convert_to_grayscale()
elif data: elif data != None:
self.data = data self.data = data
def __iter__(self): def __iter__(self):
...@@ -46,7 +46,7 @@ class GrayscaleImage: ...@@ -46,7 +46,7 @@ class GrayscaleImage:
def show(self): def show(self):
imshow(self.data, cmap="gray") imshow(self.data, cmap="gray")
#show() show()
def make_histogram(self): def make_histogram(self):
return hist(self.data) return hist(self.data)
......
from copy import deepcopy from copy import deepcopy
from Rectangle import Rectangle from Rectangle import Rectangle
from GrayscaleImage import GrayscaleImage
class LetterCropper: class LetterCropper:
def __init__(self, threshold = 0.9): def __init__(self, threshold = 0.9):
self.source_image = image
self.threshold = threshold self.threshold = threshold
def get_cropped_letter(self): def crop_to_letter(self, image):
self.image = image
self.determine_letter_bounds() self.determine_letter_bounds()
self.result_image = deepcopy(self.source_image) self.image.crop(self.letter_bounds)
self.result_image.crop(self.letter_bounds)
return self.result_image
def determine_letter_bounds(self): def determine_letter_bounds(self):
min_x = self.source_image.width min_x = self.image.width
max_x = 0 max_x = 0
min_y = self.source_image.height min_y = self.image.height
max_y = 0 max_y = 0
for y, x, value in self.source_image: for y, x, value in self.image:
if value < self.threshold: if value < self.threshold:
if x < min_x: min_x = x if x < min_x: min_x = x
if y < min_y: min_y = y if y < min_y: min_y = y
......
...@@ -5,14 +5,17 @@ from GaussianFilter import GaussianFilter ...@@ -5,14 +5,17 @@ from GaussianFilter import GaussianFilter
class NormalizedCharacterImage(GrayscaleImage): class NormalizedCharacterImage(GrayscaleImage):
def __init__(self, image, size=(60, 40), blur=1.1, crop_threshold=0.9): def __init__(self, image=None, data=None, size=(60, 40), blur=1.1, crop_threshold=0.9):
GrayscaleImage.__init__(self, data=deepcopy(image.data)) if image != None:
GrayscaleImage.__init__(self, data=deepcopy(image.data))
elif data != None:
GrayscaleImage.__init__(self, data=deepcopy(data))
self.blur = blur self.blur = blur
self.crop_threshold = crop_threshold self.crop_threshold = crop_threshold
self.size = size self.size = size
self.gausse_filter() self.gausse_filter()
self.increase_contrast() self.increase_contrast()
self.crop() self.crop_to_letter()
self.resize() self.resize()
def increase_contrast(self): def increase_contrast(self):
...@@ -23,9 +26,9 @@ class NormalizedCharacterImage(GrayscaleImage): ...@@ -23,9 +26,9 @@ class NormalizedCharacterImage(GrayscaleImage):
filter = GaussianFilter(1.1) filter = GaussianFilter(1.1)
filter.filter(self) filter.filter(self)
def crop(self): def crop_to_letter(self):
cropper = LetterCropper(self, 0.9) cropper = LetterCropper(0.9)
self.data = cropper.get_cropped_letter().data cropper.crop_to_letter(self)
def resize(self): def resize(self):
self.resize(self.size) GrayscaleImage.resize(self, self.size)
\ No newline at end of file
from GrayscaleImage import GrayscaleImage from GrayscaleImage import GrayscaleImage
from NormalizedCharacterImage import NormalizedCharacterImage from NormalizedCharacterImage import NormalizedCharacterImage
from LetterCropper import LetterCropper
# Comment added by Richard Torenvliet
# Steps in this test files are
# 1. crop image
# 2. resize to default hight (in future also to width)
# 3. plot
image = GrayscaleImage("../images/test10.png") image = GrayscaleImage("../images/test10.png")
normalized_character_image = NormalizedCharacterImage(image) normalized_character_image = NormalizedCharacterImage(image)
normalized_character_image.show() normalized_character_image.show()
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment