孫宏昌,胡锃澤,閆偉偉
(1.天津職業技術師范大學 機器人及智能裝備研究院,天津 300222;2.天津市智能機器人技術與應用企業重點實驗室,天津 300222;3.黃山市科美環境科技股份有限公司,安徽 黃山 245400)
在農業、食品、醫學等行業中,職業工作者可以通過計算機減少工作強度,提升工作效率[1]。本研究根據現有研究現狀的問題,提出了一種基于改進最大類間方差法結合霍夫變換(Otsu + Hough)的圖像處理算法;對工業攝像機拍攝的菌落圖像利用Python-OpenCV 進行去噪、濾波、圖像增強等預處理,接著使用改進的大津法進行處理[2]得到菌落的二值圖像。為避免培養皿邊緣對計數結果的影響,通過Hough 方法去除培養皿邊緣,最后遍歷圖像尋找并描繪出菌落的邊緣輪廓[3],計算菌落封閉輪廓面積并對其按順序進行標號,完成菌落計數。
鑒于對微生物檢測控制平臺的要求和目前實驗室現狀,選擇了該機械臂作為微生物檢測控制平臺,如圖1 所示。運動控制卡選擇開放式多軸運動控制器,相當于功能齊全的小型計算器。運動控制卡通過接受上位機Labview 程序指令后,發送信號給機械臂,操控升降臂和伸縮臂對微生物培養皿進行運動,將其放置到合適攝像頭獲取圖像的位置。

圖1 升降、伸縮機械臂
通過調用Labview 中的節點函數就可以完成對運動控制卡提供的運動函數動態鏈接庫的控制,在實際使用Labview 中節點函數調用時,需要根據函數的參數類別對輸出、輸入參數進行一定的配置才能直接調用。如圖2 所示為Labview 中的程序框圖。

圖2 Labview 程序
經過圖像采集系統直接得到微生物圖像因為噪點、色彩等問題會直接影響最后的精度,所以需要先進行圖像預處理。將菌落圖像進行圖像分割,可以將圖像和背景相分離,不光簡化后續冗雜的過程,也能給后續計數工作奠定基礎及提供便利,最后去除培養皿邊緣后即可得到菌落計數數量。使用OpenCV 庫作為菌落計數算法開發的圖像處理工具,如圖3 所示,對菌落進行自動計數分為以下4 個步驟:

圖3 菌落計數流程
(1)菌落圖像預處理:在得到相關圖像后對其進行灰度變換、去噪濾波和圖像增強等預處理[4]操作,可以使得后續處理更加方便快捷,提高計數精度。
(2)菌落圖像分割處理:使用Otsu 算法對圖像進行分割[5],將目標檢測物與背景相分離,最理想情況是將背景中所有菌落都分離出來。
(3)去除菌落培養皿邊緣圖像:利用Hough 變換尋找培養皿邊緣圓心并根據已知培養皿半徑去除培養皿邊緣,確定計數范圍,減少計數誤差。
(4)菌落計數:通過計算每個封閉區域的面積完成菌落計數。
菌落圖像采集設備采集到菌落圖像如圖4 所示,因為成像系統亮度的響應范圍都有一定限度,所以圖像存在亮度峰值和最小值之比較低的問題,不利于圖像的觀察、處理、分析,針對采集到的菌落圖像對其進行灰度變換,可以增強對比度,提高圖像的視覺表現效果,也為后續圖像增強打下了基礎。受到各種不可控的主客觀因素的影響,圖像在采集和傳輸中會出現噪聲、失真等問題,圖像需要經過增強才可以滿足使用需求。利用圖像增強可以放大圖像特征,有效減少負面影響,增強視覺效果。

圖4 菌落原圖像
(1)灰度變換:一副完整的菌落采集圖像一般由紅色(R)、綠色(G)、藍色(B)3 個通道組成,而灰度圖像是只有純白通道,為了保證菌落之后算法的處理復雜度和精確度,因此將采集到三通道的彩色圖片變成只有單通道的灰度圖像。將菌落采集設備采集到的菌落待處理圖像進行加權處理,彩色圖像的紅、綠、藍三元色像素最終變成灰度圖像中對應像素點的灰度值,處理結果如圖5 所示。

圖5 菌落灰度處理圖像
(2)圖像增強:在圖像采集、圖像傳播、圖像生成等過程中會由于一些外部因素影響,比如光照、噪聲等因素,對采集到的圖像質量產生噪聲干擾,需要對圖像進行濾波處理,否則會因為畫面的失真和圖片中的噪點給后面菌落計數算法造成難度,降低其準確性。選用中值濾波[6]對圖像進行濾波降噪處理;中值濾波算法以3×3 濾波函數窗口,計算點(x,y)為中心周圍鄰域八個格子的像素值以升序排列,并以排列的像素中值作為目標像素(x,y)的新像素值。中值濾波相關原理如圖6 所示,降噪之后處理效果如圖7 所示。

圖6 3×3 中值濾波原理

