,,南洋生,
(華中科技大學 光學與電子信息學院,武漢 430074)
20世紀80年代,遙感應用中人們需要獲取地物的分布與地物的物質構成,這樣的需求使成像光譜技術得到誕生[1]。起初,應用于地物分析的傳統大型機載成像光譜儀,空間分辨率限制在米級[2],隨著成像探測技術的發展與生產生活的需要,應用于精準農林業分布、病蟲檢測、水質檢測等領域的成像光譜儀逐漸小型化,空間分辨率多在分米或厘米級。目前,基于LCTF[3]的成像光譜儀系統[4]由于其小型化、便攜化、功耗低、空間分辨率高等優勢,在日常生產生活中逐漸被開發研究。
但是,由于各科研機構的分離性,與成像光譜儀系統硬件配合的軟件一直沒有適用的框架提出,也沒有開源的相關軟件在各單位間分享,在開發配套的成像光譜儀軟件時,往往花費了大量的重復時間。因此,本文提出了一個適用于LCTF成像光譜儀的軟件方案,可擴展性高,方便各單位移植到自己的應用中。
本文的成像光譜儀硬件平臺由實驗室自主研發,其系統構成框圖如圖1所示。外界目標物體發射或反射光線經過前置光學系統到達分光器件LCTF,LCTF只允許指定波長的光通過,到達后置光學系統,最終成像在探測模塊上,經由終端軟件通過通用串行總線(universal serial bus,USB)協議控制LCTF中心透過波長以及成像探測模塊,進行光譜圖像的采集與顯示。

圖1 成像光譜儀系統結構框圖
分光器件LCTF,基于液晶雙折射效應,通過改變對液晶施加的電壓大小改變液晶光學特性,對波長進行相位調制,從而實現波段的選擇。本文選用的LCTF其波長范圍為420 ~ 750 nm,調制分辨率為1 nm,該模塊提供了USB接口實現對LCTF的控制。成像探測模塊主要由圖像傳感器與相應外圍電路構成,圖像傳感器有效分辨率為1280 × 960,使用USB控制芯片通過硬件接口配置圖像傳感器的相應寄存器實現圖像數據的輸出。因此,終端軟件可以基于USB協議,控制成像光譜儀硬件系統實現透過波長的選擇與圖像的傳輸控制。
本文設計的成像光譜儀軟件主要針對Windows系統的桌面開發,因此采用微軟提供的Visual Studio開發套件進行C++程序的開發。桌面程序的開發,需要豐富的界面庫支撐,同時為了提高代碼的可讀性與可擴展性,面向對象編程,使用開源的界面庫Qt[5]進行開發。Qt作為一個開源的跨平臺的軟件開發框架,不僅具有豐富的界面庫,同時方便其他平臺的開發移植。Qt強大的信號槽機制,能夠很容易實現界面控件被觸發的響應功能,使線程間的通信變得更加便捷,Qt的事件機制又讓動作的觸發變得更加靈活。
按照軟件開發的流程,首先要明確需求,成像光譜儀軟件基本功能就是實現光譜圖像的接收、處理、顯示以及光譜曲線的分析[6]。為了實現圖像接收功能,需要考慮軟件與成像光譜儀硬件的通信,實現軟件對硬件的控制,需要考慮硬件傳輸的數據如何在軟件端緩存;為了實現圖像處理功能,需要考慮軟件端何時處理數據,是與數據接收在同一線程還是在另一線程;為了實現顯示功能,需要考慮硬件傳輸的數據經過軟件端處理如何傳遞給界面顯示;為了實現光譜曲線的分析,需要考慮如何讀取光譜立方體原始數據。因此,開發的光譜儀軟件實際可分為四大模塊,分別是圖像控制與接收模塊、圖像處理模塊、界面顯示模塊、光譜分析模塊。利用面向對象的軟件編程思想,即這4個模塊可以獨立為4個不同的類。
圖像控制與接收模塊設計為設備類,命名為類CyDevice,負責與成像光譜儀硬件進行通信,為其他模塊提供一些可調用控制設備的接口;圖像處理模塊設計為處理類,命名為類ImageProcess,負責實現圖像原始數據到圖片數據的轉換;界面顯示模塊即為界面類,命名為類MainWindow,負責用戶界面布局,負責實現交互邏輯;光譜分析模塊即為光譜分析類,通過新窗口提供,命名為類SpectrumAnalysisDialog,實現光譜分析基本功能,同時為其他的光譜圖像處理預留擴展空間。類MainWindow需要控制圖像數據的接收與處理,因此需要調用類CyDevice和類ImageProcess的接口,即維護這兩個類的實例,如果采用這樣的方式,該類的代碼又含有響應用戶操作的邏輯代碼,會顯得很冗雜,提高代碼維護的難度,降低可讀性。因此,再設計一個類,稱為類ImageModel,該類維護CyDevice和ImageProcess的實例,為界面類MainWindow提供必要的控制接口,使類MainWindow盡可能的簡潔,圖像傳輸與處理的控制代碼限制在類ImageModel中維護。
基于Qt開發的桌面程序,至少會有一個線程,也稱為主線程或者圖像用戶界面(graphical user interface,GUI)線程,如果大量邏輯代碼都運行在GUI線程中,特別是某些耗時的操作,如數據接收或者處理,將大量占用GUI線程的中央處理器(central processing unit,CPU)時間,從而導致用戶點擊界面的響應操作滯后,影響用戶體驗,因此GUI線程應該盡量保證響應用戶的操作,減少其他耗時的處理。如果數據接收與處理在同一線程中進行,假設數據接收耗時t接收,數據處理耗時t處理,那么圖像顯示幀率至多為1/(t接收+t處理),而對于成像光譜儀兼具成像這一特性,將接收與處理并發運行,可以提高幀率,此時幀率主要受限于時間開銷較大的一方。因此,最終設計的程序應當至少分配3個線程,GUI主線程用來處理界面,及時響應用戶操作,界面不卡頓,同時負責一些短時的控制操作,圖像接收線程負責不停地接收硬件傳輸上來的圖像數據,圖像處理線程則負責圖像處理方面的代碼。
由于數據的接收與處理分離到兩個線程中進行,因此需要考慮數據在線程間的傳遞與同步問題,如果數據的緩存空間由二者的任何一方管理,那么另一方必然要調用到對方的接口,加上同步數據的代碼,會使得CyDevice和ImageProcess類間具有較高的耦合性,不符合低耦合性的設計理念,會使得兩個類的維護互相牽連,提高開發復雜度,增加維護成本。因此,額外設計一個類,管理數據的緩存空間,稱為類ImageFifo,將其屬性與接口設計為靜態類型,不用實例化便可以調用這些接口,且在類中封裝易于管理,這樣類CyDevice和類ImageProcess間可以通過直接調用類ImageFifo的靜態接口,來協調數據的同步與傳遞。通過這種方式,類CyDevice和類ImageProcess的耦合性大大降低,維護各自的代碼更加簡單清晰。
因此,通過對成像光譜儀軟件的需求分析所提取出的基本功能,將各個功能整理模塊化[7],運用面向對象的編程思想,設計不同的類負責不同的功能,考慮類之間低耦合,類內部高內聚[8],設計可擴展、易維護的成像光譜儀軟件,其總體方案框圖如圖2所示。

