检测水平图像中文本的角度,并在matlab中旋转

Rit*_*itz -2 matlab image image-processing text-rotation

见下图:

正如您在图像中看到的那样,书面文本旋转90度角,我想只旋转文本为水平.通过它旋转的任何角度,我想使其成为水平,如下所示:

我不希望完整的图像旋转.我希望文本只是有界的,测量文本旋转的角度然后旋转该角度使其成为水平.

你能建议我这样做,然后在文本上放一个椭圆吗?

谢谢.

Sha*_*hai 5

首先,让我们找到所有暗像素的xy坐标

bw = imread('http://i.imgur.com/0LxC6bd.png');
bw = min( bw, [], 3 ) < 50 ; % dark pixels - intensity lower than 50
[y x] = find( bw ); % note that find returns row-col coordinates.
Run Code Online (Sandbox Code Playgroud)

计算文本坐标的协方差矩阵

mx = mean(x);
my = mean(y);
C = [ mean( (x-mx).^2 ),     mean( (x-mx).*(y-my) );...
      mean( (x-mx).*(y-my) ) mean( (y-my).^2 ) ];
Run Code Online (Sandbox Code Playgroud)

您可以从特征向量和特征值得到椭圆的方向C:

[V D] = eig( C );
figure; imshow( bw ); hold on;
quiver( mx([1 1]), my([1 1]), (V(1,:)*D), (V(2,:)*D), .05 );  
Run Code Online (Sandbox Code Playgroud)

查看特征向量和特征值:

V =
-0.9979   -0.0643
-0.0643    0.9979

D = 
1.0e+003 *
0.1001         0
     0    1.3652
Run Code Online (Sandbox Code Playgroud)

您可以看到特征向量(列V)大致指向-X方向(第一列)和Y方向(第二列).检查特征值(对角线D),您可以看到第二个特征值远大于第一个特征值 - 这是椭圆的主轴.现在您可以恢复椭圆的方向:

[~, mxi] = max(diag(D)); % find major axis index: largest eigen-value
Run Code Online (Sandbox Code Playgroud)

从相应的特征向量中恢复角度

or = atan2( V(2,mxi), V(1,mxi) ) * 180/pi ; % convert to degrees for readability
or =
93.6869
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,椭圆的主轴距离地平线几乎90度.您可以将图像旋转回来

imrotate( bw, -or );
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


给出协方差矩阵绘制椭圆:

th = linspace(0, 2*pi, 500 );
xy = [cos(th);sin(th)];
RR = chol( C ); % cholesky decomposition
exy = xy'*RR; %//'
figure;imshow( bw ); hold on;
plot( 2*exy(:,1)+mx, 2*exy(:,2)+my, 'r', 'LineWidth', 2 );
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述