劉小紅
(湖南信息學院,湖南 長沙 410151)
近幾年農業災害研究已成為熱點,隨著手機應用的不斷普及和拍攝圖像方便的特點,已有國內外學者利用Android手機結合圖像處理技術在病害或蟲害診斷方面開展了深入研究,如文獻[1-4]等提到將Android手機端采集的病害或蟲害圖像直接上傳至遠程服務端,服務端對接收的圖像進行相應的處理分析并返回結果。這些研究雖能解決Android手機端圖像處理能力有限和本地Sqlite數據庫檢索能力不足的問題,但是,在進行病害或蟲害圖像遠程診斷時,需上傳病害或蟲害特征清晰的大容量圖像,會導致上傳速度緩慢、消耗數據流量、增大服務端圖像數據處理難度,影響圖像識別的及時性,因此對圖像數據進行壓縮處理成了解決此問題的重要方法。圖像壓縮就是去除冗余,減少圖像數據大小并加速上傳,提高圖像輸出的信噪比[5]。文獻[6-7]提到在Android平臺下對圖像進行JPEG壓縮編碼,雖能高效地壓縮圖像,減少圖像數據和加速圖像上傳速度,但是針對病害圖像,在較高圖像壓縮比的情況下,病害特征清晰度得不到保障,不利于服務端后期的圖像分析和處理,加上病害圖像因拍攝環境、手機像素等影響,在壓縮中加大圖像特征的模糊度,增加服務端對圖像識別的處理難度,從而影響識別的及時性或準確性。
基于以上問題,文中以黃瓜病害圖像為研究對象,在移動端對其進行診斷,采用基于預處理的JPEG圖像壓縮方法進行處理后再上傳,確保在圖像病害特征清晰的前提下,可減少病害圖像數據大小、加快上傳速度、提高遠程診斷的及時性和準確性。
論文主要包括兩部分:圖像預處理壓縮過程和診斷平臺APP。前者將病害圖像進行預處理后繼續壓縮,減少病害圖像數據量;后者利用預處理壓縮技術實現對采集的病害圖像進行數據處理后并上傳診斷,加速圖像上傳速度,及時獲取相關病害的診斷信息。
圖像預處理是提取病害圖像中的病害區域,需要進行圖像分割,而OpenCV正是一種可以進行圖像灰度化、圖像轉換、圖像分割等各種操作的跨平臺圖像處理庫,在手機端應用OpenCV進行圖像病斑分割非常適合[8]。因此系統Android開發環境中需配置OpenCV圖像處理庫。圖像壓縮處理則對提取的病斑圖像在手機端進行壓縮,達到減少圖像大小、加快上傳速度這一目的。Bitmap類中的compress方法是Android系統中最常用的圖像壓縮方法,但圖像壓縮效率不是很高[9]。JPEG2000圖像壓縮標準雖在壓縮效率、性能等方面很出色,但需配備專用壓縮芯片,常應用在圖形圖像處理設備上[10]。JPEG圖像壓縮標準在合適的壓縮比率下,它能在圖像存儲大小和圖像質量之間得到折衷,同時不需要配備專用壓縮芯片,在手機端采用JPEG圖像壓縮標準處理圖像最合適,因此系統開發環境需配置支持JPEG壓縮編碼和解碼功能的Libjpeg圖像處理庫[11]。
文中主要以黃瓜的白粉病、斑點病、炭疽病、霜霉病等幾種病斑圖像作為研究樣本,如圖1所示。

圖1 圖像樣本
在Android端實時采集的黃瓜病斑圖像,需進行裁剪,去除多余部分,減少圖像大小。裁剪后的病斑圖像包含葉片健康區域和病害區域,這兩種區域從視覺上分別以綠色和非綠色二種顏色相交錯。要獲取病斑區域,需要對圖像進行分割去除健康區域。在圖像分割方法中,閾值分割法具有計算簡單、速度快和效率高等優點,不受圖像亮度和對比度影響,廣泛應用于數字圖像分割處理[12-14]。因此系統中采用此方法進行病斑分割,即病害圖像先裁剪、再灰度化、最后利用最大類間方差法(即OTSU算法)進行圖像分割。OTSU算法是將灰度化圖像歸一化處理后,利用閾值將圖像分成背景和前景兩部分,循環計算背景和前景之間的類內方差,求取類內方差為極大值時對應的閾值即為最佳分割閾值[8]。
Otsu閾值分割過程如下:
(1)計算灰度化病害圖像的歸一化直方圖,得到圖像灰度級1~M,總像素數為N,則第i級灰度出現的概率為:Pi=ni/N。
(3)計算直方圖的零階w[k]和一階矩μ[k]:
對一級矩作以下處理:w1=1-w[k];μ0=μ[k]/w[k];μ1=[μ-μ[k]]/[1-w[k]]。
(4)利用公式σ2[k]=w0(μ-μ0)2+w1(μ-μ1)2找到最大的類間方差,對應此方差最大的灰度值即為要找的閾值,k從1~M變化。
(5)利用計算得的閾值進行圖像分割。
圖像預處理過程設計:在移動端將黃瓜病斑圖像,先進行適當裁剪;然后編寫灰度化程序,調用OpenCV中的cvCvtColor()方法,并設置參數code值為CV_BGR2GRAY,將原圖RGB空間轉成灰度化的目標圖;最后利用OTSU算法將灰化圖像進行分割,去除圖像非病斑區域,實現病斑區域的提取。OpenCV中主要有固定閾值、自適應閾值兩種分割方法,其中threshold()方法是對單通道數組進行固定閾值操作[15]。由于病害圖像經過灰度化后,圖像中的灰度不均勻,病斑特征邊緣明顯度有所降低,如果采用固定閾值分割法來處理,效果比較差。而自適應閾值分割即adaptiveThreshold()方法能根據圖像亮度分布的不同,相應地改變閾值,對各個區域出現不同顏色或亮度的病斑,分割的效果比較好。
圖像預處理實驗的效果如圖2所示。
系統壓縮的關鍵是將自適應分割出的病斑區域進行壓縮處理。壓縮后不僅縮小圖像數據大小、節省存儲空間,還能保存重要的病害信息,方便后期圖像處理。JPEG壓縮方法采用順序編碼模式,主要有離散余弦變換(DCT)、量化、哈夫曼編碼等幾個過程[6]。

圖2 圖像預處理示意圖
在病害圖像進行閾值分割后進入壓縮處理過程,先將圖像以8×8進行分塊,再對各個分塊進行DCT變換即空間域數據轉換到頻率域數據,此時病斑數據主要集中在低頻分量上,非病斑數據分布在高頻分量上。要濾除高頻分量,保留低頻分量,需要進行量化處理,利用JPEG亮度和色差量化表通過量化公式對DCT系數進行量化[16-17]。接著將載有病斑信息的低頻分量采用Huffman編碼形式進行編碼,形成JPEG位圖數據流。最后將數據流進行譯碼生成JPEG圖像。壓縮流程如圖3所示。

圖3 JPEG圖像壓縮流程
JPEG圖像壓縮過程如下:
(1)JPEG壓縮處理是針對圖像Y(亮度)Cr(色度)Cb(飽和度)顏色空間,手機在田間收集的實時圖像是RGB色彩空間,進行DCT變換前,要將其轉換為YCrCb色彩空間,其中采樣比例Y∶Cb∶Cr =4∶1∶1,再將圖片劃分為8×8的小塊。
(2)DCT變換(即離散余弦變換),在JPEG壓縮過程中,需將圖片空間域數據轉換到頻率域數據即對每個圖像分塊后,再采用DCT變換公式進行變換[7]。
(3)量化經DCT變換后,圖像主要信息以低頻分量形式集中在矩陣左上角,其他則為高頻分量聚集點。量化過程中濾除高頻分量,保留低頻分量,達到壓縮的目的。方法是:DTC變換后的頻率系數除以JPEG亮度量化矩陣和色差量化矩陣進行量化取整[7]。
(4)編碼,JPEC壓縮過程中采用Huffman編碼,將圖像數據組成JPEC位圖數據流,以方便傳輸、存儲和譯碼器進行譯碼。
移動端的壓縮方式有尺寸壓縮(即設置圖像采樣率來降低像素并減少圖像本身容量大小)、質量壓縮(即不減少像素前提下降低圖像質量)以及通過JNI調用Libjpeg庫來進行壓縮,本系統中采用后者進行壓縮[18]。系統中不涉及算法和計算,編寫程序直接調用庫中方法如jpeg_start_compress、jpeg_finish_compress等,方法中包含了壓縮過程的相關代碼,將圖3的全部過程進行處理。壓縮過程設計步驟為:(1)對JPEG圖像對象進行空間分配,并初始化。(2)獲取壓縮文件源。(3)設定壓縮參數,如圖像寬、高、色彩通道數、色彩空間、壓縮比率等。(4)指定壓縮后的圖像存儲文件。(5)開始壓縮并顯示壓縮效果圖。(6)壓縮完畢,釋放資源。
本系統在移動端對黃瓜病害圖像進行診斷,需要滿足兩大功能:病害查詢、病害診斷。因此在APP端要包含病害查詢、圖像獲取、圖像預處理、圖像壓縮、圖像診斷等幾大功能,其中圖像預處理包括圖像裁剪、灰度化、圖像分割等。系統功能結構設計如圖4所示。
從功能結構上分析,用戶登錄成功后,系統提供病害查詢和病害診斷兩大主要功能。系統處理流程設計主要從兩方面進行:(1)選擇病害查詢模塊,即進入黃瓜熱門病害界面,選中相關病害圖像,系統從遠程數據庫中調用并顯示相關病害的基本信息、發病規律、防治方法等;(2)選擇病害診斷模塊,即進入病害圖像獲取功能,通過啟用照機進行拍照或從相冊中獲取圖像,并裁剪;下一步,進入圖像預處理界面,對病害圖像進行灰度化處理,并利用OTSU算法進行病斑分割,去除背景和提取病斑區域,顯示分割后的圖像效果;下一步,進入壓縮處理界面,選擇相關的壓縮比率、圖像寬和高等參數,將提取的病斑圖像進行JPEG壓縮,壓縮完后顯示效果圖;最后將處理后的圖像上傳服務端,服務端監聽到處理請求后,建立連接并接收圖像,進行相關的處理和診斷,將診斷信息返回給手機端。系統處理流程如圖5所示。

圖4 系統功能結構設計

圖5 系統處理流程
系統界面設計,采用人機交互友好的原則,操作簡單。“返回”就進入上級操作,“下一步”就進入下級處理,點圖標按紐后進入相關參數的設定,點“確定”后系統根據對應的參數進行圖像數據處理,再“返回”就能看到處理后的效果圖。實現界面如圖6、圖7所示。

圖6 獲取圖像界面 圖7 圖像預處理界面
在自適應閾值分割功能實現中,采用OpenCV中的自適應閾值法即adaptiveThreshold( )進行病害區域的分割,根據需要設定此方法相關參數,方法代碼如adaptiveThreshold(mGray,mAd,255,mADAPTIVE,THRESH_BINARY_INV,5,5),其中將灰度化后的圖像數組變量作為第一個參數;將輸出的分割圖像數組變量作為第二個參數;第三個參數設定滿足條件最大值255;第四個參數值設為ADAPTIVE_THRESH_MEAN_C,為自適應閾值算法參數,并計算出鄰域的平均值再減去第七個參數的值;閾值類型設為THRESH_BINARY_INV;像素鄰域大小設定為5,計算像素閾值。在壓縮功能實現中,先設定JPEG對象為cf,并調用jpeg_create_compress()方法初始化對象,且聲明錯誤處理器,并賦值給cf.err域;然后指定壓縮后的存放文件,且以二進制模式打開;再設定壓縮參數:因預處理后的圖像為灰度圖,色彩空間值設定為JCS_GRAYSCALE(灰色),壓縮比率rate為用戶輸入值,需調用jpeg_set_quality (cf, rate, true)方法;接著調用jpeg_start_compress()進行壓縮;最后調用jpeg_finish_compress(cf)壓縮完畢再調用jpeg_destroy_compress(cf)釋放壓縮對象。
在Android端將黃瓜的斑點病、白粉病、霜霉病、炭疽病等幾種病斑圖像作為樣本進行實驗,經圖像預處理壓縮后,分別記錄原始圖像、處理后圖像的壓縮耗時、視覺效果、數據大小、上傳速度等數據,實驗數據如表1、表2所示。表1實驗數據表明壓縮倍數越低,壓縮質量等級就越高,視覺效果就越好,但是壓縮后圖像數據量還是很大,不利于數據的快速上傳。相反,設定壓縮倍數越高,質量等級就越低,壓縮后圖像數據就越小,但壓縮效果就很差,會影響圖像的病斑特征清晰度,不利于后期服務端接對圖像數據的識別和診斷處理。因此,本系統采用壓縮質量等級范圍為40~60之間,壓縮倍數在50%左右,圖像數據量大小相應減少,壓縮視覺效果較好。

表1 圖像壓縮實驗數據
表2數據表明,在圖像大小方面:相比原始圖像,分割后圖像數據大小減少30%左右;再按壓縮比50進行壓縮,圖像數據大小又減少50%左右。在上傳速度方面:相比直接上傳的原始圖像,壓縮后圖像上傳速度提高24%左右;分割并壓縮后圖像上傳速度提高35%左右。在耗時方面,圖像經過分割并采用哈夫曼算法進行壓縮處理,雖在手機本地耗時最長,但上傳速度最快;圖像不經過分割處理僅壓縮,雖在手機本地耗時較短,但上傳速度較慢;原始圖像直接上傳速度最慢。

表2 實驗記錄數據
從以上測試數據看出,在移動端對圖像進行自適應的閾值分割后,再采用合適的壓縮比進行壓縮,不僅減少圖像數據大小,還能較好地保持視覺效果。圖像在壓縮過程中采用哈夫曼算法進行編碼,雖然在本地耗時長了點,但能加速上傳,減少數據流量。相比沒有經過預處理壓縮的圖像,在上傳速度及遠程服務端對圖像數據的快速處理方面更具有一定的優勢。
為減少大圖像數據大小,加快上傳速度、降低服務端圖像處理難度,提出在移動端病害診斷平臺上對圖像進行預處理并分割出病斑后,再進行離散余弦變換、量化、哈夫曼編碼等壓縮這一方法。實驗結果表明,利用此方法在保證良好壓縮視覺效果的前提下,可大幅降低圖像數據大小達50%以上,提高圖像上傳速度達20%以上。但也存在一些問題,比如利用OTSU方法進行閾值分割時,只能針對病斑明顯的圖像進行處理,病斑區域很少或者病斑區域與綠色區域區別度不是很高時,分割不準確;在手機端進行圖像病斑分割時,雖能減少服務端的圖像處理負荷,但由于手機硬件性能問題,導致分割時長增大等,這些問題在后續的研究階段還有待改進。