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