почему бы не преобразовать круговой текст в линейный? Подобно этому Отклонить символы в двоичном изображении немного сложнее. Итак, определите (или выберите вручную) центр круга и преобразуйте изображение в не повернутый ...
Итак, создайте новое изображение с размерами 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 height), чтобы я мог скопировать изображение в 2 режимах, чтобы сделать обе ориентации текста читаемыми (так как они зеркально отражены друг для друга)
Текст будет более прямым, если вы выбрали центр (x0,y0)
Точнее, я просто щелкнул его мышью по центру круга, но я сомневаюсь, что центр текста имеет тот же центр, что и этот круг / диск. После нескольких нажатий это лучший центр, который я смог найти:
Результат предполагает, что ни у одного из двух текстов, ни у диска нет одинакового центра ...
Качество входного изображения не очень хорошее, вы должны улучшить его, прежде чем делать это (возможно, даже бинаризация - хорошая идея), а также сохранять его, поскольку JPG не очень хорошая идея, так как сжатие с потерями добавляет к нему больше шума. Посмотрите на это:
PS. Центр может быть вычислен геометрически из выделенного текста (дуга), просто найдите наиболее удаленные точки на нем (ребра) и укажите середину между ними на дуге. Исходя из этого, вы можете вычислить центр и радиус дуги ... или даже подогнать его ...