圖2 成像光譜儀軟件總體方案框圖
接收模塊有一個關鍵性的任務就是解決成像光譜儀軟件與硬件間的通信問題,為了使本文研究的成像光譜儀軟件設計更加合理,方便后續的功能開發,基于USB通信協議之上,再制定一個屬于成像光譜儀應用且易擴展的通信協議,顯得很有必要。圖像控制與接收模塊被設計為類CyDevice,控制命令基于USB協議的控制端點傳輸,以不同的單字節控制命令碼和多字節傳輸數據,實現對硬件層圖像傳感器寄存器和LCTF的配置。
對于分光器件LCTF的控制,主要包含LCTF設備的初始化、中心波長的設定、LCTF運行狀態的信息反饋。對于成像探測模塊的控制與傳輸,首先需要考慮該模塊硬件的初始化操作,其次是成像探測的開始與停止操作。而對于圖像傳輸,成像光譜儀的硬件數據并不是一個標準USB視頻(USB Video Class,UVC)格式的數據,所以需要有命令控制幀同步,還需要控制其是否自動曝光,以及手動曝光模式下的曝光時間,需要控制圖像傳感器的模擬增益設置。
在制定的通信協議的基礎上,設計的接口由于軟件多線程應用,內部需要通過互斥鎖增強線程安全性。數據傳輸是類CyDevice的關鍵,成像光譜儀硬件圖像數據采用的是USB傳輸中的批量傳輸方式,通過發送相應命令碼通知硬件進行下一幀的采集,然后調用批量傳輸的相關接口實現數據接收,其流程圖如圖3所示。

