2013-07-15 3 views
4

Я столкнулся с проблемой создания координат с плавающей точкой из изображения.OpenCV: Создание точек из изображения после разбавления

Исходная проблема заключается в следующем: входное изображение - рукописный текст. Из этого я хочу создать набор точек (только x, y координат), которые составляют отдельные символы.

Сначала я использовал findContours для создания точек. Так как это находит края символов, в первую очередь нужно пропустить алгоритм прореживания, так как меня не интересует форма символов, указывает только строки или как в этом случае.

Вход:

input

прореживание:

thinning

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

Вторая идея заключалась в создании ограничивающих прямоугольников (с помощью findContours), используя эти ограничивающие поля, чтобы захватить символы из процесса прореживания и захватить все небелые пиксельные индексы как «точки» и смещать их по позиции ограничивающей рамки. Это приводит к еще большему результату и кажется плохим методом.

Ужасного код для этого:

Mat temp = new Mat(edges, bb); 
byte roi_buff[] = new byte[(int) (temp.total() * temp.channels())]; 
temp.get(0, 0, roi_buff); 

int COLS = temp.cols(); 
List<Point> preArrayList = new ArrayList<Point>(); 

for(int i = 0; i < roi_buff.length; i++) 
{ 
    if(roi_buff[i] != 0) 
    { 
      Point tempP = bb.tl(); 
      tempP.x += i%COLS; 
      tempP.y += i/COLS; 
      preArrayList.add(tempP); 
    } 
} 

Есть ли какая-либо альтернатива или я с видом что-то?

UPDATE:

я проглядел тот факт, что мне нужно точек (пикселей), которые можно заказать. В вышеприведенном методе я просто использую метод scanline для захвата всех пикселей. Если вы посмотрите, например, на «o», он сначала возьмет точку с левой стороны, затем одну с правой стороны. Мне нужно, чтобы их заказывали соседние пиксели, так как я хочу рисовать пути с точками позже (за пределами opencv). Возможно ли это?

+0

Обновлен вопрос с результатом ввода и истончением. – prayforbacon

ответ

1

Вы должны ознакомиться с внедрением собственной маркировки подключенных компонентов. Концепция очень проста: вы просматриваете первую строку и присваиваете уникальные метки каждой горизонтально связанной полосе пикселей. Вы в основном проверяете каждый пиксель, если он подключен к его левому соседу и назначает ему либо метку соседа, либо новую метку. Во второй строке вы делаете то же самое, но вы также проверяете пиксели над ним. Иногда вам требуется слияние ярлыков: две строки, которые не были связаны в предыдущей строке, соединяются в текущей строке. Способ справиться с этим - либо сохранить список эквивалентов меток, либо использовать указатели на метки (чтобы вы могли легко выполнить полное изменение метки для объекта).

Это в основном то, что делает findContours, но если вы его реализуете самостоятельно, у вас есть свобода идти на 8-связность и даже преодолевать однопиксельный или двухпиксельный зазор. Таким образом, вы получаете «привязанную к компонентам маркировку компонентов». Похоже, вам нужно это для «w» в вашем примере.

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

Это будет не так быстро, но это должно быть началом.

Смежные вопросы