-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathletterSegmentation.py
85 lines (62 loc) · 2.48 KB
/
letterSegmentation.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
from cv import *
def findContours(img):
temp = CreateImage(GetSize(src),8,1)
Copy(img, temp)
storage = CreateMemStorage(0)
return FindContours(temp, storage, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE)
def getGreyScale(img):
grey = CreateImage(GetSize(img),8,1)
CvtColor(img,grey,CV_BGR2GRAY)
return grey
def getThresholdedImage(img):
grey = getGreyScale(img)
Threshold(grey, grey, 150, 255, CV_THRESH_BINARY_INV)
return grey
def mapSequence(seq, onItem):
acc = []
while seq:
acc.append(onItem(seq))
acc.extend(mapSequence(seq.v_next(), onItem))
seq = seq.h_next() # Next sibling
return acc
def getROI(contour):
return BoundingRect(list(contour))
def similarity(im1, im2):
# im1 is the bigger of the two, if not, swap them
if GetSize(im1)[0] < GetSize(im2)[0]:
im1, im2 = im2, im1
size = GetSize(im1)
scaledIm2 = CreateImage(size, 8, 1)
Resize(im2, scaledIm2)
return 1 - ((1.0 / (255. * size[0] * size[1])) * Norm(im1, scaledIm2))
def recogniseLetterConstructor(sourceImage, letterExamples):
def recogniseLetter(roi):
SetImageROI(sourceImage, roi)
probabilities = map(lambda (letter, image): (roi, letter, similarity(sourceImage, image)), letterExamples)
ResetImageROI(sourceImage)
probabilities.sort(reverse=True, key=lambda (roi, l, p): p)
return probabilities[0]
return recogniseLetter
def safeLoad(imageLocation):
try:
im = LoadImage(imageLocation)
return getGreyScale(im)
except:
return None
def loadLetterExamples():
alphabet = map(chr, range(ord('a'), ord('z')+1) + range(ord('A'), ord('Z')+1))
images = map(lambda letter: (letter, safeLoad("letters/%s.png"%letter)), alphabet)
return filter(lambda (letter, image): image != None, images)
src = LoadImage("test.png")
thresholded = getThresholdedImage(src)
contours = findContours(thresholded)
rois = mapSequence(contours, getROI)
letterExamples = loadLetterExamples()
letterCandidates = filter(lambda (x,y,w,h): (h > 3) and (w < 20 and h < 20), rois)
letterSuggestions = map(recogniseLetterConstructor(thresholded, letterExamples), letterCandidates)
for i, (roi, letter, p) in enumerate(letterSuggestions):
SetImageROI(src, roi)
SaveImage("out/%s-%f.png"%(letter, p), src)
#letters = filter(lambda (roi, letter, p): p > 0.95, letterSuggestions)
#letters.sort(key=lambda ((x,y,w,h),l,p): (y+h))
#print map(lambda (roi, l, p) : l, letters)