圖3 成像光譜儀軟件數據接收接口流程圖
成像光譜儀的硬件傳輸數據是圖像傳感器的原始數據,即分辨率1 280 × 960,像素位寬為12位,而計算機終端對可顯示的圖像數據格式有一定的要求。常見的圖像格式有灰度圖格式,像素位寬8位,取值區間0 ~ 255,顯示圖片只包含黑白的灰度信息;彩色格式,像素位寬24 bits,由紅色、綠色、藍色三通道構成,每個通道占8位,可以顯示彩色圖片;彩色透明度格式,相對于彩色格式,多了一個透明度通道,可以顯示具有不同透明度的彩色圖片。因此,類ImageProcess需要提供圖像處理的接口,同時提供一定的彈性預留其他的處理方案,還需要提供一些控制接口供其他類調用,如暫停、拍照、錄像的底層接口。
如果將成像光譜儀當做相機應用,其硬件傳輸的12 bits位寬的原始數據需要選用合適的算法壓縮到8 bits,由于系統的噪聲首先需要去噪,同時需要一定的圖像增強技術對圖像進行對比度、邊緣細節等信息的增強,這樣處理得到的圖片顯示效果更好。但是,成像光譜儀軟件更多的需要體現不同中心波長下的顯示效果,如果運用圖像增強技術會干擾波長變化對圖像數據的影響,不適合成像光譜儀的軟件應用。因此,本文研究的成像光譜儀軟件在對硬件傳輸的原始數據去噪后,直接提取高8 bits數據,封裝成灰度數據進行顯示。但是考慮到,某些場景需要進行圖像增強幫助查看場景信息,因此保留圖像增強的接口,方便調整需求。為了滿足某些需求下的場景空間變換,該類也設計了一些空間變換的接口,例如水平或者垂直鏡像。類ImageProcess的關鍵部分是原始數據到可顯示的圖像,其運行流程圖如圖4所示。

圖4 成像光譜儀軟件原始數據處理流程
中間層類ImageModel封裝底層類Cydevice和處理類ImageProcess,為上層的界面模塊提供接口方便用戶操作邏輯的實現。類ImageModel維護了類CyDevice和類ImageProcess的實例對象,為了提高軟件運行效率,還同時維護了兩個Qt線程類QThread實例,一個運行圖像數據接收的代碼,另一個運行圖像處理的代碼。數據接收與處理部分分別在兩個線程中,即導致了無法控制兩段代碼的運行次序,需要運用一定的技術手段進行圖像數據的傳遞與數據內存空間的訪問同步[9],因此設計了類ImageFifo,提供靜態接口給數據接收和處理部分的代碼進行調用。設計了一個簡單結構ImageData,其內部定義了圖像數據內存指針m_data、像素位寬m_bitsPerPixel、圖像高度m_imageHeight、圖像寬度m_imageWidth、當前波長m_wavelength,通過ImageData對象的拷貝傳遞,實現高效的線程間數據“傳遞”。類ImageFifo內部實際維護了一個幀緩沖隊列,隊列成員為ImageData類型,添加了互斥鎖進行線程的同步,隊列大小初始化時可以調整,并且提前分配好指定大小的數據緩沖內存空間供循環利用。接收與處理線程代碼的運行流程圖如圖5和6所示,這樣的方式使得線程間的同步與通信機制明確、易懂、可靠。

圖5 接收線程運行流程圖

