2014-01-15 69 views
-1

旋轉見下圖:檢測文本的角度在水平方向圖像和MATLAB

正如你可以在圖片中看到的90度角度旋轉的書面文字,我想旋轉只有文字是水平的。不管怎麼角度它旋轉我希望把它水平如下:

我不想在旋轉的完整的圖像。我希望文本只有有界,文本旋轉的角度被測量,然後旋轉該角度使其水平。

你能否建議我這樣做,然後在文本上貼上一個橢圓?

謝謝。

+0

類似的任務:http://stackoverflow.com/questions/32227347/how-can-i-detect-the-dimensions-of-an-object-under-an-angle-in這個圖片在m/32228759#32228759 – Shai

回答

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. 

計算文本的協方差矩陣座標

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); 

enter image description here


繪製橢圓給定協方差矩陣:

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); 

enter image description here

+0

我理解它的大部分,但是在MATLAB中有一個函數'quiever',我使用MATLAB R2012b,我沒有找到任何這樣的函數,我得到了'顫抖' http://www.mathworks.in/help/matlab/ref/quiver.html – Ritz

+0

@Ritz我的錯字 - 糾正。謝謝。 – Shai

+0

您好先生, 我用你的代碼,並將它組裝在一起http://pastebin.com/aPVzQEdp 但我沒有得到所需的輸出:http://imgur.com/TjFK2lq – Ritz

0

我用這個解決方案:

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); 

screen shot