劉小紅
(湖南信息學(xué)院,湖南 長沙 410151)
近幾年農(nóng)業(yè)災(zāi)害研究已成為熱點,隨著手機(jī)應(yīng)用的不斷普及和拍攝圖像方便的特點,已有國內(nèi)外學(xué)者利用Android手機(jī)結(jié)合圖像處理技術(shù)在病害或蟲害診斷方面開展了深入研究,如文獻(xiàn)[1-4]等提到將Android手機(jī)端采集的病害或蟲害圖像直接上傳至遠(yuǎn)程服務(wù)端,服務(wù)端對接收的圖像進(jìn)行相應(yīng)的處理分析并返回結(jié)果。這些研究雖能解決Android手機(jī)端圖像處理能力有限和本地Sqlite數(shù)據(jù)庫檢索能力不足的問題,但是,在進(jìn)行病害或蟲害圖像遠(yuǎn)程診斷時,需上傳病害或蟲害特征清晰的大容量圖像,會導(dǎo)致上傳速度緩慢、消耗數(shù)據(jù)流量、增大服務(wù)端圖像數(shù)據(jù)處理難度,影響圖像識別的及時性,因此對圖像數(shù)據(jù)進(jìn)行壓縮處理成了解決此問題的重要方法。圖像壓縮就是去除冗余,減少圖像數(shù)據(jù)大小并加速上傳,提高圖像輸出的信噪比[5]。文獻(xiàn)[6-7]提到在Android平臺下對圖像進(jìn)行JPEG壓縮編碼,雖能高效地壓縮圖像,減少圖像數(shù)據(jù)和加速圖像上傳速度,但是針對病害圖像,在較高圖像壓縮比的情況下,病害特征清晰度得不到保障,不利于服務(wù)端后期的圖像分析和處理,加上病害圖像因拍攝環(huán)境、手機(jī)像素等影響,在壓縮中加大圖像特征的模糊度,增加服務(wù)端對圖像識別的處理難度,從而影響識別的及時性或準(zhǔn)確性。
基于以上問題,文中以黃瓜病害圖像為研究對象,在移動端對其進(jìn)行診斷,采用基于預(yù)處理的JPEG圖像壓縮方法進(jìn)行處理后再上傳,確保在圖像病害特征清晰的前提下,可減少病害圖像數(shù)據(jù)大小、加快上傳速度、提高遠(yuǎn)程診斷的及時性和準(zhǔn)確性。
論文主要包括兩部分:圖像預(yù)處理壓縮過程和診斷平臺APP。前者將病害圖像進(jìn)行預(yù)處理后繼續(xù)壓縮,減少病害圖像數(shù)據(jù)量;后者利用預(yù)處理壓縮技術(shù)實現(xiàn)對采集的病害圖像進(jìn)行數(shù)據(jù)處理后并上傳診斷,加速圖像上傳速度,及時獲取相關(guān)病害的診斷信息。
圖像預(yù)處理是提取病害圖像中的病害區(qū)域,需要進(jìn)行圖像分割,而OpenCV正是一種可以進(jìn)行圖像灰度化、圖像轉(zhuǎn)換、圖像分割等各種操作的跨平臺圖像處理庫,在手機(jī)端應(yīng)用OpenCV進(jìn)行圖像病斑分割非常適合[8]。因此系統(tǒng)Android開發(fā)環(huán)境中需配置OpenCV圖像處理庫。圖像壓縮處理則對提取的病斑圖像在手機(jī)端進(jìn)行壓縮,達(dá)到減少圖像大小、加快上傳速度這一目的。Bitmap類中的compress方法是Android系統(tǒng)中最常用的圖像壓縮方法,但圖像壓縮效率不是很高[9]。JPEG2000圖像壓縮標(biāo)準(zhǔn)雖在壓縮效率、性能等方面很出色,但需配備專用壓縮芯片,常應(yīng)用在圖形圖像處理設(shè)備上[10]。JPEG圖像壓縮標(biāo)準(zhǔn)在合適的壓縮比率下,它能在圖像存儲大小和圖像質(zhì)量之間得到折衷,同時不需要配備專用壓縮芯片,在手機(jī)端采用JPEG圖像壓縮標(biāo)準(zhǔn)處理圖像最合適,因此系統(tǒng)開發(fā)環(huán)境需配置支持JPEG壓縮編碼和解碼功能的Libjpeg圖像處理庫[11]。
文中主要以黃瓜的白粉病、斑點病、炭疽病、霜霉病等幾種病斑圖像作為研究樣本,如圖1所示。
圖1 圖像樣本
在Android端實時采集的黃瓜病斑圖像,需進(jìn)行裁剪,去除多余部分,減少圖像大小。裁剪后的病斑圖像包含葉片健康區(qū)域和病害區(qū)域,這兩種區(qū)域從視覺上分別以綠色和非綠色二種顏色相交錯。要獲取病斑區(qū)域,需要對圖像進(jìn)行分割去除健康區(qū)域。在圖像分割方法中,閾值分割法具有計算簡單、速度快和效率高等優(yōu)點,不受圖像亮度和對比度影響,廣泛應(yīng)用于數(shù)字圖像分割處理[12-14]。因此系統(tǒng)中采用此方法進(jìn)行病斑分割,即病害圖像先裁剪、再灰度化、最后利用最大類間方差法(即OTSU算法)進(jìn)行圖像分割。OTSU算法是將灰度化圖像歸一化處理后,利用閾值將圖像分成背景和前景兩部分,循環(huán)計算背景和前景之間的類內(nèi)方差,求取類內(nèi)方差為極大值時對應(yīng)的閾值即為最佳分割閾值[8]。
Otsu閾值分割過程如下:
(1)計算灰度化病害圖像的歸一化直方圖,得到圖像灰度級1~M,總像素數(shù)為N,則第i級灰度出現(xiàn)的概率為: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找到最大的類間方差,對應(yīng)此方差最大的灰度值即為要找的閾值,k從1~M變化。
(5)利用計算得的閾值進(jìn)行圖像分割。
圖像預(yù)處理過程設(shè)計:在移動端將黃瓜病斑圖像,先進(jìn)行適當(dāng)裁剪;然后編寫灰度化程序,調(diào)用OpenCV中的cvCvtColor()方法,并設(shè)置參數(shù)code值為CV_BGR2GRAY,將原圖RGB空間轉(zhuǎn)成灰度化的目標(biāo)圖;最后利用OTSU算法將灰化圖像進(jìn)行分割,去除圖像非病斑區(qū)域,實現(xiàn)病斑區(qū)域的提取。OpenCV中主要有固定閾值、自適應(yīng)閾值兩種分割方法,其中threshold()方法是對單通道數(shù)組進(jìn)行固定閾值操作[15]。由于病害圖像經(jīng)過灰度化后,圖像中的灰度不均勻,病斑特征邊緣明顯度有所降低,如果采用固定閾值分割法來處理,效果比較差。而自適應(yīng)閾值分割即adaptiveThreshold()方法能根據(jù)圖像亮度分布的不同,相應(yīng)地改變閾值,對各個區(qū)域出現(xiàn)不同顏色或亮度的病斑,分割的效果比較好。
圖像預(yù)處理實驗的效果如圖2所示。
系統(tǒng)壓縮的關(guān)鍵是將自適應(yīng)分割出的病斑區(qū)域進(jìn)行壓縮處理。壓縮后不僅縮小圖像數(shù)據(jù)大小、節(jié)省存儲空間,還能保存重要的病害信息,方便后期圖像處理。JPEG壓縮方法采用順序編碼模式,主要有離散余弦變換(DCT)、量化、哈夫曼編碼等幾個過程[6]。
圖2 圖像預(yù)處理示意圖
在病害圖像進(jìn)行閾值分割后進(jìn)入壓縮處理過程,先將圖像以8×8進(jìn)行分塊,再對各個分塊進(jìn)行DCT變換即空間域數(shù)據(jù)轉(zhuǎn)換到頻率域數(shù)據(jù),此時病斑數(shù)據(jù)主要集中在低頻分量上,非病斑數(shù)據(jù)分布在高頻分量上。要濾除高頻分量,保留低頻分量,需要進(jìn)行量化處理,利用JPEG亮度和色差量化表通過量化公式對DCT系數(shù)進(jìn)行量化[16-17]。接著將載有病斑信息的低頻分量采用Huffman編碼形式進(jìn)行編碼,形成JPEG位圖數(shù)據(jù)流。最后將數(shù)據(jù)流進(jìn)行譯碼生成JPEG圖像。壓縮流程如圖3所示。
圖3 JPEG圖像壓縮流程
JPEG圖像壓縮過程如下:
(1)JPEG壓縮處理是針對圖像Y(亮度)Cr(色度)Cb(飽和度)顏色空間,手機(jī)在田間收集的實時圖像是RGB色彩空間,進(jìn)行DCT變換前,要將其轉(zhuǎn)換為YCrCb色彩空間,其中采樣比例Y∶Cb∶Cr =4∶1∶1,再將圖片劃分為8×8的小塊。
(2)DCT變換(即離散余弦變換),在JPEG壓縮過程中,需將圖片空間域數(shù)據(jù)轉(zhuǎn)換到頻率域數(shù)據(jù)即對每個圖像分塊后,再采用DCT變換公式進(jìn)行變換[7]。
(3)量化經(jīng)DCT變換后,圖像主要信息以低頻分量形式集中在矩陣左上角,其他則為高頻分量聚集點。量化過程中濾除高頻分量,保留低頻分量,達(dá)到壓縮的目的。方法是:DTC變換后的頻率系數(shù)除以JPEG亮度量化矩陣和色差量化矩陣進(jìn)行量化取整[7]。
(4)編碼,JPEC壓縮過程中采用Huffman編碼,將圖像數(shù)據(jù)組成JPEC位圖數(shù)據(jù)流,以方便傳輸、存儲和譯碼器進(jìn)行譯碼。
移動端的壓縮方式有尺寸壓縮(即設(shè)置圖像采樣率來降低像素并減少圖像本身容量大小)、質(zhì)量壓縮(即不減少像素前提下降低圖像質(zhì)量)以及通過JNI調(diào)用Libjpeg庫來進(jìn)行壓縮,本系統(tǒng)中采用后者進(jìn)行壓縮[18]。系統(tǒng)中不涉及算法和計算,編寫程序直接調(diào)用庫中方法如jpeg_start_compress、jpeg_finish_compress等,方法中包含了壓縮過程的相關(guān)代碼,將圖3的全部過程進(jìn)行處理。壓縮過程設(shè)計步驟為:(1)對JPEG圖像對象進(jìn)行空間分配,并初始化。(2)獲取壓縮文件源。(3)設(shè)定壓縮參數(shù),如圖像寬、高、色彩通道數(shù)、色彩空間、壓縮比率等。(4)指定壓縮后的圖像存儲文件。(5)開始壓縮并顯示壓縮效果圖。(6)壓縮完畢,釋放資源。
本系統(tǒng)在移動端對黃瓜病害圖像進(jìn)行診斷,需要滿足兩大功能:病害查詢、病害診斷。因此在APP端要包含病害查詢、圖像獲取、圖像預(yù)處理、圖像壓縮、圖像診斷等幾大功能,其中圖像預(yù)處理包括圖像裁剪、灰度化、圖像分割等。系統(tǒng)功能結(jié)構(gòu)設(shè)計如圖4所示。
從功能結(jié)構(gòu)上分析,用戶登錄成功后,系統(tǒng)提供病害查詢和病害診斷兩大主要功能。系統(tǒng)處理流程設(shè)計主要從兩方面進(jìn)行:(1)選擇病害查詢模塊,即進(jìn)入黃瓜熱門病害界面,選中相關(guān)病害圖像,系統(tǒng)從遠(yuǎn)程數(shù)據(jù)庫中調(diào)用并顯示相關(guān)病害的基本信息、發(fā)病規(guī)律、防治方法等;(2)選擇病害診斷模塊,即進(jìn)入病害圖像獲取功能,通過啟用照機(jī)進(jìn)行拍照或從相冊中獲取圖像,并裁剪;下一步,進(jìn)入圖像預(yù)處理界面,對病害圖像進(jìn)行灰度化處理,并利用OTSU算法進(jìn)行病斑分割,去除背景和提取病斑區(qū)域,顯示分割后的圖像效果;下一步,進(jìn)入壓縮處理界面,選擇相關(guān)的壓縮比率、圖像寬和高等參數(shù),將提取的病斑圖像進(jìn)行JPEG壓縮,壓縮完后顯示效果圖;最后將處理后的圖像上傳服務(wù)端,服務(wù)端監(jiān)聽到處理請求后,建立連接并接收圖像,進(jìn)行相關(guān)的處理和診斷,將診斷信息返回給手機(jī)端。系統(tǒng)處理流程如圖5所示。
圖4 系統(tǒng)功能結(jié)構(gòu)設(shè)計
圖5 系統(tǒng)處理流程
系統(tǒng)界面設(shè)計,采用人機(jī)交互友好的原則,操作簡單?!胺祷亍本瓦M(jìn)入上級操作,“下一步”就進(jìn)入下級處理,點圖標(biāo)按紐后進(jìn)入相關(guān)參數(shù)的設(shè)定,點“確定”后系統(tǒng)根據(jù)對應(yīng)的參數(shù)進(jìn)行圖像數(shù)據(jù)處理,再“返回”就能看到處理后的效果圖。實現(xiàn)界面如圖6、圖7所示。
圖6 獲取圖像界面 圖7 圖像預(yù)處理界面
在自適應(yīng)閾值分割功能實現(xiàn)中,采用OpenCV中的自適應(yīng)閾值法即adaptiveThreshold( )進(jìn)行病害區(qū)域的分割,根據(jù)需要設(shè)定此方法相關(guān)參數(shù),方法代碼如adaptiveThreshold(mGray,mAd,255,mADAPTIVE,THRESH_BINARY_INV,5,5),其中將灰度化后的圖像數(shù)組變量作為第一個參數(shù);將輸出的分割圖像數(shù)組變量作為第二個參數(shù);第三個參數(shù)設(shè)定滿足條件最大值255;第四個參數(shù)值設(shè)為ADAPTIVE_THRESH_MEAN_C,為自適應(yīng)閾值算法參數(shù),并計算出鄰域的平均值再減去第七個參數(shù)的值;閾值類型設(shè)為THRESH_BINARY_INV;像素鄰域大小設(shè)定為5,計算像素閾值。在壓縮功能實現(xiàn)中,先設(shè)定JPEG對象為cf,并調(diào)用jpeg_create_compress()方法初始化對象,且聲明錯誤處理器,并賦值給cf.err域;然后指定壓縮后的存放文件,且以二進(jìn)制模式打開;再設(shè)定壓縮參數(shù):因預(yù)處理后的圖像為灰度圖,色彩空間值設(shè)定為JCS_GRAYSCALE(灰色),壓縮比率rate為用戶輸入值,需調(diào)用jpeg_set_quality (cf, rate, true)方法;接著調(diào)用jpeg_start_compress()進(jìn)行壓縮;最后調(diào)用jpeg_finish_compress(cf)壓縮完畢再調(diào)用jpeg_destroy_compress(cf)釋放壓縮對象。
在Android端將黃瓜的斑點病、白粉病、霜霉病、炭疽病等幾種病斑圖像作為樣本進(jìn)行實驗,經(jīng)圖像預(yù)處理壓縮后,分別記錄原始圖像、處理后圖像的壓縮耗時、視覺效果、數(shù)據(jù)大小、上傳速度等數(shù)據(jù),實驗數(shù)據(jù)如表1、表2所示。表1實驗數(shù)據(jù)表明壓縮倍數(shù)越低,壓縮質(zhì)量等級就越高,視覺效果就越好,但是壓縮后圖像數(shù)據(jù)量還是很大,不利于數(shù)據(jù)的快速上傳。相反,設(shè)定壓縮倍數(shù)越高,質(zhì)量等級就越低,壓縮后圖像數(shù)據(jù)就越小,但壓縮效果就很差,會影響圖像的病斑特征清晰度,不利于后期服務(wù)端接對圖像數(shù)據(jù)的識別和診斷處理。因此,本系統(tǒng)采用壓縮質(zhì)量等級范圍為40~60之間,壓縮倍數(shù)在50%左右,圖像數(shù)據(jù)量大小相應(yīng)減少,壓縮視覺效果較好。
表1 圖像壓縮實驗數(shù)據(jù)
表2數(shù)據(jù)表明,在圖像大小方面:相比原始圖像,分割后圖像數(shù)據(jù)大小減少30%左右;再按壓縮比50進(jìn)行壓縮,圖像數(shù)據(jù)大小又減少50%左右。在上傳速度方面:相比直接上傳的原始圖像,壓縮后圖像上傳速度提高24%左右;分割并壓縮后圖像上傳速度提高35%左右。在耗時方面,圖像經(jīng)過分割并采用哈夫曼算法進(jìn)行壓縮處理,雖在手機(jī)本地耗時最長,但上傳速度最快;圖像不經(jīng)過分割處理僅壓縮,雖在手機(jī)本地耗時較短,但上傳速度較慢;原始圖像直接上傳速度最慢。
表2 實驗記錄數(shù)據(jù)
從以上測試數(shù)據(jù)看出,在移動端對圖像進(jìn)行自適應(yīng)的閾值分割后,再采用合適的壓縮比進(jìn)行壓縮,不僅減少圖像數(shù)據(jù)大小,還能較好地保持視覺效果。圖像在壓縮過程中采用哈夫曼算法進(jìn)行編碼,雖然在本地耗時長了點,但能加速上傳,減少數(shù)據(jù)流量。相比沒有經(jīng)過預(yù)處理壓縮的圖像,在上傳速度及遠(yuǎn)程服務(wù)端對圖像數(shù)據(jù)的快速處理方面更具有一定的優(yōu)勢。
為減少大圖像數(shù)據(jù)大小,加快上傳速度、降低服務(wù)端圖像處理難度,提出在移動端病害診斷平臺上對圖像進(jìn)行預(yù)處理并分割出病斑后,再進(jìn)行離散余弦變換、量化、哈夫曼編碼等壓縮這一方法。實驗結(jié)果表明,利用此方法在保證良好壓縮視覺效果的前提下,可大幅降低圖像數(shù)據(jù)大小達(dá)50%以上,提高圖像上傳速度達(dá)20%以上。但也存在一些問題,比如利用OTSU方法進(jìn)行閾值分割時,只能針對病斑明顯的圖像進(jìn)行處理,病斑區(qū)域很少或者病斑區(qū)域與綠色區(qū)域區(qū)別度不是很高時,分割不準(zhǔn)確;在手機(jī)端進(jìn)行圖像病斑分割時,雖能減少服務(wù)端的圖像處理負(fù)荷,但由于手機(jī)硬件性能問題,導(dǎo)致分割時長增大等,這些問題在后續(xù)的研究階段還有待改進(jìn)。