圖6 處理線程運行流程圖
類MainWindow需要及時處理用戶對界面的響應,因此其運行在主線程中,又稱為GUI線程。Qt提供的信號槽機制和事件驅動機制大大方便了用戶操作響應功能的實現。類MainWindow主要是以用戶的操作需求為驅動而設計,需求可能會擴展變更,因此類MainWindow的代碼應當清晰整潔,通過調用ImageModel的接口響應用戶操作邏輯,保持較高的可維護性。對于用戶的界面操作需求,Qt界面框架會捕捉到這些動作,并發出相應的信號,將這些操作信號與類MainWindow合適的槽函數連接,實現界面響應用戶的動作。
根據成像光譜儀的成像功能需求,界面類MainWindow需要提供打開、關閉、暫停相機的操作入口,需要提供曝光控制、模擬增益控制的操作入口。而光譜儀功能需要明確光譜圖像的采集過程,首先最基本的是功能需要實現分光器件LCTF的初始化以及波長變化,然后需要實現起始波長到終止波長所有波段的白板反射場景的參考圖像自動采集,記錄當前白板參考場景波長相關的參數信息,按照相同波長設置相同參數的規則,再進行其他場景光譜圖像的采集,為光譜分析提供數據準備。
為了保持圖像數據信息與波長信息更改的一致性,波長設置的實際動作應當與數據接收在同一線程運行,即GUI主線程發出波長更改操作,更改標志位使接收線程跳出數據接收循環,利用信號槽機制的隊列連接,接收線程響應實際動作。白板參考光采集過程都是自動化進行,從起始波長到終止波長,每個波段都需要自動挑選合適的曝光值與增益值,利用二分查找[10]的思想,優化該選擇過程,可以提高采集速率。參考光譜采集過程中,使用哈希表[10]存儲波長相關的曝光增益值,實現之后其他目標光譜圖像采集過程時的參數選擇設置。
光譜分析模塊是在主窗口點擊相應按鈕之后,彈出一個子窗口與用戶交互,因此,光譜分析功能的接口設計在類SpectrumAnalysisDialog中,可以靈活設計不同的接口與界面實現不同的功能。本文研究的成像光譜儀軟件的光譜分析功能,主要需要實現選定圖像像素點的光譜曲線的繪制,光譜曲線繪制功能,是實現目標反射光譜的繪制。考慮成像光譜儀應用的波長特性與像素空間分布,目標成像選定像素點的反射率計算公式[11]如下:
(1)
式(1)中,x,y表示圖像像素點位置,λ表示波長,V目標(x,y,λ)表示λ波長下的目標圖像在像素位置x、y處的像素值,V參考(x,y,λ)表示λ波長下的白板參考圖像在像素位置x、y處的像素值,V背景(x,y,λ)表示λ波長下的系統暗電流噪聲引起的圖像在x、y處的像素值,R參考(x,y,λ)表示λ波長下的圖像在像素位置x、y處的反射率。
根據(1)的公式,對于特定目標,可以計算任意位置所有波長下的反射率,從而可以繪制目標圖像任意位置的反射率隨波長的變化曲線,即光譜曲線。
本文設計的成像光譜儀軟件已經在實驗室開發的可見光成像光譜儀與近紅外成像光譜儀兩個平臺上使用并測試,均能穩定運行,界面響應流暢無卡頓,并實現了正確的光譜圖像采集與顯示。在對界面進行極端的點擊操作,軟件始終能夠正確處理請求,無崩潰現象發生。圖7顯示了波長560 nm下的軟件運行狀態,圖8顯示了450 nm、560 nm、720 nm波長下的色卡灰度圖像,6個區域分別為紅、綠、藍、青、品紅、黃六色。

圖7 波長560 nm下的軟件運行圖

圖8 3種波長下的色卡圖像
由圖8可以看出,隨著透過波長的增加,圖像整體灰度逐漸升高,這是由于本文采用的LCTF光譜透過率在短波區域較低,而在長波區域較高,尤其是在450 nm附近,透過率極低,只有百分之五左右,導致該波長下成像效果較差。由560 nm和720 nm下的成像可以發現,不同顏色區域對波長的響應不同。綠色波段560 nm下2區域、4區域、6區域灰度值較高,這是因為這3個區域分別為綠色、青色、黃色,都能反射綠波段的光,而720 nm下1區域、5區域、6區域灰度值較高,這是因為這3個區域分別為紅色、品紅、黃色,都能反射紅波段的光。
本文設計并實現的成像光譜儀軟件具有很高的可移植性和可擴展性,雖然系統基于本單位研究的成像光譜儀系統,具有一定的特殊性,但是在軟件開發過程中,考慮到了這些特殊性,并且預留了相應的接口或者方式供其他硬件方案的軟件開發。如類CyDevice的設計主要基于與硬件的通信而開發,雖然本文的通信方式是USB傳輸,但是如果采用網絡傳輸,利用已知的接口框架只需要在CyDevice層更改通信方式即可,整體軟件同樣可以運行;如類SpectrumAnalysisDialog提供了光譜分析功能的入口,因此在該類中更改界面布局,提供符合自身應用的其他分析功能,軟件同樣可以運行。所以,本文提出的軟件方案具有很高的彈性,并且這種彈性希望在其他單位開發者參與進來之后,繼續優化代碼方案,如數據傳輸層,如果數據接收速度遠遠超過數據處理速度,有沒有更好的緩沖設計,以期實現更完善、更魯棒的成像光譜儀軟件開發框架。