李向輝,張菲菲,鄒浩然,曾鈺琦,李杰倫,林偉龍,黃譽戈,楊振宇,李俊賢,王明謙
(廣東第二師范學院計算機學院,廣州 510303)
隨著智能手機的普及,人們對手機上獲取圖像的成像質量和成像速度提出越來越高的要求,因此在移動互聯網應用中,面向移動終端的圖像處理技術越來越重要[1]。當前大多數智能手機在夜視環境下拍攝的圖像存在信噪比低、對比度差等問題,拍攝的圖像不能滿足用戶需求。目前,國內外針對夜間圖像的增強算法主要包括三種:直方圖均衡化的方法、Retinex理論的方法以及深度學習的方法。其中Retinex理論的方法由于其優異的處理效果,得到最多的關注和研究。本文采用帶色彩恢復的多尺度Retinex(multi-scale retinex with color restoration,MSRCR)算法[2-3]來對夜間圖像進行增強。目前Android系統雖是主要的手機操作系統,但在Android平臺上實現夜間圖像的增強技術并不多。因此,基于Android的夜間圖像增強軟件未來社會發展具有很高的應用價值。鑒于此,本文結合MSRCR算法和專業的開源圖像處理庫OpenCV,研究在Android平臺開發一款夜視圖像增強軟件來滿足夜視場景的清晰化成像。
本系統的邏輯流程如圖1所示。

圖1 系統邏輯流程
首先,啟動軟件之后,會進入首頁面,首頁面具備兩個功能:登錄、注冊。其中在登錄框輸入的賬號密碼與數據庫匹配,則點擊登錄將成功進入拍照相冊頁;另外,用戶可點擊注冊進入注冊賬號頁面填寫信息,系統會將符合要求的注冊信息寫入到數據庫中。
然后在拍照相冊頁面中首次點擊會申請權限,點擊拍照按鈕會調用相機拍照,拍照按鈕按下后則會在處理圖像頁面顯示拍下的照片;點擊相冊按鈕則會打開相冊,當用戶選擇照片后,則會在圖像頁面顯示選擇后的圖片。
在處理圖像頁面中,點擊處理圖像按鈕則會對圖像進行增強處理,點擊保存按鈕則會將圖像保存至本地相冊然后跳轉到拍照相冊頁面。
本軟件的架構關系如圖2所示。

圖2 軟件架構關系
在該軟件的交互開發中,通過調用Android平臺提供的SQLite數據庫實現了用戶的注冊和登錄,通過Android平臺的XML文件進行布局,實現各個界面的交互。最后通過常用的相冊相機調用方式,實現所需增強的圖像導入功能。
在圖像增強的開發中,通過Android平臺的JNI方式去調用CMake,CMake執行圖像處理算法,同時該算法調用OpenCV庫所提供的方法,實現圖像增強后再通過JNI返回結果[4]。
本項目不直接使用OpenCV庫的原因是由于C語言在算法中具有高效的優勢,同時OpenCV庫的底層語言亦為C語言,因此通過CMake方式能夠提高軟件執行效率。
已有賬戶的用戶可通過輸入賬號與密碼,點擊登錄進入圖像獲取頁面。點擊登錄時,軟件會匹配數據庫中的內容,若輸入的賬號密碼不正確,則彈出提示賬號密碼不正確,正確則進入下一個活動頁。
首次使用的用戶可點擊注冊按鈕進入注冊頁面,填寫賬號與密碼進行注冊。其中,登錄頁面的密碼出錯。注冊頁面主要有兩個按鈕,一個是注冊,一個是返回主頁面。注冊按鈕通過獲取輸入框的string值,判斷三個輸入框密碼是否為空,以及兩個密碼框輸入的密碼是否一致,如果其中一項不符合標準則彈出錯誤提示,如果成功,則寫入數據庫。
2.2.1 通過拍照獲得照片
首先活動頁處創建一個file對象,然后根據安卓的版本大小,執行相應的拍照獲取圖片操作。如果安卓版本小于7.0則將file對象封裝Uri,如果大于7.0則file對象轉換成Uri對象再從這個對象獲得圖片的真實路徑,然后進行動態權限申請。最后要在AndroidManif.xml中申請相應的權限。
2.2.2 通過相冊獲得照片
相冊獲取圖像是在調用的部分重寫startAc?tivityForResult()方法開啟Intent的回調實現。方法根據不同類型的圖像使用不同的處理。Docu?ment類型的uri通過document id處理;content類型的uri使用普通方式處理,File類型的uri則直接獲取圖片路徑。最后在界面上的顯示框呈現。
本軟件采用的夜視圖像增強算法是帶色彩恢復 的 多 尺 度Retinex算 法[3-4](multi-scale retinex with color restoration,MSRCR)。根據Retinex理論,圖像上某一像素點的觀測值為該點的光照分量與反射分量的乘積,即:

式中,(x,y)表示像素點的位置;I(x,y)表示觀測值;L(x,y)表示該點鄰域的亮度,并且與材質無關;R(x,y)表示反射分量,表示材質的反射系數,與物體的本身的材質相關,而與鄰域的光量無關。因此為而獲得反映物體真實面貌的反射分量R(x,y),可通過Retinex的圖像增強算法排除光照分量L(x,y)的影響。同時根據人的視覺觀感的特點,對數形式更接近人眼觀感的舒適區,因此基于Retinex算法的圖像增強算法都是將圖像轉到對數域進行處理,Jobson等人運用高斯環繞函數對觀測圖像進行卷積估算得到光照分量,由此提出了經典的單尺度Retinex(single-scale retinex,SSR)算法,其計算公式如下所示

式中,F(x,y)表示高斯環繞函數;*表示卷積運算;I i(x,y)為第i個顏色通道的輸入圖像;Ri(x,y)為第i個顏色通道的輸出圖像。由于SSR算法在細節增強與色彩保真之間難以達到平衡,Jobson等人提出將多個不同尺度的SSR處理結果進行簡單加權得到多尺度Retinex(multi-scale ret?inex,MSR)算法:

式中R M i(x,y)表示第i個顏色通道經過MSR處理而得到的輸出圖像,n表示尺度個數,W n為第n個尺度的權重,滿足,一般情況下,取大、中、小三個尺度,即N=3,W1=W2=W3=1/3。
由于SSR算法和MSR算法在處理RGB彩色圖像時,都是分別對R、G、B通道進行單獨地增強,導致增強過程可能會改變各像素點在各顏色通道中的像素值比例,從而淡化圖像的全局或者特定區域物體的真實顏色。為此,Jobson等人又提出帶色彩恢復的多尺度Retinex(MSRCR)算法。MSRCR算法的基本原理是:將原始圖像中的比例關系引入三個顏色通道來對MSR結果進行后處理,從而優化圖像的顏色,避免顏色不飽和及失真,使圖像具有更好的顏色呈現[5]。

式中,C i(x,y)表示第i個顏色通道的色彩恢復系數,作用是對3個顏色通道的比例進行調節。C i(x,y)中參數β為增益常量,α控制非線性的程度。
圖像增強的實現是在點擊按鈕中創建一個方法,這個方法通過JNI接口調用CMake,CMake執行算法處理圖像,并且返回結果。當用戶選取圖像之后,圖像將會在圖像控件上呈現。點擊增強按鈕之后,會對圖像進行算法處理呈現,并將圖像覆蓋原來的在圖像控件中的圖像。在Android中通過CMake的方式調用OpenCV庫實現MSRCR算法來增強圖像,MSRCR算法實現分為五步,其中流程如圖3所示。

圖3 MSRCR方法的實現流程
創建一維的高斯核。然后把該高斯核封裝成一個類浮點類型的整數類型高速高斯核。實現對目標圖像的核計算高斯卷積,接著使用圖像金字塔對圖像進行多尺度表達,從而與分離濾波器連續對使用高斯卷積濾波。最后將原圖像和一系列被濾波的圖像轉換到對數域,并與帶權重的原圖像做減法運算,同時加入顏色修復。
圖4顯示了經本軟件處理前的夜視圖像以及處理后的結果圖像,對圖像進行增強處理后,點擊保存圖像將使用數據輸入輸出流,將增強處理后的圖像寫入相冊,同時申請權限。根據結果圖像顯示,本軟件能夠對夜間低照度圖像進行增強,能夠高保真地恢復原圖像中的細節和色彩,提高了圖像的清晰度。

圖4 圖像處理
本文開發了一款低成本的夜間圖像增強軟件,軟件提供了用戶登錄與注冊的功能,通過CMake調用OpenCV庫的方式實現MSRCR算法來對夜視圖像進行增強。通過對該軟件的圖像采集、夜視圖像增強處理等功能進行測試,結果表明軟件功能易用、有效,能夠對夜視圖像進行較好的增強處理。未來的工作考慮增加多曝光圖像融合的功能來對夜視圖像進行增強,進一步提升軟件的性能。