2015-12-09 4 views
0

У меня есть это изображение enter image description here. Я пытаюсь открыть буквы на этом изображении. Я не получаю желаемого результата для букв «9» и «R». Сначала я обрезал эти буквы, enter image description here & enter image description here и выполнил следующую команду.OCR: Не получается желаемый результат

tesseract 9.png stdout -psm 8 
. 

Он просто возвращается "."

OCR для всех других букв работает отлично, но не для этих двух букв (хотя, я думаю, их качество изображения не так уж плохо). Любое предложение/помощь приветствуются.

ответ

2

У меня нет опыта с tesseract самостоятельно, но репликация персонажа и добавление некоторых фоновых работ на https://www.newocr.com/, который использует tesseract внутренне, в соответствии с результатом google.

Так что я использовал это в качестве входных данных:

enter image description here

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

же работаю на

enter image description here

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

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

EDIT: Я обновил код, чтобы использовать границу по 4 пикселя в каждом направлении (вы можете отрегулировать переменную) и с черным цветом фона.

Этот код очень прост и должен быть очень похож на OpenCV в Java, Python и т.д.

int main(int argc, char * argv[]) 
{ 
    //cv::Mat input = cv::imread("../inputData/ocrR.png"); 

    if(argc != 3) 
    { 
     std::cout << "usage: .exe filename #Repetitions" << std::endl; 
     return 0; 
    } 

    std::string filename = argv[1]; 
    int nRepetitions = atoi(argv[2]); 

    cv::Mat inputImage = cv::imread(filename); 
    if(inputImage.empty()) 
    { 
     std::cout << "image file " << filename << " could not be loaded" << std::endl; 
     return 0; 
    } 

    // you instead should try to extract the background color from the image (e.g. from the image border) 
    cv::Scalar backgroundColor(0,0,0); 

    // size of the border in each direction 
    int border = 4; 

    cv::Mat repeatedImage = cv::Mat(inputImage.rows + 2*border, nRepetitions*inputImage.cols + 2*border, inputImage.type() , backgroundColor); 

    cv::Rect roi = cv::Rect(border,border,inputImage.cols, inputImage.rows); 

    for(int i=0; i<nRepetitions; ++i) 
    { 
     // copy original image to subimage of repeated image 
     inputImage.copyTo(repeatedImage(roi)); 

     // update roi position 
     roi.x += roi.width; 
    } 

    // now here you could send your repeated image to tesseract library and test whether nRepetitions times a letter was found. 

    cv::imwrite("repeatedImage.png", repeatedImage); 
    cv::imshow("repeated image" , repeatedImage); 
    cv::waitKey(0); 
    return 0; 
} 

дает этот результат:

enter image description here

+0

Спасибо за ввод, я попробую это. Но можете ли вы проверить это поведение с буквой «R»? –

+1

да, обновленный ответ. Интересно, что с 7 или менее «R» будет распознаваться как n раз «p», но с 8 буквами оно будет распознано как «R» ... даже если оно порождено до чистого черного и чистого белого. в конце концов, я не знаю, какая предварительная обработка выполняется этим веб-приложением, поэтому все это просто догадки ... – Micka

+0

Странно, что ваши изображения тоже работают для меня. : p Можете ли вы рассказать мне, как копировать это изображение один за другим? –

2

я был чуть-чуть больше успеха чем ты...Я сделал «Connected Components анализ» для извлечения отдельных букв, а затем положить границу вокруг каждой извлеченной буквы и приложил их все вместе в одну горизонтальную линию, которая дала мне это:

enter image description here

И если Затем я запускаю tesseract. Получаю:

VQQTRF 
+0

Привет @Mark, только проблема с этим подходом заключается в том, что tesseract запутывается, когда слово альфа-числовое. Но когда я делаю OCR индивидуальное письмо, я получаю гораздо лучший результат (почти правильный). –

+0

Каким образом буквы «9» и «R» более четкие и яркие на вашем изображении? Вы сделали что-то лишнее между нахождением контура и добавлением их всех вместе? –

+1

Я порождаю 50%, я думаю, как часть анализа связанных компонентов. Я также конвертировался в цветовое пространство HSL в один момент и отбросил оттенок и насыщенность и просто работал с каналом Lightness. Я также немного увеличил размер, чтобы каждая буква высотой 30-50 пикселей. Я тогда немного обескуражил, так как я не мог никуда с этой неудобной цифрой «9», поэтому я не писал ее слишком подробно ... –

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