Implement correction for optical distance between letters.
This commit is contained in:
parent
ce4252e361
commit
c4b170cc21
1 changed files with 20 additions and 4 deletions
|
|
@ -112,6 +112,22 @@ class Line(PageObject):
|
||||||
letters = self._combine_diacritics(letters)
|
letters = self._combine_diacritics(letters)
|
||||||
return self._insert_spaces(letters)
|
return self._insert_spaces(letters)
|
||||||
|
|
||||||
|
def _optical_correction(self, letter1, letter2):
|
||||||
|
base = min(letter1.top, letter2.top)
|
||||||
|
height = max(letter1.bottom, letter2.bottom) - base
|
||||||
|
bitmap1 = np.hstack([np.ones((letter1.height, 1)), letter1.image.bitmap])
|
||||||
|
bitmap2 = np.hstack([letter2.image.bitmap, np.ones((letter2.height, 1))])
|
||||||
|
|
||||||
|
margin1 = np.zeros(height, np.int)
|
||||||
|
margin1.fill(letter1.width)
|
||||||
|
margin2 = np.zeros(height, np.int)
|
||||||
|
margin2.fill(letter2.width)
|
||||||
|
|
||||||
|
margin1[letter1.top - base: letter1.bottom - base] = np.fliplr(bitmap1).argmax(axis=1)
|
||||||
|
margin2[letter2.top - base: letter2.bottom - base] = bitmap2.argmax(axis=1)
|
||||||
|
margins = margin1 + margin2
|
||||||
|
return margins.min()
|
||||||
|
|
||||||
def _combine_diacritics(self, letters):
|
def _combine_diacritics(self, letters):
|
||||||
def is_diacritic(glyph):
|
def is_diacritic(glyph):
|
||||||
# XXX
|
# XXX
|
||||||
|
|
@ -133,9 +149,10 @@ class Line(PageObject):
|
||||||
for letter, next_letter in pairwise(letters):
|
for letter, next_letter in pairwise(letters):
|
||||||
yield letter
|
yield letter
|
||||||
if next_letter is not None:
|
if next_letter is not None:
|
||||||
distance = next_letter.left - letter.right
|
correction = self._optical_correction(letter, next_letter)
|
||||||
|
distance = next_letter.left - letter.right + correction
|
||||||
if distance > 5:
|
if distance > 5:
|
||||||
yield Space(self.image.space(letter.right, self.top, distance, self.baseline - self.top))
|
yield Space(self.image.space(letter.right, self.top, distance, self.height), self.baseline - self.top)
|
||||||
|
|
||||||
def _extract_blob(self, blob_slice, label, labels):
|
def _extract_blob(self, blob_slice, label, labels):
|
||||||
image = self.image[blob_slice]
|
image = self.image[blob_slice]
|
||||||
|
|
@ -150,5 +167,4 @@ class Letter(PageObject):
|
||||||
|
|
||||||
|
|
||||||
class Space(Letter):
|
class Space(Letter):
|
||||||
def __init__(self, image):
|
pass
|
||||||
super().__init__(image, elevation=0)
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue