终于不用手撸了,解放你的双手,教你用数学建模的方式对答题卡进行有效识别
前言
聲明:后期原力計劃活動期間的數學建模類文章都會轉入MATLAB深入理解高級教程(附源碼)專欄。對于理工科類及馬上要畢業設計的小伙伴應該會有很大幫助,有需要的小伙伴趕緊訂閱吧。包括AI系列博文,博主后續會不斷更新該領域的知識。人工智能AI實戰系列代碼全解析
本文介紹如何采用MATLAB進行答題卡識別,屬于圖像處理的應用領域。在這之前我們我們需要普及下基于hough變換的直線檢測知識,具體可參見鏈接給出的博文。
對應的源代碼詳見:
matlab源碼集錦-圖像處理-用數學建模的方式對答題卡進行有效識別
1 答題卡讀取
?
現有答題卡掃描圖像,如下圖所示。
MATLAB中采用imread函數讀取圖像。
p_name?=?"答題卡.jpg"; A=imread(p_name);2 答題卡傾角檢測
考慮有些答題卡有一定的旋轉角度,因此需要利用hough變換原理進行直線檢測。首先,將讀取的答題卡圖像轉化為灰度圖像(rgb2gray),其次,采用canny算子進行邊緣檢測(edge),最后基于Hough變換進行直線檢測并計算出傾斜角度(hough)。
gray=rgb2gray(A); bw=edge(gray,'canny'); [h,t,r]=hough(bw,'RhoResolution',0.5,'ThetaResolution',0.5); P=houghpeaks(h,2); lines=houghlines(bw,t,r,P,'FillGap',50,'Minlength',7); imshow(gray); hold?on; max_len=0; for?i=1:length(lines)xy=[lines(i).point1;lines(i).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','g');plot(xy(:,1),xy(1,2),'x','LineWidth',2,'Color','y');plot(xy(:,1),xy(2,2),'x','LineWidth',2,'Color','r'); end x=lines.theta;?
?
傾角檢測
3 答題卡位置校正
上節中答題卡檢測的傾角計算為,將圖像旋轉-x角度(imrotate)
B=imrotate(gray,x); imshow(B);?
?
答題卡位置校正
4 答題卡二值化
圖像的二值化處理就是將圖像上的點的灰度值為0或255,也就是將整個圖像呈現出明顯的黑白效果。即將256個亮度等級的灰度圖像通過適當的閾值選取而獲得仍然可以反映圖像整體和局部特征的二值化圖像。
在數字圖像處理中,二值圖像占有非常重要的地位,特別是在實用的圖像處理中,以二值圖像處理實現而構成的系統是很多的。
二值圖像的處理與分析,首先要把灰度圖像二值化,得到二值化圖像,方便對圖像做進一步處理時,圖像的集合性質只與像素值為0或255的點的位置有關,不再涉及像素的多級值,使處理變得簡單,而且數據的處理和壓縮量小,MATLAB中采用im2bw函數。
T=graythresh(B); result=im2bw(B,T);?
答題卡二值化
5 答題卡答案識別
核心思想就是利用圖像的像素位置找到每個選擇題,再通過ABCD答案像素位置的閾值進行判定所選的答案。首先測得答題區域第一題A選項左上角的坐標,分別確定上下兩個掃描區域的距離,左右兩個掃描區域的距離,上下相鄰填涂區域上邊線的距離、填涂區域的長度、填涂區域的寬度, ?對灰度值統計矩陣里的數值進行處理,大于某一閥值的值賦1,其余的賦0。
n=135;m=615;%?首先測得答題區域第一題A選項左上角的坐標(52,244) s=60;t=55; interval_length=30; interval_width=10; length=10; width=15; a2=zeros(4,1); t1=0; for?D=1:2for?S=1:5if?D==1&&(S==3||S==4||S==5)elset1=t1+1;for?P=1:5for?Q=1:4m1=m+(Q-1)*(width+interval_width)+(S-1)*(s+(4*width+3*interval_width));m2=m1+width;n1=n+(P-1)*(length+interval_length)+(D-1)*(t+(5*length+4*interval_length));n2=n1+length;al=result(m1:m2,n1:n2);a2(Q)=sum(sum(al));endswitch?find(a2<110)case?1jieguo{t1,P}='A';case?2jieguo{t1,P}='B';case?3jieguo{t1,P}='C';case?4jieguo{t1,P}='D';endendendend end?
答題卡識別結果
?
總結
以上是生活随笔為你收集整理的终于不用手撸了,解放你的双手,教你用数学建模的方式对答题卡进行有效识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MATLAB实战系列(二十三)-基于ho
- 下一篇: R语言实战应用精讲50篇(七)-因子