首页 > 解决方案 > 如何从浮雕对象中提取圆形文本

问题描述

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

图片

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

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

问候,约翰

标签: pythonopencvdeep-learninggeometryocr

解决方案


为什么不将圆形文本转换为线性?类似于这个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。中心可以从选定的文本(弧)中几何计算出来,只需在其上找到最远的点(边缘)并在弧上它们之间的中间点。从中你可以计算圆心和半径......甚至适合它......


推荐阅读