Как извлечь круговой текст из рельефного объекта - PullRequest
2 голосов
/ 19 мая 2019

У меня есть объект, на нем 2 кода.текст напечатан на нем.Текст кривой.половина текста находится в верхней части, а другая половина - в нижней части объекта.Вот мой пример изображения

image

Я использую OPENCV и подходы глубокого обучения и передаю код OCR.Я логический подход (не глубокий подход) Сначала я использовал HoughCircles() и logPloar() для выравнивания текста в строке, а затем использовал tessract, такой как этот пример пример кода .Но из-за искажения в выровненном тексте, тессеракту не удается распознать его текст.

При глубоком подходе я не могу найти оптимальное решение для кривой текстового распознавания текста в тензорном потоке или факеле.Существует много источников для распознавания текста, а не для распознавания.

С уважением, Джон

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Черная точка - идеальная функция для центрирования, и полярное разворачивание работает нормально, деформация символов незначительна.

enter image description here

Сбой Tesserac может быть объяснен низким качеством изображения (размытие).

0 голосов
/ 20 мая 2019

почему бы не преобразовать круговой текст в линейный? Подобно этому Отклонить символы в двоичном изображении немного сложнее. Итак, определите (или выберите вручную) центр круга и преобразуйте изображение в не повернутый ...

Итак, создайте новое изображение с размерами 6.28*max_radius , 2*max_radius и скопируйте пиксели, используя полярную развёртку ... просто преобразуйте целевое положение пикселя в полярные координаты и преобразуйте его в декартову позицию исходного пикселя.

Я не кодирую в Python , ни OpenCV , но вот простой C ++ пример этого:

//---------------------------------------------------------------------------
picture pic0,pic1;                          // pic0 - original input image,pic1 output
//---------------------------------------------------------------------------
void ExtractCircularText(int x0,int y0)     // pic0 -> pic1 center = (x0,y0)
    {
    int x,y,xx,yy,RR;
    float fx,fy,r,a,R;
    // resize target image
    x=       -x0; y=       -y0; a=sqrt((x*x)+(y*y));          R=a;
    x=pic0.xs-x0; y=       -y0; a=sqrt((x*x)+(y*y)); if (R<a) R=a;
    x=       -x0; y=pic0.ys-y0; a=sqrt((x*x)+(y*y)); if (R<a) R=a;
    x=pic0.xs-x0; y=pic0.ys-y0; a=sqrt((x*x)+(y*y)); if (R<a) R=a;
    R=ceil(R); RR=R;
    pic1.resize((628*RR)/100,RR<<1);

    for (yy=0;yy<pic1.ys;yy++)
     for (xx=0;xx<pic1.xs;xx++)
        {
        // pic1 position xx,yy -> polar coordinates a,r
        a=xx; a/=R; r=yy;
        // a,r -> pic0 position
        fx=r*cos(a); x=x0+fx;
        fy=r*sin(a); y=y0+fy;
        // copy pixel
        if ((x>=0)&&(x<pic0.xs))
         if ((y>=0)&&(y<pic0.ys))
            {
            pic1.p[          yy][pic1.xs-1-xx]=pic0.p[y][x];    // 2 mirrors as the text is not uniformly oriented
            pic1.p[pic1.ys-1-yy][          xx]=pic0.p[y][x];
            }
        }
    pic1.save("out.png");
    }
//---------------------------------------------------------------------------

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


xs,ys - размер изображения в пикселях
p[y][x].dd - это пиксель в позиции (x,y) как 32-битный целочисленный тип
clear(color) очищает все изображение с помощью color
resize(xs,ys) изменяет размер изображения до нового разрешения

И, наконец, полученное изображение:

result

Я сделал 2 копии не повернутого изображения (следовательно, 2 * max_radius height), чтобы я мог скопировать изображение в 2 режимах, чтобы сделать обе ориентации текста читаемыми (так как они зеркально отражены друг для друга)

Текст будет более прямым, если вы выбрали центр (x0,y0) Точнее, я просто щелкнул его мышью по центру круга, но я сомневаюсь, что центр текста имеет тот же центр, что и этот круг / диск. После нескольких нажатий это лучший центр, который я смог найти:

better center result

Результат предполагает, что ни у одного из двух текстов, ни у диска нет одинакового центра ...

Качество входного изображения не очень хорошее, вы должны улучшить его, прежде чем делать это (возможно, даже бинаризация - хорошая идея), а также сохранять его, поскольку JPG не очень хорошая идея, так как сжатие с потерями добавляет к нему больше шума. Посмотрите на это:

PS. Центр может быть вычислен геометрически из выделенного текста (дуга), просто найдите наиболее удаленные точки на нем (ребра) и укажите середину между ними на дуге. Исходя из этого, вы можете вычислить центр и радиус дуги ... или даже подогнать его ...

...