python - 如何从浮雕对象中提取圆形文本
问题描述
我有一个对象,上面有 2 个代码。印在上面的文字。文字是曲线。一半的文本在顶部,另一半在对象的底部。这是我的示例图片
我正在使用 OPENCV,深度学习方法和 tessract 到 OCR 它的代码。我的逻辑方法(不是深度方法)我首先使用HoughCircles()
并logPloar()
对齐文本,然后使用 tessract,例如这个示例代码。但是由于对齐文本的失真,tesseract 无法 OCR 它的文本。
在深度方法中,我无法在 tensorflow 或 Torch 中找到曲线文本 OCR 的最佳解决方案。文本检测而不是识别的来源有很多。
问候,约翰
解决方案
为什么不将圆形文本转换为线性?类似于这个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。中心可以从选定的文本(弧)中几何计算出来,只需在其上找到最远的点(边缘)并在弧上它们之间的中间点。从中你可以计算圆心和半径......甚至适合它......
推荐阅读
- java - 通过将数组迭代到一半来反转数组时出现错误
- php - 无法检索外键的 id [Laravel]
- reactjs - GatsbyJs 从 onRouteUpdate 更新提供者值
- php - 更改方法 A 中的类属性值并访问方法 B 中的更新值
- r - 在 R 中按条件连接表
- python-3.x - 规范化熊猫数据框的所有列(作为一列)
- java - FirebaseRecyclerAdapter 未在我的 RecyclerView 布局中显示数据
- python - 清理数据框列以进行分类
- .net - 在 Visual Studio 2019 中将警告视为错误进行构建但不是智能感知
- sql-server - BEGIN TRY and EXECUTE 动态简单查询错误