文檔圖像傾斜角檢測及校正(二)
- 最小距離法直線擬合原理
- Matlab程序
閱讀之前注意:
Hi,你好,我是Cooper Liu,歡迎來到我寫的“文檔圖像校正”系列博客。基於三種原理,我寫了四個實驗性的Matlab驗證程序,以及兩個文檔校正Matlab程序。在這裏你將能夠獲取所有的源代碼以及測試圖片,完全可以在你自己的Matlab上跑這些程序。
如果你是學生,請注意不要抄襲,課程設計作業的話,這種程序僅僅只能讓你得到80%左右的成績。
如果你是工作人士或者只是感興趣的極客,Okay,我想這些程序對於理解原理是如何應用爲程序的已經足夠 。最後,請勿將這些資源用於商業用途(如你所見,這些程序都非常的初級)或者是謀取個人利益,知識在傳播的過程中能展現更大的價值^-^
本文閱讀建議用時:32min
本文閱讀結構如下表:
項目 | 下屬項目 | 測試用例數量 |
---|---|---|
最小距離法直線擬合原理 | 無 | 0 |
Matlab程序 | 無 | 1 |
最小距離法直線擬合原理1
最小距離法擬合直線是指,我們設線條上n個特徵點:
則稱
爲了計算和敘述的方便,我們引入以下的記號:
所以文檔的傾斜角爲:
Matlab程序
基於以上原理,我編寫了Matlab程序來進行實驗,源代碼可以參考angleDetection2.m文件。測試圖片爲line5.bmp。2
測試圖片可以從這裏獲取,鏈接:https://pan.baidu.com/s/1dGmmGjn 密碼:okt3
以下是實驗結果:
如果您不想打開新的頁面查看matlab源代碼,也可以直接參考以下代碼:
%%本版基於最小距離法直線擬合原理
%%2018.01.19 by Cooper Liu
%%Questions? Contact me: [email protected]
clear;clc; %清空之前的變量
I=imread('line5.bmp'); %讀取圖像
level=graythresh(I); %使用最大類間方差法找到圖片的一個合適的閾值
bw=im2bw(I,level); %根據閾值,使用im2bw函數將灰度圖像轉換爲二值圖像時
figure(1);imshow(bw);
[m,n]=size(bw); %獲取尺寸
xSum=0;xCount=0;
ySum=0;yCount=0;
tic; %計時開始
for i=1:m
for j=1:n
if bw(i,j)==0
xSum=xSum+i;xCount=xCount+1;
ySum=ySum+j;yCount=yCount+1;
end
end
end
xMean=xSum/xCount;
yMean=ySum/yCount;
Lxx=0;
Lyy=0;
Lxy=0;
for i=1:m
for j=1:n
if bw(i,j)==0
Lxx=Lxx+(i-xMean)^2;
Lyy=Lyy+(j-yMean)^2;
Lxy=Lxy+(i-xMean)*(j-yMean);
end
end
end
toc %獲取計時時間
tmp=((Lyy-Lxx) + nthroot((Lyy-Lxx)^2 + 4*Lxy^2, 2))/(2*Lxy);
if isnan(tmp)
tmp=inf; %如果求得tmp是NaN,那麼不需要旋轉
end
%tmp=atan(2*Lxy/(Lxx-Lyy))/2; %如果傾斜角相對於水平超過正負45
angle=atan(tmp); %用atan求出來的角度在-pi/2到+pi/2之間
angle=angle*180/pi
rot=90-angle;
pic=imrotate(I,rot,'crop'); %旋轉圖像
figure(2);imshow(pic);