【问题标题】:How to extract circular text from embossed object如何从浮雕对象中提取圆形文本
【发布时间】:2019-05-19 12:03:32
【问题描述】:

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

我正在使用 OPENCV、深度学习方法和 tessract 来 OCR 它的代码。 我的逻辑方法(不是深度方法)我首先使用HoughCircles()logPloar() 将文本对齐,然后使用 tessract,例如 sample code。但是由于对齐文本的失真,tesseract 无法 OCR 它的文本。

在深度方法中,我无法在 tensorflow 或 Torch 中找到曲线文本 OCR 的最佳解决方案。文本检测而非识别的来源很多。

问候,约翰

【问题讨论】:

    标签: python opencv deep-learning geometry ocr


    【解决方案1】:

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

    因此,创建尺寸为6.28*max_radius , 2*max_radius 的新图像并使用极坐标展开复制像素...只需将目标像素位置转换为极坐标并将其转换为笛卡尔源像素位置。

    我不使用 PythonOpenCV 编写代码,但这里有一个简单的 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) 将图像大小调整为新分辨率

    最后是生成的图像:

    我制作了 2 个未旋转图像的副本(因此为 2*max_radius 高度),因此我可以以 2 种模式复制图像以使文本的两个方向都可读(因为它们相互镜像)

    如果您选择中心(x0,y0),文本会更直,更准确地说,我只是用鼠标在圆的中心单击它,但我怀疑文本的中心与那个圆/圆盘的中心相同。点击后这是我能找到的最好的中心:

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

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

    PS。中心可以从选定的文本(弧)中以几何方式计算,只需在其上找到最远的点(边缘)并在弧上它们之间的中间点。从中您可以计算圆心和半径...甚至适合它...

    【讨论】:

    • 谢谢。我正在研究它的python版本来测试它。我会报告结果。问候
    【解决方案2】:

    黑点是一个完美的居中特征,极地展开似乎工作正常,字符的变形可以忽略不计。

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

    【讨论】:

    • 谢谢,但黑点始终不在中心。我使用了边界框和 minarearect,但它们无法绑定阈值图像。
    猜你喜欢
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多