Как извлечь инсульт с китайского персонажа

Я много раз пытался создать алгоритм для извлечения информации об инсультах из китайских символов. Я пробовал различные методы, но ни один из них не был очень удовлетворительным, возможно, из-за моего ограниченного знания графических алгоритмов в целом.

В принципе, у меня есть следующие данные:

  • Китайский символ, который может быть либо пикселями, либо вектором (черным)

  • Общий контур штриха в пикселях (красным)

  • Общее направление (синие стрелки).

enter image description here

Из этого я пытаюсь извлечь инсульт. Если вам нужно было это сделать, учитывая доступные данные, какие методы вы бы использовали? Можете ли вы придумать какой-либо автоматический способ извлечения штриха?

Ответ 1

Я бы начал с вычисления расстояния до ближайшего белого пикселя от каждого синего пикселя. Затем вы можете сохранить все красные пиксели, которые ближе, чем ближайший белый пиксель. Затем эффект может быть сглажен каким-то фильтром (возможно, что-то вроде erosion, за которым следует близко).

Ответ 2

Возможно, вы ищете медиальную ось также известную как топологический скелет. Короче говоря, вы решите найти все точки, которые эквидистантны более чем на одну точку на краю. Возможно, вам придется немного сгладить или упростить результирующую кривую.

Сложная часть - это разделение части формы, общей для более чем одного такта. Я не уверен, что существует четкий способ сделать это. Возможно, определить "общую область" как круг, центрированный на каждом пересечении скелета, касательный к ближайшим ребрам? Тогда, может быть, некоторая интерполяция ширины штриха по пробелу?

Ответ 3

Я не думаю, что вы можете придумать алгоритм, который не имеет случаев, когда он был бы неправильным. Есть части некоторых символов, которые одинаковы, но не приравниваются к одному и тому же числу инсульта. Например, 馬 технически также включает 口 с визуальной точки зрения (не лингвистически, конечно).

Единственная идея, которую я имею, - уделить место области маленьким регионам и написать алгоритм, который будет пытаться следовать установленному порядку, в котором делаются штрихи, но я не могу представить, что это было бы легко и в зависимости от шрифта, некоторые строки распространяются на регионы, в которых они не должны находиться.

Есть также некоторые символы, которые просто не будут хорошо работать с алгоритмом из-за их необычного макета - только следуя строгим правилам порядка штрихов, вы можете перейти к правильному числу: примеры включают 凹 и 凸.

Я должен спросить: количество инсульта - основная информация для каждого персонажа - зачем вам нужно создавать алгоритм для подсчета? Не было бы проще сделать распознавание символов и просто посмотреть количество штрихов для символа в пользовательском словаре?

Ответ 4

Из синей линии и образца изображения я думаю, что этот трехступенчатый подход может работать в довольно многих случаях:

  • Для каждой точки вдоль линии выберите все красные пиксели, которые ближе до этой точки, чем ближайший белый пиксель. Это примерно даст вам штрих персонажа, но с выпуклостями вокруг области, где пересекаются два хода, и вы исключите некоторые пиксели на обоих концах хода.

  • Чтобы устранить выпуклости, изолируйте крайние пиксели штриха и вычислите hough transform для этого краевого изображения. Выберите две наиболее важные линии. Это даст вам (если удар достаточно в порядке) две линии вдоль краев штриха. Устраните все красные пиксели от вашего удара, которые находятся дальше от синей линии в перпендикулярном направлении, чем эти две линии. Теперь (для достаточно прямого хода) все, что вам не хватает, будут представлять собой небольшие изолированные куски пикселей, которые могут быть удалены либо на этапе 1, либо на этапе 2, поэтому:

  • Добавьте все небольшие изолированные области пикселей, которые касаются только вашего штриха, и никакой другой части персонажа для штриха. Если строки, которые вы находите на шаге 2, слишком близко к синей линии, вы также можете выполнить этот шаг между шагами 1 и 2.

Ответ 5

Я думаю, что самая простая вещь, которая может работать:

  • постройте синие стрелки, поочередно
  • вычислить преобразование расстояния каждого сегмента синей линии
  • пересечь это дискретное расстояние с красными областями
  • удалить красные области с расстоянием до синего сегмента больше, чем T

Как только вы это сделаете, вы сможете работать над более сложными стратегиями, чтобы выбрать хороший, зависимый от сегмента T.