Алгоритм автокорректировки черт.
02 Jun 2025
Здесь приводится описание программы для автокорректировки черт при рукописном вводе китайских иероглифов. Целью создания программы было улучшение точности распознавания иероглифов при рукописном вводе с помощью клавиатуры рукописного ввода.
Ранее я создавал клавиатуру рукописного ввода для Linux (работающую оффлайн). Эта клавиатура превращает рукописный ввод (на канвасе) в изображение и отправляет это изображение в программу распознавания текста с изображения, затем показывает полученный результат. Проблема в том, что программы распознавания текста предназначены (обучены), в первую очередь, для распознавания печатного текста (с печатными шрифтами), а не текста, написанного от руки. Поэтому, при распознавании текста, написанного от руки, текст не всегда распознается корректно. Особенно это касается распознавания иероглифов. Если привести рукописный ввод надписи ближе к печатному виду, это поможет лучше распознавать рукописный текст. Для этого я и создавал эту программу, как помощь в написании иероглифов на компьютере.
Демонстрация работы программы (видео):
Данная программа может улучшить точность распознавания иероглифов при рукописном вводе, помогая приводить их изображение ближе к печатному виду. Я добавил код программы в качестве экспериментальной функции в свои приложения для компьютра: программа для запоминания китайских слов и клавиатура рукописного ввода для Linux (работающая оффлайн).
В виду большого разнообразия самих иероглифов и тем более линий (черт) применяемых в написании иероглифов, на данный момент программа учитывает не все варианты. Я планирую дорабатывать, улучшать её в будущем.
Как программа работает изнутри.
Отдельная черта представляет собой непрерывную линию. Эта линия храниться в памяти программы, как последовательный набор точек, соединенных между собой прямыми линиями. Расположение каждой точки представлено двумя координатами X и Y. В браузере начало координат (точка (0, 0)) располагается в левом верхнем углу.
После того, как пользователь нарисовал линию на канвасе, программа:
- Выделяет квадрат, в котором находится черта, точки: Xmin, Xmax, Ymin, Ymax.
- Трансформирует координаты каждой точки так, чтобы линия умещалась в плоскость: \(X ∈ [-1, 1]\); \(Y ∈ [-1, 1]\).
- По всей длине равномерно отмечает 100 точек.
- Сравнивает эти 100 точек с заранее посчитанными линиями (чертами) из памяти программы и из них выбирается та, что наиболее похожа на нарисованную пользователем линию. Сравнение осуществляется следующим образом.
Для каждой заранее посчитанной линии расчитывается следующая формула: \(S = \sum \limits_{i=1}^{100} ((X_i - \overset{\text{~}}{X_i})^2 + (Y_i - \overset{\text{~}}{Y_i})^2) \) . Где: \(X_i, Y_i\) - координаты точки \(i\) из линнии нарисованной пользователем; \(\overset{\text{~}}{X_i}, \overset{\text{~}}{Y_i}\) - координаты точки \(i\) из заранее посчитанной линии в памяти программы. Далее, выбирается заранее посчитанная линия из памяти программы с наименьшим значением \(S\).
- Линия, нарисованная пользователем, заменяется на заранее посчитанную линию из памяти программы.
- Координаты точек из плоскости \(X ∈ [-1, 1]\); \(Y ∈ [-1, 1]\) пересчитываются обратно в изначальную систему координат.
- Старая линия стирается, вместо неё рисуется новая исправленая линия.
О том, как программа разрабатывалась.
На первом этапе была разработана функция, пересчитывающая координаты линии нарисованной пользователем в плоскость \(X ∈ [-1, 1]\); \(Y ∈ [-1, 1]\) и затем, по всей длине линии равномерно отмечающая 100 точек.
Далее, был написан набор функций, отрисовывающих на канвасе линию нужной формы (такой же формы, как выглядит черта). Черты отрисовывались, как последовательные сочетания прямых линий и кривых Безье (построенных по 4 точкам). За основу (того, как должны выглядить черты) я взял изображения черт с сайта: https://www.archchinese.com/chinese_character_strokes.html. После того, как функция отрисует линию, эта линия пересчитывалась в плоскость \(X ∈ [-1, 1]\); \(Y ∈ [-1, 1]\), на ней отмечалось 100 точек и эти данные сохранялись в отдельный файл, как заранее посчитанная линия.
Для того, чтобы легче было подбирать параметры функций, отрисовывающих линии, была создана еще одна вспомогательная программа, где можно вручную перетаскивать отдельные точки и смотреть, как при этом отрисовывается линия.
Пример работы этих вспомогательных программ вы можете видеть на изображениях ниже.


Update 27 June 2025
В дальнейшем улучшил программу использовав за основу таблицу ключей (частей сложных иероглифов).