張永杰,陳文建,李武森
(南京理工大學 電子工程與光電技術學院,南京 210094)
可以發(fā)現(xiàn),對于圓或類圓的檢測已有了深入研究,但在提出或改進算法的同時不能兼顧處理速度是目前最突出的問題之一。不僅如此,現(xiàn)階段很多算法僅使用C語言或Matlab平臺編寫都存在著運行速度緩慢的問題,尤其是大矩陣和大數(shù)據(jù)運算。統(tǒng)一計算設備架構(Compute Unified Device Architecture,CUDA)是一款由英偉達(NVIDIA)推出的通用并行計算架構,該架構使圖形處理器(Graphic Processing Unit,GPU)能夠解決復雜的計算問題。本文在使用基于歐拉數(shù)(Euler Number)計算的邊緣優(yōu)化處理算法的基礎之上,對采集樣本圖像中的光纖數(shù)量進行精確檢測,并研究了一種基于CUDA使用C語言編寫算法的軟件系統(tǒng)。實驗結(jié)果表明,使用該系統(tǒng)對光纖傳像束端面圖像進行檢測,能準確分類光纖輪廓并計算數(shù)量,同時大幅度提高了檢測速度。
圖1 圖像采集系統(tǒng)原理示意圖
假設光纖傳像束端面恰好完整成像于相機傳感器靶面上。在相機選型時,記相機最高分辨率為m×n像素(m和n分別為相機靶面的長度和寬度),并設m′×n′為最小像元分辨像素(最小像元是一個矩陣單元,m′和n′分別為矩陣的長度和寬度),則相機在該系統(tǒng)里理論上可以一次性完整檢測出的極限光纖數(shù)量N為
例如,本次實驗使用的相機分辨率為1 920×1 080 pixel。通過測試分析,最小像元分辨像素為4×4 pixel。因此,該相機理論上可以準確檢測出完整成像的極限光纖數(shù)量約為5.7萬個。
通過實驗,得到如圖2所示的光纖傳像束端面圖像樣本。
圖2 光纖傳像束端面圖像樣本
該圖像尺寸為1 920×1 080 pixel,單根光纖像元尺寸為26×26 pixel。分析可知,此時β偏高,導致成像過大;若需得到完整的端面圖像,結(jié)合式(2)可適當增大f1或減小f2。該圖像效果基本滿足設計要求,本文將主要針對該類采集不完整的端面圖像做進一步研究分析。
對于圖2所示的樣本圖像,由于β不合適導致圖像邊緣處的光纖輪廓拍攝不完整。在實際計數(shù)或者人為判斷時,很難將這些擁有隨機不完整度的不完整輪廓逐個分類,因此造成最終計算結(jié)果存在差異。針對此類現(xiàn)象,本文提出了一種優(yōu)化處理算法,即針對每一個輪廓進行歐拉數(shù)計算,然后對有著不同歐拉數(shù)計算結(jié)果的輪廓進行不同的處理,最后將輪廓歸為“完整輪廓”和“不完整輪廓”兩種類型并分別標記與計算數(shù)量。
本次研究兩組患者,對照組遵醫(yī)率77.39%、疾病相關知識掌握程度76.52%、護理滿意度75.65%,觀察組遵醫(yī)率98.26%、疾病相關知識掌握程度95.65%、護理滿意度99.13%;兩組比較可知,觀察組遵醫(yī)率、對疾病相關知識掌握程度、滿意度均顯著高于對照組,差異均有統(tǒng)計學意義(P<0.05),如表1所示;
在二值圖像分析中,歐拉數(shù)作為重要的拓撲特征之一,不會因圖像的放大、縮小、旋轉(zhuǎn)和變形而發(fā)生改變,在圖像分析和幾何對象識別中有著十分重要的作用[9]。歐拉數(shù)的一般定義為圖像中包含的連通域數(shù)量與孔洞數(shù)量之差,其計算公式為
式中:M為連通域數(shù)量;H為孔洞數(shù)量;E為相減后得到的歐拉數(shù)。圖3所示為歐拉數(shù)測試樣本,對于字母A來說,其本身是一個完整的連通域,并且內(nèi)部有一個三角形的黑色孔洞,因此“A”的歐拉數(shù)為0;對于字母B來說,它是一個完整的連通域并且有兩個黑色孔洞,因此“B”的歐拉數(shù)為-1;而字母C雖然是一個完整的連通域卻不存在孔洞,因此“C”的歐拉數(shù)為1。由此可見,依據(jù)連通域和孔洞信息,便可以將3個不同的英文字母分為3類。
圖3 歐拉數(shù)測試樣本及結(jié)果
本文針對邊緣檢測后光纖輪廓的特點,在此計算基礎上對歐拉數(shù)做了新的使用定義:將邊緣檢測后光纖輪廓的外層定義為第1層輪廓即母輪廓,將光纖輪廓的內(nèi)層即孔洞輪廓定義為第2層輪廓即子輪廓,因此歐拉數(shù)新的定義便是母輪廓數(shù)量與子輪廓數(shù)量之差。對于正常情況下檢測完整的光纖輪廓的歐拉數(shù)計算,類似于字母“O”的一般定義計算;而對于在圖像邊緣處被截斷的光纖輪廓,由于邊界線的存在使其不再具有嚴格意義上的孔洞,因此這類光纖輪廓僅有第1層輪廓,類似于字母“C”的一般定義計算。圖4所示為歐拉數(shù)檢測結(jié)果,模擬繪制邊緣檢測后的幾種光纖輪廓示意圖及其歐拉數(shù)檢測結(jié)果。
圖4 歐拉數(shù)檢測結(jié)果
其中,左邊3個輪廓是為了驗證不完整度對歐拉數(shù)計算的影響,右邊兩個輪廓是為了凸顯歐拉數(shù)的計算方式:當輪廓內(nèi)有子輪廓時,將母輪廓標記為紅色,子輪廓標記為綠色;否則,標記為藍色。可以發(fā)現(xiàn),完整輪廓的歐拉數(shù)計算結(jié)果都為0(有子輪廓),不完整輪廓的歐拉數(shù)計算結(jié)果都為1(無子輪廓)。因此,本文便可將所有光纖輪廓依據(jù)新的歐拉數(shù)定義進一步分類:若E≤0,將外輪廓填充為紅色,內(nèi)輪廓填充為黑色(背景色);若E>0,將輪廓填充為綠色。具體的邊緣優(yōu)化效果如圖5所示。如圖5(b)所示,紅色輪廓代表檢測到的“完整輪廓”,綠色輪廓代表“不完整輪廓”,實驗結(jié)果基本滿足設計要求。為了進一步分析該優(yōu)化方法的穩(wěn)定性,通過控制變量改變閾值和形態(tài)學參數(shù),實現(xiàn)在不同條件下的光纖數(shù)量檢測,如表1所示。
圖5 邊緣優(yōu)化效果
表1 邊緣優(yōu)化檢測結(jié)果
表中,光纖輪廓數(shù)量和完整輪廓數(shù)量的標準值是通過人工檢測計算出的實際值,檢測值是通過本文算法計算得到的測量值。通過分析數(shù)據(jù)可知,常規(guī)檢測模式(未采取優(yōu)化措施)下的檢測數(shù)量對閾值和形態(tài)學參數(shù)的變化比較敏感,不同參數(shù)會使邊緣處輪廓不同程度地被篩除,導致檢測結(jié)果略不穩(wěn)定;但是,在本文的預處理操作下,可以將光纖總數(shù)的檢測誤差率控制在0.271%,基本滿足設計需求。另一方面,本文主要研究的是“完整輪廓”和“不完整輪廓”的標記與計算,結(jié)合圖5與表1可知,本文采取的基于歐拉數(shù)計算的邊緣優(yōu)化處理算法可以將完整輪廓的檢測誤差率控制在0.032%,檢測值與標準值幾乎一致,達到了預期設計要求;同時,該優(yōu)化算法還降低了檢測結(jié)果受參數(shù)變化的影響,提高了穩(wěn)定性。
本文所涉及到的算法主要分為3個階段,圖6所示為光纖傳像束光纖數(shù)量檢測流程圖。
圖6 光纖傳像束光纖數(shù)量檢測流程圖
(1) 圖像預處理
針對性的圖像預處理技術可以大幅度提高檢測結(jié)果的準確性[10]。對傳輸?shù)诫娔X的樣本圖像,首先進行灰度處理及線性灰度增強,將圖像中的像素進行線性擴展,從而有效改善曝光過度或模糊不清的問題。濾波處理選擇的是雙邊濾波,雖然運行速度較慢,卻能很好地達到保邊緣和去噪的雙重目的[11]。再進行閾值分割得到所有光纖的二值圖像,以及使用形態(tài)學運算使目標光纖的二值圖像特點更加明顯突出。最后進行邊緣檢測,由于Canny算子易使邊緣不連續(xù),因此選擇了能用線條較好描述圖像的Sobel邊緣檢測。
(2) 邊緣優(yōu)化處理
針對邊緣檢測得到的二值圖像,在圖像邊緣處存在具有隨機不完整度的不完整輪廓,根據(jù)對輪廓進行歐拉數(shù)計算,將所有輪廓分類處理并計算數(shù)量(具體操作如2.1節(jié)所示)。
(3) 各模塊調(diào)用CUDA
針對以上基于常規(guī)預處理方式得到的結(jié)果,雖然已可以準確檢測出兩種類型的光纖數(shù)量,但是仍然和文獻中一樣存在著運行速度緩慢的問題,尤其是雙邊濾波環(huán)節(jié),在對高像素圖像進行處理時,等待時間十分漫長。因此,本文研究了一種在Visual Studio的環(huán)境下,使用C++及開源計算機視覺庫(Open Source Computer Vision Library,OpenCV),通過使用CUDA調(diào)用GPU來實現(xiàn)算法加速運行[12]的方法。
與中央處理器(Central Processing Unit,CPU)不同,GPU是專門為處理圖形任務而產(chǎn)生的芯片,一推出就包含了比CPU更大的帶寬和更多的處理單元,使得其在多媒體處理過程中能夠發(fā)揮更大的效能[13]。CPU的串行運算與GPU的并行運算之間的區(qū)別如圖7所示。
圖7 串行運算與并行運算的區(qū)別示意圖
傳統(tǒng)的CPU串行運算包括以下幾個特點:(1) 運行在使用單一處理器的計算機上;(2) 一個問題可以分解成一系列離散的指令;(3) 離散的指令必須一個接著一個執(zhí)行;(4) 同一時刻只能執(zhí)行一條指令。
相比之下,GPU并行計算做了很多重要的改進:(1) 運行在可以使用多個處理器的計算機上;(2) 一個問題可以分解成若干無直接關聯(lián)的指令集部分;(3) 每個部分可以進一步細分為一系列離散的指令;(4) 這些離散的指令可以同時在不同處理器上分別執(zhí)行。
為充分利用GPU的計算能力,NVIDIA在2006年推出了CUDA編程模型,其包含了CUDA指令集架構(Instruction Set Architecture,ISA)以及GPU內(nèi)部的并行計算引擎。CUDA體系結(jié)構包含了3個部分:開發(fā)庫、運行期環(huán)境和驅(qū)動[13],其中開發(fā)庫提供了兩個標準的數(shù)學運算庫——CUDA離散快速傅里葉變換(CUDA Fast Fourier Trans,CUFFT)和CUDA離散基本線性計算(CUDA Basic Linear Algebra Subprograms,CUBLAS),可以解決很多典型的大規(guī)模并行計算問題。通過這項技術,用戶可以利用NVIDIA GeForce 8以后的GPU和較新的Quadro GPU進行計算。以GeForce 8800 GTX為例,其核心擁有128個內(nèi)處理器,而利用CUDA技術,就可以將這些內(nèi)處理器串通起來成為線程處理器去解決數(shù)據(jù)密集的計算,而各個內(nèi)處理器之間還可以交換、同步和共享數(shù)據(jù)[14]。
圖8所示為本文研究中針對如圖2所示樣本圖像,在算法流程和性能參數(shù)完全一致的前提下,分別使用CPU和GPU檢測的效果圖。
通過觀察可知,其檢測結(jié)果近乎一致,且“完整輪廓”和“不完整輪廓”均成功標記,證實了該加速功能的可行性。在檢測效果圖中,有個別位置呈深藍色或灰色,是因為該位置的光纖存在斷絲或暗絲現(xiàn)象;同時,有個別光纖輪廓沒有與實際輪廓完全重合,是因為該位置的光纖傳像束端面有污漬,干擾了識別檢測。表2所示為本文研究中針對該樣本分別使用兩種檢測方式的運行時間對比結(jié)果。
圖8 CPU和GPU檢測效果圖
表2 系統(tǒng)加速時間對比結(jié)果
表中,濾波處理、閾值分割和邊緣檢測等預處理算法與現(xiàn)階段最新的算法相比并無實質(zhì)性的改進,而邊緣優(yōu)化處理算法則是本文獨立設計的改進算法。實驗結(jié)果表明,本文系統(tǒng)所采取的基于CUDA的加速處理方法,不僅檢測結(jié)果與標準值一致,而且加速效果明顯。其中,雙邊濾波提速約20倍,優(yōu)化算法及整體運行減少近1/2時間。實驗結(jié)果基本符合理論設計和需求,且檢測結(jié)果符合光纖傳像束的實際狀況。
本文針對光纖傳像束端面圖像檢測中圖像采集不完整的情況,提出了一種基于歐拉數(shù)計算的邊緣優(yōu)化處理算法,將圖像中所有光纖輪廓依據(jù)新的歐拉數(shù)使用定義進行分類并計算數(shù)量,有效增強了檢測結(jié)果的穩(wěn)定性與準確性。在改進算法的同時,針對常規(guī)的OpenCV圖像處理效率低下的問題,本文研究了一種基于CUDA的并行計算架構,通過調(diào)用電腦GPU來加速圖像處理系統(tǒng),在檢測準確率不下降的前提下大幅度減少了程序運行時間,提高了工作效率。本文提出的檢測思路及方法不僅適用于光纖傳像束的端面檢測研究,也廣泛適用于對圓或類圓目標的定位及數(shù)量檢測。