Как извлечь удар из китайского иероглифа - PullRequest
15 голосов
/ 09 августа 2011

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

В основном у меня есть следующие данные:

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

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

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

enter image description here

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

Ответы [ 5 ]

5 голосов
/ 09 августа 2011

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

3 голосов
/ 09 августа 2011

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

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

2 голосов
/ 11 августа 2011

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

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

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

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

2 голосов
/ 09 августа 2011

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

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

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

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

1 голос
/ 09 августа 2011

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

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

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

...