圖7 菌落中值濾波圖像
傳統Otsu 算法[7]操作理論簡單、意義明確,是一種動態計算確定圖像分割閾值的自動無監督圖像分割算法。該算法[8]利用灰度圖像直方圖在目標圖像和背景中存在的較大差異來得確定最佳閾值大小,將背景與目標圖像相分離。傳統的Otsu 算法處理圖像時,將原圖像中的像素點分成了2 個部分:背景的像素點和圖像的像素點,但由于算法只考慮到了將圖像分割成背景和目標圖像2 個方面,當背景和目標灰度值相近時區分困難。將原圖像的分割類別分為三大類進行閾值分割,分別分割成“背景圖像”“邊緣點”和“目標圖像”,在對“邊緣點”的像素點進行單獨討論,將邊緣點進行再次分類,最后將圖像分割成背景或目標圖像。改進的Otsu 算法一定程度上解決了背景和目標灰度值相近時,傳統Otsu 算法難以分割兩者的問題,并且有比傳統Otsu 算法更好的自適應性和準確性。
假設灰度圖像的大小為N×M,L(0,1,2,…,L-1)為F(x,y)的灰度級數,其中灰度值i(i?{0,1,2,…,L-1})像素個數為ni,將灰度圖像分為三大類C0、C1、C2,分別為:“背景圖像”“邊緣點”和“目標圖像”。最大類間方差閾值分別設為k和m,C0類像素灰度級為[0,1,…,k],C1類像素灰度級為[k+1,k+2,…,m],C2類像素灰度級為[m+1,m+2,…,L-1]。其改進的Otsu算法的最大類間方差定義為:
其中三大類C0、C1、C2出現的可能性和其灰度均值分別為:ω0,ω1,ω2和μ0,μ1,μ2(n= 0,1,2)。
其每個類的最大類間方差為:
綜上所述,可以得知:
對其式(4)兩邊對k和m分別求偏導并且讓偏導數為0 可以得到:
當所求閾值m,k滿足式(5)(6)的關系時,閾值分割效果最佳。當算法根據高、低閾值進行遍歷時,將灰度值比低閾值小的像素點去除,反之保存,如果某像素點的灰度值在上述兩者之間,像素點有可能是目標,也可能是背景,需要對其模的最大值方向和圖像邊緣走向計算來確定其歸屬。將圖像的像素梯度幅值分為l個級別,并計算該像素點和其鄰域的梯度模值,如果其模的大小在鄰域內為最大值,那么該像素點為目標,否則應當去除。改進算法和傳統算法經過處理后的圖像分別為圖8 所示。

圖8 改進算法比較
在實際菌落生長過程中,會有部分菌落和培養皿邊緣產生粘連現象,培養皿邊緣像素處理不當會對計數結果產生一定負面影響。如果在粘連情況下直接利用文獻[9]中的方法去除培養皿邊緣,會造成很大的計數誤差。對此問題,采用Hough 變換[10]來檢測圓形培養皿邊緣區域,從而有效地剔除培養皿邊緣以及邊緣以外信息,同時保留與培養皿邊緣產生粘連的菌落信息,保證計數的準確性。
利用Hough 變換的算法把圓檢測出之后,同時能得到霍夫圓的圓心坐標,根據培養皿的直徑R即可再次遍歷圖像上的像素點,并以Hough 圓的圓心,以R為半徑的圓及其外部像素全部置為0 或255 即可將培養皿的邊緣剔除,剔除邊緣后的菌落圖像如圖9 所示。

圖9 剔除培養皿邊緣后的圖像
為了驗證基于改進Otsu + Hough 圖像處理算法的菌落計數算法是否能夠解決實際問題,對實際圖像采集設備待處理圖片進行相關算法測試,實驗運行算法環境為Python 的OpenCV 庫,其具體算法流程圖如圖10 所示。在圖像經過圖像預處理后,對相應二值圖像進行遍歷處理,尋找在同一個連通域并且是非零的像素點,如果目標點在相同連通域內,證明其屬于同一個菌落[11]。

圖10 菌落計數算法流程
利用遍歷算法找出所有連通區域后,在二值圖像上繪制相關連通域,設定閾值面積大小,將每個連通域面積和閾值面積大小對比。如果連通域的面積大于預設的閾值,說明連通域為菌落,否則將它當作噪聲來去噪,得到最終的菌落個數。分別對圖8、圖9 進行菌落計數,最終計數結果,如圖11、12 所示。

圖11 培養皿邊緣去除前計數

圖12 培養皿邊緣去除后計數
經過上述分析,本實驗在Python3.7.0 環境下對將近100 多幅圖像進行相關實驗測試,并和人工計數結果相比較。測試結果如表1 所示,實驗結果和人工計數結果偏差率較小,足夠滿足實際運用需求。

表1 菌落計數
為了解決人工計算菌落數的準確率和效率低等問題,提出了一種改進Otsu + Hough 圖像處理算法的菌落自動計數方法。該方法利用改進的Otsu +Hough 算法和多種其他圖像處理算法對采集到的菌落圖像進行處理,根據最后遍歷出來連通域的面積來確定相對應菌落的數量多少。在保證菌落計數的準確性基礎上,提高了計數的工作效率,降低了工作人員工作強度,并且避免了培養皿頻繁取出導致的環境變化對菌落生長產生不良影響。綜上所述改方法在準確率上滿足實驗要求,相對人工計數結果誤差較小,程序平均圖像處理時間較短,適合菌落計數或者同類計數中使用,復現率較高。