張 健 崔英杰
(黃淮學院,河南 駐馬店 463000)
目前雞蛋裂紋檢測方法主要分為有損檢測、無損檢測。聲波信號(AS)是典型的有損檢測方法[1],雖然檢測速度比較快,但是蛋殼在檢測中由于受到了機械振動,很容易產生二次破裂。無損檢測通過采集雞蛋圖像進行外部檢測,不會對雞蛋產生破壞,主要方法有:① 利用神經網絡(Neural Network,NN)對分割出的雞蛋裂紋圖像區域識別,該法準確率較高,并且泛化功能和魯棒性較好[2],但對微小裂紋檢測時正確率較低;② 利用雞蛋圖像紋理特征(ITF)對雞蛋裂紋進行檢測[3],與神經網絡算法相比方法相對簡單,但對復雜裂紋不易檢測;③ 小波模極大值法(WMM)對裂紋明顯的邊緣能達到較好的效果[4],但會丟失雞蛋裂紋的弱邊緣信息;④ 遺傳算法(GA)通過遺傳編碼提高了裂紋區域范圍較大的檢測準確度[5],但易將噪聲誤判為雞蛋裂紋邊緣;⑤ 均值聚類(MC)算法實現較簡單[6],但對灰度幅值較小的雞蛋裂紋檢測存在圖像邊緣不連續,導致斷開現象發生。
粒子群(PSO)算法具有可調參數少,可以全局搜索最優解等優點,有研究學者[7]使用粒子群神經網絡方法識別種蛋成活性,但是粒子群算法對雞蛋裂紋檢測還未見報道。為了使該方法適用于對復雜、微小裂紋的檢測,研究擬采用改進粒子群算法(IPSO),通過余弦函數、正態分布調節慣性權重,粒子反向學習過程避免了過早收斂,對雞蛋圖像自適應閾值分割后進行增強,以期獲得最佳檢測視覺結果。
基本粒子群算法中粒子個體l在時刻t+1的第d維空間速度和位置更新公式:
(1)
式中:
c1、c2——加速系數,c1∈[0,4]、c2∈[0,4];
w——慣性權重;
r1、r2——隨機數,r1∈[0,1]、r2∈[0,1];
粒子個體在算法運行后期會停滯在局部最優值周圍,導致粒子個體不能獲得全局最優值,出現數據坍塌現象,無法收斂,因此需改進基本粒子群算法以解決粒子早熟現象的發生。
1.2.1 動態調整慣性權重 粒子群算法中慣性權重w主要功能是調節全局搜索、局部尋優,w值過大不利于后期局部尋優,過小不利于前期全局搜索;w通過線性遞減方法也不利于算法的運行,特別是如果檢測復雜的雞蛋裂紋,檢測效果較差[8]。因此,需要增加迭代初期的全局搜索范圍和減少迭代后期的局部索搜范圍,動態調整慣性權重策略:
(2)
式中:
tmax——最大迭代次數;
wmax、wmin——慣性權重最大、最小值;
φ——調整因子,φ∈(0,1);
N(0,1)——正態分布。
w通過第1項、第2項最小慣性權重和余弦函數調節,第3項利用正態分布調整慣性權重整體取值分布,φ主要是控制w的偏離程度,這樣使w取值分布更趨于合理,慣性權重動態調整隨迭代次數變化如圖1所示。
從圖1可以看出,在開始時刻w值為0.9,此時增加了粒子的飛翔范圍,具有較大的搜索空間;w隨迭代次數t增加逐漸減小,最終穩定在0.4,方便了后期的局部尋優。
圖1 慣性權重動態調整隨迭代次數變化
1.2.2 反向學習 反向學習利用種群初始最差值和個體歷史最差值的拉動效應,防止粒子落入極值陷阱,快速找到全局最優位置,在反向學習過程中,調整粒子的飛行速度以便于粒子尋化。
(3)
式中:
μ——均值;
σ2——方差;
γ——擾動因子。
反向學習過程中的粒子速度更新公式:
(4)
式中:
c3、c4——加速因子,c3∈[0,4]、c4∈[0,4];
r3、r4——隨機數,r3∈[0,1]、r4∈[0,1];
正常尋優粒子與反向學習粒子對比收斂如圖2所示。
從圖2可以看出,反向學習粒子通過反向學習比正常尋優粒子更早地獲得了最佳收斂值,節省了時間。
圖2 正常尋優粒子與反向學習粒子對比收斂
由于雞蛋形狀差異性導致雞蛋圖像不具有相同性,如果采用固定閾值則不能將雞蛋分割出來,因此根據雞蛋圖像灰度值采用自適應閾值進行雞蛋圖像分割,將預分割圖像分為雞蛋區域和背景區域,雞蛋區域所占像素點個數與整個圖像比值為X0,雞蛋區域平均灰度值是Y0;背景區域所占像素點個數與整個圖像比值為X1,背景區域平均灰度值是Y1,同時整個圖像的平均灰度為Y,雞蛋區域與背景區域的類間方差為Z,則:
(5)
采用遍歷的方法使類間方差Z最大,即目標與背景的差異性最大,則此時閾值T即是最佳分割閾值。
有些雞蛋表面存在大小不一的暗斑點,背光照射使點狀暗斑、線狀暗斑的斑點非常明顯,這些暗斑形成的陰影會干擾裂紋檢測,因此需去除雞蛋裂紋周圍的暗斑點,同時要盡量減少對裂紋區域的影響。經典中值濾波屬于非線性濾波技術,較小的中值濾波窗口能保護雞蛋裂紋圖像的細節信息,但對雞蛋暗斑點噪聲的去除效果不好;較大的中值濾波窗口對暗斑點噪聲有較好的過濾效果,但會使雞蛋裂紋區域變模糊。為了避免中值濾波窗口尺寸難于選擇的缺陷,對其改進如下:假設Wij為中心在(i,j)處的濾波窗口,W0為濾波初始窗口大小,Wmax為允許的最大窗口,設fij為(i,j)處的灰度值,fmax為Wij的最大灰度值,fmin為Wij的最小灰度值,favg為Wij的灰度中值。若當窗口Wij非噪點數量≥8時,用窗口中值替代噪點;窗口Wij非噪點的數量<8,則窗口大小增加2,則進行如下步驟:
由于獲取雞蛋圖像是在背光照射下,因此雞蛋裂紋部分的明亮度要強于其他部分,裂紋會形成中間亮、兩邊暗的條狀條紋,裂紋部分像素的灰度值明顯高于背景像素的灰度值,但是背光照射下雞蛋表面也會產生亮度不均勻現象,同時雞蛋表面非常微小裂紋即使在背光透射照明下也不易檢出,因此需對其進行增強[9]。試驗通過非完全Beta函數F(u)對雞蛋裂紋進行增強:
(6)
式中:
B(α,β)——Beta函數,α∈(0,10),β∈(0,10)。
對雞蛋區域圖像每個像素進行歸一化變換:
(7)
式中:
Lmax、Lmin——分割后雞蛋區域的最大、最小灰度值。
對歸一化雞蛋區域圖像中的每個像素利用非完全Beta函數F(u)進行處理:
(8)
根據雞蛋區域圖像灰度值對區域中的每個像素反變換得到最終增加圖像:
(9)
式中:
當α、β取得最佳組合值時,雞蛋裂紋增強效果才最好,因此參數α、β組合問題即可轉為粒子算法優化處理。
粒子對雞蛋裂紋增強的適應度函數設為:
F=(H+S+D)/3,
(10)
式中:
H——熵值;
S——邊緣內容;
D——灰度標準方差。
(1) 粒子群初始化,隨機產生粒子個體。
(2) 計算粒子的適應度值。
(3) 輸入待檢測雞蛋裂紋圖像。
(4) 按照式(4)進行更新粒子,若更新后適應度值大于原來個體最優值,則將該粒子位置作為個體最優值,若更新后粒子適應度值大于原來全局最優值,則將該粒子位置作為全局最優值。
(5) 判斷是否達到迭代停止條件,連續5次迭代的全局最優值相同或達到最大迭代次數,則進行步驟(6),否則進行步驟(4)。
(6) 輸出檢測結果。
試驗仿真中計算機配置為Intel Core i5-9400,集成顯卡,內存8 GB,Matlab2007實現編程,粒子群總數為300,迭代最大次數設置為600,c1=c2=c3=c4=2。
從圖3、4可以看出,試驗算法對雞蛋網狀裂紋、線形裂紋圖像均能檢測出裂紋,并且裂紋邊緣清晰,一定程度增強了雞蛋的裂紋信息,抑制了斑點噪聲,視覺效果較好,其他算法檢測雞蛋裂紋出現斷紋以及錯誤檢測,不能將雞蛋裂紋信息提取出來,同時對復雜的網狀裂紋檢測錯誤較多,非明顯的線形裂紋則斷紋較多。
圖3 不同算法對雞蛋網狀裂紋檢測的視覺效果
圖4 不同算法對雞蛋線形裂紋檢測的視覺效果
從圖5可以看出,明顯的線形裂紋、網狀裂紋檢測正確率要高于非明顯的線形裂紋、網狀裂紋,這是因為裂紋越復雜,裂紋的交叉點越多,越不容易檢測,但是試驗算法IPSO的不同裂紋正確檢測率均高于其他算法,相比AS、NN、ITF、WMM、PSO、GA、MC檢測明顯的線形裂紋分別高出0.93%,3.31%,5.60%,6.17%,7.37%,8.82%,11.63%;檢測明顯的網狀裂紋分別高出0.74%,3.07%,5.06%,6.13%,7.19%,8.80%,11.01%;檢測非明顯的線形裂紋分別高出1.87%,2.14%,4.53%,4.67%,6.85%,8.80%,10.17%;檢測非明顯的網狀裂紋分別高出1.23%,1.79%,3.37%,4.54%,6.50%,8.07%,10.12%。
圖5 不同裂紋正確檢測率
針對雞蛋裂紋圖像檢測問題,通過余弦函數、反向學習優化粒子群,將雞蛋圖像分割后進行增強,以消除微小
裂紋在背光透射照明下不易檢出的缺陷。結果表明,試驗算法對雞蛋網狀裂紋、線形裂紋圖像均能檢測出裂紋,并且裂紋邊緣清晰,明顯的線形裂紋、網狀裂紋正確檢測率分別為96.4%,94.7%,非明顯的線形裂紋、網狀裂紋正確檢測率分別為89.2%,87.5%,高于其他算法。試驗只針對常見的雞蛋裂紋進行識別,后續將對復雜、多變、無規則的雞蛋裂紋圖像進行識別。