天天看點

【答題卡識别】Hough變換答題卡識别【Matlab 250期】

一、答題卡識别簡介

研究答題卡識别軟體的設計與開發,內建了圖像分割、模式識别等領域的功能子產品,涉及計算機圖像處理的一系列知識。通過圖像處理技術,系統能夠識别答題卡圖像的答案選項,再通過輸入正确答案的答題卡并與之對照,進而對學生答題卡進行判别并計算出分數。本案例側重于圖像識别方面的實作,應用了圖像校正、模式識别等方面的算法。

1 理論基礎

答題卡自動閱卷系統通過擷取答題卡圖像作為系統輸入,并通過計算機處理、自動識别填塗标記,存入資料庫完成閱卷。在圖像數字化的過程中,受裝置、環境等因素的影響,答題卡圖像的品質在一定程度上下降,影響自動閱卷的準确率,甚至導緻無法正常閱卷。是以,要對所擷取的圖像進行一系列的預處理,濾去幹擾、噪聲,做幾何校正、彩色校正等操作,并進行二值化處理,以確定後續步驟能順利進行。

1.1 圖像二值化

彩色圖像經過灰階化處理後得到灰階圖,每個像素都僅有一個灰階值,該灰階值的大小決定了像素的亮暗程度。在答題卡自動識别實驗中,根據答題卡圖像答案目标的色彩特點,為了友善地進行目标答案的檢測和識别,我們需要對灰階圖像進行二值化處理,也就是說各像素的灰階值隻有0和1兩個取值,用來表示黑白兩種顔色,這樣可以大大減少計算的資料量。

在對答題卡圖像進行二值化的過程中,門檻值的選取是關鍵,直接影響到目标答案是否能被正确識别。根據二值化過程中的門檻值選取的來源不同,門檻值選取方法可以分為全局和局部兩種。鑒于答題卡圖像的應用場景,不同考生填塗答題卡的深淺度往往不同。如果采用由使用者指定門檻值的方法,則可能會産生對每張答題卡都需要進行門檻值調整的要求,而且在光照不均勻等因素的影響下往往會出現目标區域二值化異常的現象。是以,在本案例中采用局部平均門檻值法來自動确定門檻值,當像素點的灰階值小于門檻值時,則将該點的數值置為0,否則将數值置為1。該算法在不同的圖像區域所選擇的門檻值會自動調整,也消除了光照不均勻等因素的幹擾,同時在光照明暗變化時能自動調整門檻值的大小。等待系統載入答題卡圖像,進行灰階化化等預處理後再進行二值化,将有效突出答案目标的顯示效果。

1.2 傾斜校正

在答題卡圖像采集的過程中,由于種種原因,可能會導緻所采集得到的答題卡圖像有某種程度的傾斜,為了得到準确的閱卷結果,需要進行必要的傾斜糾正處理。答題卡圖像的傾斜校正一般分為兩步:第一步,查找傾斜角度;第二步,進行坐标變換,得到校正後的圖像。其中, 常用的傾斜角度查找方法有兩種:一種是利用Hough變換來找出傾斜角度;另一種是利用角點檢測來找出傾斜角度。根據答題卡圖像樣式固定的特點,本案例采用Hough變換來進行傾斜角度的計算。

Hough變換作為一種參數空間變換算法, 自從1962年被Hough提出之後, 便成為直線和其他參數化形狀檢測的重要工具。Hough變換具有較強的穩定性和魯棒性, 可以在一定程度上避免噪聲的影響, 而且易于并行運算2。是以, Hough變換被不斷地研究并取得大量進展, Duda和Halt将極坐标引入Hough變換, 使這種方法可以更加有效地用于直線檢測和其他任意幾何形狀的檢測。Ballard提出了非解析任意形狀的R表法, 将Hough變換推廣到對任意方向和範圍的非解析任意形狀的識别, 這種方法被稱為廣義Hough變換。

直線y=mx+b可用極坐标表示為:

【答題卡識别】Hough變換答題卡識别【Matlab 250期】

也可表示為:

【答題卡識别】Hough變換答題卡識别【Matlab 250期】

其中,1式中的(r,6)定義了一個從原點到該直線最近點的向量,顯然,該向量與該直線垂直,如圖所示。

【答題卡識别】Hough變換答題卡識别【Matlab 250期】

假設以參數r和0構成一個二維空間,則x、y平面上的任意一條直線對應了r、0平面上的一個點。是以, x、y平面上的任意一條直線的Hough變換就是尋找r、0平面上的一個對應點的過程。

假設x、y平面上有一個特定的點(xo,yo),經過該點的直線可以有很多條,每一條都對應了r、0平面中的一個點,這些點必須是滿足以xo、yo作為常量時的1式。是以,根據1式的定義可以發現,在參數空間與x、y空間中所有這些直線對應點的軌迹是一條正弦型曲線,即x、y平面上的任意一點對應了r、0平面上的一條正弦曲線。如果有一組位于由參數ro和0決定的直線上的邊緣點,則每個邊緣點對應了r、0空間的一條正弦型曲線。由于這些曲線均對應了同一條直線參數,是以所有這些曲線必交于點

(ro,0o)。

在實際計算的過程中,為了找出這些點所構成的直線段,我們可以将r、0空間進行網格化,進而将其量化成許多小格,并初始化各小格的計數累加器。根據每一個(x0,yo)點的極坐标公式,可以根據其代入0的量化值,算出各個r的值,如果經量化後的值落在某個小格内,則使該小格的計數累加器加1;當全部(x,y)點變換後,對小格計數器進行統計,包含較大計數值的小格對應于共線點,并且(r,0)可作為直線拟合參數;包含較小計數值的小格一般對應于非共線點,丢棄不用。通過以上過程可以看出,如果r、0網格量化度量過大,則其參數空間的聚合效果較差,進而很難查找直線的準确的r、0參數;同理,如果r、0網格量化度量過小,則計算量會随之增大,影響查找效率。是以,在計算過程中需要綜

合考慮這兩方面,選擇合适的網格量化路徑成本2。

由于Hough變換需要進行網格掃描處理, 運作速度往往較慢, 是以在進行直線檢測和傾斜角度計算時,需要考慮的一個重要因素就是計算量的問題。其中,計算量與搜尋角度步長0, 和搜尋角度範圍0, 密切相關。是以, 采用多級Hough變換, 通過設定角度搜尋步長由大到小來進行直線檢測和傾斜角度計算, 可以有效降低算法的計算量。多級Hough變換首先用較大的0,和0,以求出傾斜角度的大緻範圍,這類似于人眼主觀估計的過程。然後用較小的0,和0,對傾斜角度進行細化處理,對于某些應用場景甚至可以求出約0.02°的傾斜, 這類似于人眼仔細估計的過程。是以, 采用多級Hough變換比直接應用Hough變換在運算速度上有了較大提高。

在計算答題卡圖像的傾斜角度時,為了消除塗抹區域部均勻的影響,對已擷取的滿足上述特征的極大值對應的傾斜角度,可采用算術平均的方式進行優化處理。假設每行答題區對應的傾斜角度為0;(i=1,2,…,N,N通常為答題區的總行數),則圖像的傾斜角度0m

由3式給出:

【答題卡識别】Hough變換答題卡識别【Matlab 250期】

擷取答題卡圖像的傾斜角度後,可以對圖像進行旋轉處理。假設點(x.,)o)繞點(a,b)旋轉0度後坐标為(x,y),旋轉後中心坐标為(c,d),則:

【答題卡識别】Hough變換答題卡識别【Matlab 250期】

圖像旋轉可能會引起圖像的高度和寬度範圍的改變,結合答題卡圖像周邊區域的特點,我們對旋轉圖像超出範圍的周邊區域進行了删除處理。同時,為了盡可能保持圖像的完整性,在進行旋轉時以圖像的中心位置作為旋轉中心進行計算,對答題卡圖像進行傾斜校正的效果。

1.3 圖像分割

圖像分割是圖像進行中常用的關鍵步驟之一,本案例涉及對答題卡圖像有效區域的檢測和分割。一般情況下,對灰階圖像的分割通常可基于像素灰階值的兩個性質:不連續性和相似性。圖像固定區域内部的像素一般都具有灰階相似性,而在不同區域之間的邊界上一般具有灰階不連續性,也就是我們常說的區域邊緣屬性。是以,灰階圖像分割方法一般可以分為基于區域的方法和基于邊界的方法。前者利用區域内的灰階相似性進行分割,後者利用區域間的灰階不連續性進行分割。根據分割過程中選擇的運算政策不同,分割算法又可分為并行算法和串行算法。在并行算法過程中,所有檢測和分割都可獨立和同時地進行,利于提高運算效率曰。在串行算法過程中,後續的處理流程要用到之前的步驟得到的結果,要求程式運作具有連續性。

基于區域的分割方法

基于區域的分割方法以區域内像素的相似性特征為依據,将圖像劃分成一系列有意義的獨立區域,實作分割的目标。圖像進行區域分割一般有以下特征。

(1)一緻性。圖像分割後的區域應在某些特征方面表現出一緻性,如灰階、顔色或紋理。

(2)單一性。區域内部目标分布單一,不能包含太多孔洞。

(3)差異性。區域内部的同一特征在相鄰區域間應有明顯的差異性。

(4)準确性。區域間的分割邊界應該有光滑性,且邊界的空間位置準确。

基于區域的分割方法常用的有灰階門檻值法和區域增長法等,其特點是充分利用了區域内像素特征的相似性。

2 程式實作

本案例提出了一種能夠有效識别答題卡的方法, 利用基于Hough變換的直線檢測技術檢測圖像的傾斜度,對存在傾斜的圖像進行旋轉校正,最終實作答題卡答案的定位和檢測。其中,在識别過程中使用像素灰階積分統計的方法,具有較低的誤識别率,能夠準确定位答題卡的塗卡痕迹。下面介紹程式實作過程中的關鍵步驟。

2.1 圖像灰階化

根據答題卡圖像的自身特點,本實驗要求輸入的圖檔為灰階格式,并将采集到的答題卡圖檔經灰階化處理後存儲到硬碟的指定檔案夾,用于檢測識别。采用灰階圖像進行存儲能顯著減少檔案所占用的硬碟空間,而且能提高圖像處理識别的速度。一般而言,可采用權重平均值法對原始RGB圖像進行灰階化處理, 該方法的主要思想是從原圖像中取R、G、B各層像素值并經過權重求和得到灰階圖的亮度值。現實生活中,人眼對綠色(G)敏感度最高,對紅色®敏感度次之,對藍色(B)敏感度最低,是以為了選擇合适的權值對象使之能夠輸出合理的灰階圖像,權值系數應該滿足G>R>B.實驗和理論證明,當R、G、B的權值系數分别為0.299、0.587和0.114時,能夠得到最适合人眼觀察的灰階圖像。

2.2 灰階圖像二值化

圖像二值化是圖像處理的基本技術之一,而門檻值的選取則是圖像二值化的關鍵步驟。一般而言,對于灰階圖像來說,可适當選擇一個或若幹個灰階值T(0≤T≤255)來進行二值化,将目标和背景分開,這個灰階值T就稱為門檻值。是以,對于答題卡圖像來說,根據考生填塗答題卡的答案目标區域特點,可選擇适當的門檻值T進行二值化。當像素點的灰階值小于T時,則将該點的顔色值置為“0”,否則将其顔色值置為“1”。這樣就得到了隻包含黑白兩種顔色的二值圖像。

2.3 圖像平滑濾波

圖像平滑濾波是一種實用的數字圖像處理技術,主要是為了減少圖像的噪聲,常用的有中值濾波、均值濾波等方法。中值濾波指将像素鄰域的灰階值進行排序後取中位數值作為中心像素的新灰階值。答題卡圖像在采集過程中經常會遇到随機噪聲的幹擾,該噪聲一般是鄰域中亮度值發生随機突變的像素,并且經排序後往往出現在序列的隊首或隊尾,故經中值濾波後答題卡圖像的随機噪聲能得到有效消除。

