见下图:
正如您在图像中看到的那样,书面文字旋转了 90 度角,我只想将文字旋转为水平。无论旋转什么角度,我都想让它水平,如下所示:
我不希望完整的图像旋转。我希望仅对文本进行限制,并测量文本旋转的角度,然后按该角度旋转以使其水平。
你能建议我这样做,然后在文本上放置一个椭圆吗?
谢谢你。
见下图:
正如您在图像中看到的那样,书面文字旋转了 90 度角,我只想将文字旋转为水平。无论旋转什么角度,我都想让它水平,如下所示:
我不希望完整的图像旋转。我希望仅对文本进行限制,并测量文本旋转的角度,然后按该角度旋转以使其水平。
你能建议我这样做,然后在文本上放置一个椭圆吗?
谢谢你。
首先,让我们找到所有暗像素的 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.
计算文本坐标的协方差矩阵
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 ) ];
您可以从 的特征向量和特征值中获得椭圆的方向C
:
[V D] = eig( C );
figure; imshow( bw ); hold on;
quiver( mx([1 1]), my([1 1]), (V(1,:)*D), (V(2,:)*D), .05 );
查看特征向量和特征值:
V =
-0.9979 -0.0643
-0.0643 0.9979
D =
1.0e+003 *
0.1001 0
0 1.3652
您可以看到特征向量( 的列V
)大致指向-X
方向(第一列)和Y
方向(第二列)。检查特征值( 的对角线D
),您可以看到第二个特征值比第一个大得多 - 这是椭圆的主轴。现在您可以恢复椭圆的方向:
[~, mxi] = max(diag(D)); % find major axis index: largest eigen-value
从相应的特征向量中恢复角度
or = atan2( V(2,mxi), V(1,mxi) ) * 180/pi ; % convert to degrees for readability
or =
93.6869
如您所见,椭圆的长轴与地平线几乎成 90 度。您可以将图像旋转回来
imrotate( bw, -or );
在给定协方差矩阵的情况下绘制一个椭圆:
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 );
我使用了这个解决方案:
bw = im2;
bw = sum((1-im2).^2, 3) > .5;
%bw = min( bw, [], 3 ) < 50 ; % dark pixels - intensity lower than 50
[y x] = find( bw ); % note that find returns row-col coordinates.
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 ) ];
[V D] = eig( C );
quiver( mx([1 1]), my([1 1]), (V(1,:)*D), (V(2,:)*D), .05 );
[~,mxi] = max(diag(D)); % find major axis index: largest eigen-value
or = atan2( V(2,mxi), V(1,mxi) ) * 180/pi ; % convert to degrees for readability
rotate = imrotate( im2, or-180 );
axes(handles.axes2);
imshow( rotate );
set(handles.text3, 'String',or-180);