我有一个对象,上面有2个代码。文字印在上面。文字是曲线。文本的一半在对象的顶侧,另一半在对象的底侧。这是我的示例图片
我正在使用OPENCV,深度学习方法和tessract将其代码编码为OCR。
我采用逻辑方法(不是深度方法),首先使用HoughCircles()
和logPloar()
来使文本对齐,然后使用tessract这样的示例sample code。但是由于对齐文本的变形,tesseract无法对其文本进行OCR。
在深度方法中,我无法找到张量流或割炬中曲线文本OCR的最佳解决方案。文本检测有很多来源无法识别。
关于约翰,
答案 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)
将图像调整为新分辨率
最后是生成的图像:
我制作了2个未旋转图像的副本(因此2 * max_radius高度),因此我可以以2种模式复制图像,以使文本的两个方向都可读(因为它们彼此镜像)
如果您更精确地选择中心(x0,y0)
,则文本会更直,我只是用鼠标单击了圆心,但是我怀疑文本的中心与该圆/圆盘的中心相同。单击一些后,这是我可以找到的最佳中心:
结果表明,两个文本和光盘都没有相同的中心...
输入图像的质量不好,您应该在执行此操作之前对其进行改进(甚至二进制化是个好主意),并且将其存储为JPG也不是一个好主意,因为其有损压缩会增加更多噪声。看看这些:
PS。中心可以从选定的文本(弧)进行几何计算,只需在弧上找到最远的点(边缘),然后在它们之间的中间找到点即可。由此您可以计算弧的中心和半径...甚至可以拟合它...
答案 1 :(得分:0)