2.4 圖像校正

對答題卡圖像進行校正處理主要是進行圖像旋轉操作,便于後續的檢測和識别。圖像旋轉的算法很多,本實驗采用的算法思路為:将需調整的答題卡圖像讀取到記憶體中,計算圖像的傾斜角度,依據所得的傾斜角度旋轉圖像,得到校正圖像。根據答題卡圖像的特點,答題卡的有效資訊往往位于整幅圖像的特定部位,一般包括考生準考證号區域、答案區域和考試科目區域三大部分,是以對這些區域進行精确的定位即可提取圖像的特征資訊。答題卡圖像一般由明确的矩形框和直線組成,在進行區域定位時選擇Hough變換來進行直線檢測, 進而擷取定位資訊, 計算傾斜角度, 之後進行圖像旋轉來得到校正結果。

2.5 填寫檢查

考生在塗卡時,由于種種原因可能會出現重選、漏選等錯誤,可根據對識别結果的影響分兩種情況進行處理:一種情況是如果考生的基本資訊如專業、科目、班級、學号、試卷類型等客觀資訊出現重選、漏選錯誤,則在系統識别後會立即給出錯誤提示,要求确認修改圖像或重新采集圖像;另一種情況是如果考生填塗答案時出現重選、漏選錯誤,則可按答案選擇錯誤對待,并将識别結果記入存儲結構。最後,系統根據事先錄入的标準答案與識别存儲結構進行自動評分,進而獲得每名考生的考試成績資訊。

備注:此簡介僅作為理論參考,與本案例實際略有出入

二、部分源代碼

clc; clear all; close all;
warning off all;
I = imread('images\\1.jpg');
I1 = Image_Normalize(I, 0);
hsize = [3 3];
sigma = 0.5;
I2 = Image_Smooth(I1, hsize, sigma, 0);
I3 = Gray_Convert(I2, 0);
bw2 = Image_Binary(I3, 0);
[~, ~, xy_long] = Hough_Process(bw2, I1, 0);
angle = Compute_Angle(xy_long);
[I4, bw3] = Image_Rotate(I1, bw2, angle*1.8, 0);
[bw4, Loc1] = Morph_Process(bw3, 0);
if nargin < 3
    flag = 1;
end
[H, T, R] = hough(bw);
P = houghpeaks(H, 4, 'threshold', ceil(0.3*max(H(:))));
lines = houghlines(bw, T, R, P, 'FillGap', 50, 'MinLength', 7);
max_len = 0;
for k = 1 : length(lines)
    xy = [lines(k).point1; lines(k).point2]; 
    len = norm(lines(k).point1-lines(k).point2); 
    Len(k) = len;
    if len > max_len
        max_len = len;
        xy_long = xy;
    end
    if nargin < 5
    flag = 1;
end
Line1 = Line{1};
Line2 = Line{2};
Line3 = Line{3};
Line4 = Line{4};
yn1 = round(Line1(1, 2) + 0.18*(Line2(1, 2)-Line1(1, 2)));
yn2 = round(Line1(1, 2) + 0.34*(Line2(1, 2)-Line1(1, 2)));
yn3 = round(Line1(1, 2) + 0.50*(Line2(1, 2)-Line1(1, 2)));
Linen1_1 = [Line1(1, 1) yn1; Line1(2, 1) yn1];
Linen2_1 = [Line1(1, 1) yn2; Line1(2, 1) yn2];
Linen3_1 = [Line1(1, 1) yn3; Line1(2, 1) yn3];
% 定位豎直網格分割線
xn1 = round(Line3(1, 1) + 0.22*(Line4(1, 1)-Line3(1, 1)));
xn2 = round(Line3(1, 1) + 0.26*(Line4(1, 1)-Line3(1, 1)));
xn3 = round(Line3(1, 1) + 0.48*(Line4(1, 1)-Line3(1, 1)));
xn4 = round(Line3(1, 1) + 0.52*(Line4(1, 1)-Line3(1, 1)));
xn5 = round(Line3(1, 1) + 0.73*(Line4(1, 1)-Line3(1, 1)));
xn6 = round(Line3(1, 1) + 0.77*(Line4(1, 1)-Line3(1, 1)));
xn7 = round(Line3(1, 1) + 0.98*(Line4(1, 1)-Line3(1, 1)));

