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:
def show(self):
from pylab import imshow, show
imshow(self.data, cmap="gray")
show()
\ No newline at end of file
show()
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
class GrayscaleImage:
def __init__(self, image_path = None, data = None):
if image_path:
if image_path != None:
self.data = imread(image_path)
extension = image_path.split('.',3)[-1]
......@@ -15,7 +15,7 @@ class GrayscaleImage:
self.data = self.data[::-1]
self.convert_to_grayscale()
elif data:
elif data != None:
self.data = data
def __iter__(self):
......@@ -46,7 +46,7 @@ class GrayscaleImage:
def show(self):
imshow(self.data, cmap="gray")
#show()
show()
def make_histogram(self):
return hist(self.data)
......
from copy import deepcopy
from Rectangle import Rectangle
from GrayscaleImage import GrayscaleImage
class LetterCropper:
def __init__(self, threshold = 0.9):
self.source_image = image
self.threshold = threshold
def get_cropped_letter(self):
def crop_to_letter(self, image):
self.image = image
self.determine_letter_bounds()
self.result_image = deepcopy(self.source_image)
self.result_image.crop(self.letter_bounds)
return self.result_image
self.image.crop(self.letter_bounds)
def determine_letter_bounds(self):
min_x = self.source_image.width
min_x = self.image.width
max_x = 0
min_y = self.source_image.height
min_y = self.image.height
max_y = 0
for y, x, value in self.source_image:
for y, x, value in self.image:
if value < self.threshold:
if x < min_x: min_x = x
if y < min_y: min_y = y
......
......@@ -5,14 +5,17 @@ from GaussianFilter import GaussianFilter
class NormalizedCharacterImage(GrayscaleImage):
def __init__(self, image, size=(60, 40), blur=1.1, crop_threshold=0.9):
GrayscaleImage.__init__(self, data=deepcopy(image.data))
def __init__(self, image=None, data=None, size=(60, 40), blur=1.1, crop_threshold=0.9):
if image != None:
GrayscaleImage.__init__(self, data=deepcopy(image.data))
elif data != None:
GrayscaleImage.__init__(self, data=deepcopy(data))
self.blur = blur
self.crop_threshold = crop_threshold
self.size = size
self.gausse_filter()
self.increase_contrast()
self.crop()
self.crop_to_letter()
self.resize()
def increase_contrast(self):
......@@ -23,9 +26,9 @@ class NormalizedCharacterImage(GrayscaleImage):
filter = GaussianFilter(1.1)
filter.filter(self)
def crop(self):
cropper = LetterCropper(self, 0.9)
self.data = cropper.get_cropped_letter().data
def crop_to_letter(self):
cropper = LetterCropper(0.9)
cropper.crop_to_letter(self)
def resize(self):
self.resize(self.size)
GrayscaleImage.resize(self, self.size)
\ No newline at end of file
from GrayscaleImage import GrayscaleImage
from NormalizedCharacterImage import NormalizedCharacterImage
# 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
from LetterCropper import LetterCropper
image = GrayscaleImage("../images/test10.png")
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