如何从浮雕对象中提取圆形文本

时间:2019-05-19 12:03:32

标签: python opencv deep-learning geometry ocr

我有一个对象,上面有2个代码。文字印在上面。文字是曲线。文本的一半在对象的顶侧,另一半在对象的底侧。这是我的示例图片

image

我正在使用OPENCV,深度学习方法和tessract将其代码编码为OCR。 我采用逻辑方法(不是深度方法),首先使用HoughCircles()logPloar()来使文本对齐,然后使用tessract这样的示例sample code。但是由于对齐文本的变形,tesseract无法对其文本进行OCR。

在深度方法中,我无法找到张量流或割炬中曲线文本OCR的最佳解决方案。文本检测有很多来源无法识别。

关于约翰,

2 个答案:

答案 0 :(得分:0)

为什么不将圆形文本转换为线性文本?与此De-skew characters in binary image类似,只是有点复杂。因此,检测(或手动选择)圆心并将图像转换为未旋转的图像...

因此,创建尺寸为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高度),因此我可以以2种模式复制图像,以使文本的两个方向都可读(因为它们彼此镜像)

如果您更精确地选择中心(x0,y0),则文本会更直,我只是用鼠标单击了圆心,但是我怀疑文本的中心与该圆/圆盘的中心相同。单击一些后,这是我可以找到的最佳中心:

better center result

结果表明,两个文本和光盘都没有相同的中心...

输入图像的质量不好,您应该在执行此操作之前对其进行改进(甚至二进制化是个好主意),并且将其存储为JPG也不是一个好主意,因为其有损压缩会增加更多噪声。看看这些:

PS。中心可以从选定的文本(弧)进行几何计算,只需在弧上找到最远的点(边缘),然后在它们之间的中间找到点即可。由此您可以计算弧的中心和半径...甚至可以拟合它...

答案 1 :(得分:0)

黑点是居中的完美功能,极地扭曲似乎效果很好,字符的变形可以忽略不计。

enter image description here

Tesserac的失败可能是由于图像质量低(模糊)所致。