OpenCV - разделение контуров букв при сегментации текста

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

Можете ли вы дать мне какую-нибудь идею для их разделения? Спасибо за помощь!

Ниже приведены некоторые примеры и часть моего кода:

Mat placa_contornos = processContourns(img_placa_adaptativeTreshold_mean);
vector<vector<Point>> contours_placa;
findContours(placa_contornos,
             contours_placa, 
             CV_RETR_EXTERNAL, externos)
             CV_CHAIN_APPROX_NONE); 
vector<vector<Point> >::iterator itc = contours_placa.begin();
while (itc != contours_placa.end()) {
    //Create bounding rect of object
    Rect mr = boundingRect(Mat(*itc));
    rectangle(imagem_placa_cor, mr, Scalar(0, 255, 0));
    ++itc;
}
imshow("placa con rectangles", imagem_placa_cor);

Примеры результатов

исходное изображение, бинаризованное изображение, результат


person Alexander33    schedule 25.01.2017    source источник
comment
Также было бы полезно, если бы вы поместили исходные и бинаризованные изображения.   -  person ilke444    schedule 26.01.2017
comment
Спасибо за ваш комментарий @like444, в описании я поставил изображение с одним исходным изображением, и это результат. Спасибо за помощь.   -  person Alexander33    schedule 26.01.2017
comment
Вы также можете попробовать скелетирование   -  person Jeru Luke    schedule 26.01.2017
comment
Удалось ли вам добиться того, чего вы хотели?   -  person Jeru Luke    schedule 13.03.2017


Ответы (2)


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

Кроме того, это может иметь значение: Распознавание символов номерного знака

person brad    schedule 25.01.2017
comment
Спасибо @brad, у меня есть много изображений с линиями вверху и внизу, которые я также хочу удалить, как я могу удалить линию? - person Alexander33; 26.01.2017
comment
Когда я работал над похожей задачей, мне удалось проверить каждую строку мата, чтобы увидеть, много ли в ней белых пикселей, указывающих на горизонтальную линию. Однако этот подход может работать только в том случае, если вы можете исправить перекос или угол остается постоянным. В противном случае, возможно, сработает другой метод обнаружения линии. - person brad; 26.01.2017

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

// Get a rectangular kernel with size 7
Mat element = getStructuringElement(0, Size(7, 7), Point(1, 1));
// Apply the morphology operation
morphologyEx(placa_contornos, result, CV_MORPH_OPEN, element);

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

введите здесь описание изображения

person ilke444    schedule 25.01.2017