Linen1_2 = [xn1 Line3(1, 2); xn1 Line3(2, 2)];
Linen2_2 = [xn2 Line3(1, 2); xn2 Line3(2, 2)];
Linen3_2 = [xn3 Line3(1, 2); xn3 Line3(2, 2)];
Linen4_2 = [xn4 Line3(1, 2); xn4 Line3(2, 2)];
Linen5_2 = [xn5 Line3(1, 2); xn5 Line3(2, 2)];
Linen6_2 = [xn6 Line3(1, 2); xn6 Line3(2, 2)];
Linen7_2 = [xn7 Line3(1, 2); xn7 Line3(2, 2)];
ym1_1 = round(Line1(1, 2) + 0.32*(Linen1_1(1, 2)-Line1(1, 2)));
ym2_1 = round(Line1(1, 2) + 0.5*(Linen1_1(1, 2)-Line1(1, 2)));
ym3_1 = round(Line1(1, 2) + 0.65*(Linen1_1(1, 2)-Line1(1, 2)));
ym4_1 = round(Line1(1, 2) + 0.80*(Linen1_1(1, 2)-Line1(1, 2)));
ym5_1 = round(Line1(1, 2) + 0.95*(Linen1_1(1, 2)-Line1(1, 2)));
Linem1_1 = [Line1(1, 1) ym1_1; Line1(2, 1) ym1_1];
Linem2_1 = [Line1(1, 1) ym2_1; Line1(2, 1) ym2_1];
Linem3_1 = [Line1(1, 1) ym3_1; Line1(2, 1) ym3_1];
Linem4_1 = [Line1(1, 1) ym4_1; Line1(2, 1) ym4_1];
Linem5_1 = [Line1(1, 1) ym5_1; Line1(2, 1) ym5_1];

ym1_2 = round(Linen1_1(1, 2) + 0.25*(Linen2_1(1, 2)-Linen1_1(1, 2)));
ym2_2 = round(Linen1_1(1, 2) + 0.40*(Linen2_1(1, 2)-Linen1_1(1, 2)));
ym3_2 = round(Linen1_1(1, 2) + 0.60*(Linen2_1(1, 2)-Linen1_1(1, 2)));
ym4_2 = round(Linen1_1(1, 2) + 0.75*(Linen2_1(1, 2)-Linen1_1(1, 2)));
ym5_2 = round(Linen1_1(1, 2) + 0.90*(Linen2_1(1, 2)-Linen1_1(1, 2)));
Linem1_2 = [Line1(1, 1) ym1_2; Line1(2, 1) ym1_2];
Linem2_2 = [Line1(1, 1) ym2_2; Line1(2, 1) ym2_2];
Linem3_2 = [Line1(1, 1) ym3_2; Line1(2, 1) ym3_2];
Linem4_2 = [Line1(1, 1) ym4_2; Line1(2, 1) ym4_2];
Linem5_2 = [Line1(1, 1) ym5_2; Line1(2, 1) ym5_2];
end
           

三、運作結果

【答題卡識别】Hough變換答題卡識别【Matlab 250期】

四、matlab版本及參考文獻

1 matlab版本

2014a

2 參考文獻

[1] 蔡利梅.MATLAB圖像處理——理論、算法與執行個體分析[M].清華大學出版社,2020.

[2]楊丹,趙海濱,龍哲.MATLAB圖像處理執行個體詳解[M].清華大學出版社,2013.

[3]周品.MATLAB圖像處理與圖形使用者界面設計[M].清華大學出版社,2013.

[4]劉成龍.精通MATLAB圖像處理[M].清華大學出版社,2015.