本發(fā)明涉及計(jì)算機(jī)圖像處理
技術(shù)領(lǐng)域:
,特別是視頻的去霧方法。
背景技術(shù):
:霧霾是一種常見的天氣現(xiàn)象,在霧霾嚴(yán)重的時(shí)候,道路的能見度和可視性會(huì)變差,駕駛員獲取的道路和環(huán)境信息就會(huì)不足,非常容易造成惡性的交通事故。因此,如何提高能見度低的天氣條件下駕駛員可獲取的周圍環(huán)境的信息量,一直是智能交通領(lǐng)域的一個(gè)研究熱點(diǎn)。在智能交通領(lǐng)域,現(xiàn)有的輔助設(shè)備和算法對(duì)夜晚的適應(yīng)性較好,但對(duì)圖像去霧的效果較差,主要原因在于夜晚和霧天的視覺增強(qiáng)在原理上有著本質(zhì)的區(qū)別,夜晚能見度低是因?yàn)楣饩€不足,可以通過(guò)紅外設(shè)備得到物體的反饋信息;而霧天的能見度低,則是因?yàn)榭諝庵写嬖诤芏嗨畾?,?duì)輻射來(lái)的光線產(chǎn)生折射作用,從而使我們得到的圖像信息并不真實(shí),也就是造成了視覺污染。另外,對(duì)于監(jiān)視系統(tǒng)和遙感系統(tǒng),霧霾天氣也會(huì)對(duì)其成像造成嚴(yán)重影響,例如,戶外監(jiān)視系統(tǒng)在霧霾天氣條件下經(jīng)常失效,典型的比如說(shuō)路口的監(jiān)視器,如果在霧霾天氣下發(fā)生交通事故,交警在調(diào)取監(jiān)控錄像進(jìn)行判罰時(shí),就可能由于圖像不夠清晰而無(wú)法獲得事故發(fā)生的細(xì)節(jié),監(jiān)視系統(tǒng)也就失去了其監(jiān)視的價(jià)值。不僅智能交通領(lǐng)域,在軍事領(lǐng)域中,提高霧霾等惡劣天氣條件下的可視性也是目前的一個(gè)研究熱點(diǎn),例如:偵察兵攜帶便攜式望遠(yuǎn)鏡在遠(yuǎn)距離觀察敵情時(shí),必然會(huì)受到天氣條件的影響,如果天氣條件較差,則無(wú)法及時(shí)準(zhǔn)確的獲得敵方情報(bào),從而耽擱作戰(zhàn)的最佳時(shí)機(jī)。圖像去霧是近些年在圖像處理領(lǐng)域的一個(gè)研究熱點(diǎn),在智能交通、軍事、監(jiān)視系統(tǒng)、遙感系統(tǒng)等領(lǐng)域中都有著極為重要的應(yīng)用價(jià)值。目前,針對(duì)圖像去霧的方法主要有兩種:一種是基于圖像增強(qiáng)的算法,另一種是基于圖像復(fù)原的算法。圖像增強(qiáng)的方法不需要物理模型,主要是通過(guò)增強(qiáng)對(duì)比度來(lái)突出圖像的細(xì)節(jié)部分,算法實(shí)現(xiàn)相對(duì)簡(jiǎn)單,但是去霧效果卻沒有圖像復(fù)原的算法好。大部分基于圖像復(fù)原的算法去霧效果很好,可算法的復(fù)雜度很高,計(jì)算量很大,實(shí)現(xiàn)過(guò)程耗時(shí)很長(zhǎng)。目前,基于單幅圖像的去霧算法的研究重點(diǎn)大多集中在去霧算法和圖像的去霧效果上,對(duì)算法加速的研究還很有限,而單幅圖像去霧算法由于其計(jì)算量大,算法占用內(nèi)存多,需要的運(yùn)行時(shí)間長(zhǎng),不能為工程實(shí)現(xiàn)帶來(lái)理想的效果,難以得到廣泛的應(yīng)用。另外,在視頻去霧處理方面,由于高清視頻的分辨率比普通視頻高出很多,這使得高清視頻實(shí)時(shí)去霧的計(jì)算量更是巨大,去霧速度則顯得更為緩慢。暗通道假設(shè)就是這樣一種去霧算法,利用這種算法在CPU上處理一幅600×400的圖片大概需要10-20s的時(shí)間,顯然無(wú)法滿足很多工程中的實(shí)時(shí)性要求,因此,縮短暗通道假設(shè)去霧算法的運(yùn)行時(shí)間是必要的。技術(shù)實(shí)現(xiàn)要素:本發(fā)明需要解決的技術(shù)問(wèn)題是提供一種能夠?qū)崿F(xiàn)對(duì)視頻進(jìn)行高速、高清去霧處理的方法。為解決上述技術(shù)問(wèn)題,本發(fā)明所采取的技術(shù)方案如下。一種OpenCL加速的視頻去霧方法,該方法采用OpenCL對(duì)有霧視頻進(jìn)行去霧處理,具體包括以下步驟:A.初始化FFmpeg多媒體框架;B.初始化OpenCL架構(gòu);C.利用OpenCL優(yōu)化FHRUSI去霧算法實(shí)現(xiàn)并行視頻去霧處理;D.將并行視頻去霧處理擴(kuò)展到FFmpeg多媒體框架中,運(yùn)行并行視頻去霧處理子程序完成視頻去霧操作。上述一種OpenCL加速的視頻去霧方法,步驟D所述去霧處理子程序具體包括以下步驟:D1.獲取視頻文件,將視頻文件進(jìn)行音視頻分離,并進(jìn)行解碼操作;D2.將YUV格式的色彩空間轉(zhuǎn)換為RGB格式的色彩空間;D3.進(jìn)行并行去霧處理;D4.將RGB格式的色彩空間轉(zhuǎn)換為YUV格式的色彩空間;D5.呈現(xiàn)去霧后的視頻圖像。上述一種OpenCL加速的視頻去霧方法,步驟D3中的去霧處理具體包括以下步驟:D31.在OpenCL構(gòu)架下獲取有霧圖像,并計(jì)算R、G、B三個(gè)顏色通道的最小值以及有霧圖像中每個(gè)像素點(diǎn)的暗通道值;D32.對(duì)進(jìn)行均值濾波,計(jì)算對(duì)應(yīng)像素點(diǎn)的均值;D33.計(jì)算中所有元素的均值;D34.計(jì)算環(huán)境光,采用OpenCL內(nèi)存映射將數(shù)據(jù)從GPU移動(dòng)到CPU;D35.估計(jì)全局大氣光,采用解映射將數(shù)據(jù)從CPU返回GPU;D36.在OpenCL構(gòu)架下根據(jù)全局大氣光和環(huán)境光進(jìn)行去霧操作,輸出最后的無(wú)霧圖像。上述一種OpenCL加速的視頻去霧方法,步驟D31中有霧圖像的暗通道值通過(guò)式一計(jì)算獲得:式一式中,是輸入的有霧圖像,表示對(duì)應(yīng)像素點(diǎn)的顏色通道。上述一種OpenCL加速的視頻去霧方法,步驟D32中對(duì)應(yīng)像素點(diǎn)的均值通過(guò)式二計(jì)算獲得:式二式中,表示均值濾波窗口的大小。上述一種OpenCL加速的視頻去霧方法,步驟D34中環(huán)境光通過(guò)式三計(jì)算獲得:式三式中,是一個(gè)可調(diào)參數(shù)并且。上述一種OpenCL加速的視頻去霧方法,步驟D35中全局大氣光根據(jù)式四計(jì)算獲得:式四。上述一種OpenCL加速的視頻去霧方法,步驟D36中的無(wú)霧圖像根據(jù)式五計(jì)算獲得:式五。由于采用了以上技術(shù)方案,本發(fā)明所取得技術(shù)進(jìn)步如下。本發(fā)明利用OpenCL并行編程方法和GPU并行構(gòu)架實(shí)現(xiàn)對(duì)視頻去霧處理的并行加速以及高清視頻的實(shí)時(shí)去霧,降低了去霧算法復(fù)雜度,提高了算法的并行度,大大減少了去霧算法的執(zhí)行時(shí)間,達(dá)到了高速、高清去霧效果。實(shí)驗(yàn)結(jié)果表明,本發(fā)明可以以實(shí)時(shí)速率(每秒超過(guò)41幀)處理1080p(1920×1080)高清視頻,并且高清晰度視頻的去霧效果良好,執(zhí)行速度提高了4.8倍以上,解決了高清視頻實(shí)時(shí)去霧因計(jì)算量非常巨大不能快速連續(xù)實(shí)現(xiàn)去霧的問(wèn)題。附圖說(shuō)明圖1為本發(fā)明的流程圖;圖2為本發(fā)明所述步驟D的流程圖;圖3為本發(fā)明所述步驟D3的流程圖;圖4為本發(fā)明中并行OpenCL內(nèi)核實(shí)現(xiàn)采用合并數(shù)據(jù)訪問(wèn)模式的示意圖。具體實(shí)施方式下面將結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說(shuō)明。OpenCL是在各種現(xiàn)代CPU、GPU、DSP等微處理器上進(jìn)行任務(wù)并行和數(shù)據(jù)并行異構(gòu)計(jì)算的一個(gè)新的行業(yè)標(biāo)準(zhǔn),是一個(gè)以并行編程語(yǔ)言和子程序庫(kù)為基礎(chǔ)的軟件開發(fā)平臺(tái),可以支持在多個(gè)供應(yīng)商的硬件平臺(tái)上進(jìn)行異構(gòu)計(jì)算。本發(fā)明提供的一種OpenCL加速的視頻去霧方法,即是采用OpenCL對(duì)有霧視頻進(jìn)行去霧處理,其流程如圖1所示,具體包括以下步驟。A.初始化FFmpeg多媒體框架。B.初始化OpenCL架構(gòu)。C.利用OpenCL優(yōu)化FHRUSI去霧算法實(shí)現(xiàn)并行視頻去霧處理。D.將并行視頻去霧處理擴(kuò)展到FFmpeg多媒體框架中,運(yùn)行并行視頻去霧處理子程序完成視頻去霧操作。本步驟中,去霧處理子程序的流程如圖2所示,具體包括以下步驟:D1.獲取視頻文件,將視頻文件進(jìn)行音視頻分離,并進(jìn)行解碼操作。獲取視頻數(shù)據(jù)源后,將探測(cè)多媒體的類型,即容器格式,然后匹配相應(yīng)的解復(fù)用器。解復(fù)用器將音視頻進(jìn)行分離,將音頻和視頻分離出來(lái)后分別放入音頻和視頻各自的緩沖區(qū)中等待解碼。從解復(fù)用后的音頻和視頻緩沖區(qū)讀取壓縮數(shù)據(jù),送入到解碼器中進(jìn)行解碼。D2.將YUV格式的色彩空間轉(zhuǎn)換為RGB格式的色彩空間。D3.進(jìn)行并行去霧處理。本步驟中的去霧處理的流程如圖3所示,具體包括以下步驟:D31.在OpenCL構(gòu)架下獲取有霧圖像,并計(jì)算R、G、B三個(gè)顏色通道的最小值以及有霧圖像中每個(gè)像素點(diǎn)的暗通道值。有霧圖像的暗通道值通過(guò)式一計(jì)算獲得:式一式中,是輸入的有霧圖像,表示對(duì)應(yīng)像素點(diǎn)的顏色通道。在基本的并行OpenCL內(nèi)核實(shí)現(xiàn)中,采用多線程分段的方式處理輸入數(shù)組,如基本的并行OpenCL內(nèi)核實(shí)現(xiàn)中,內(nèi)核將輸入數(shù)組分為多個(gè)段,每個(gè)線程在一個(gè)段中處理幾個(gè)連續(xù)的元素,當(dāng)一個(gè)OpenCL內(nèi)核一個(gè)接一個(gè)地處理二維數(shù)據(jù)集的元素時(shí),基本的并行OpenCL實(shí)現(xiàn)中的順序數(shù)據(jù)訪問(wèn)模式將導(dǎo)致讀取性能的急劇下降。本發(fā)明中并行OpenCL內(nèi)核實(shí)現(xiàn)中采用合并數(shù)據(jù)訪問(wèn)模式,如圖4所示,當(dāng)work-item0訪問(wèn)數(shù)組元素array[0]時(shí),work-item1正在訪問(wèn)數(shù)組元素array[1],work-item2正在訪問(wèn)數(shù)組元素array[2],如此等等。因此,所有的工作項(xiàng)都會(huì)產(chǎn)生連續(xù)的內(nèi)存訪問(wèn)地址,這無(wú)疑滿足了數(shù)據(jù)訪問(wèn)的局部性要求,從而有效地提高了內(nèi)存的訪問(wèn)速度,并最大限度地利用了GPU的全局內(nèi)存帶寬。本發(fā)明中,并行OpenCL內(nèi)核實(shí)現(xiàn)的程序代碼如下:1)intx=get_global_id(0);2)inty=get_global_id(1);3)inteach_thread=array_length/(x*y);4)intglobal_id=y*get_global_size(0)+x;5)for(intk=0;k<array_length;k+=each_thread)do6)intvalue=array[each_thread*global_id+k];7)operation_code(value);8)endfor9)重新獲取全局索引,進(jìn)行下一次調(diào)度;10)EndD32.對(duì)進(jìn)行均值濾波,計(jì)算對(duì)應(yīng)像素點(diǎn)的均值。對(duì)應(yīng)像素點(diǎn)的均值通過(guò)式二計(jì)算獲得:式二式中,表示均值濾波窗口的大小。在進(jìn)行均值濾波過(guò)程中,需要計(jì)算值濾波窗口中心像素點(diǎn)的平均值,這就要求包含相鄰像素點(diǎn)的數(shù)據(jù)塊,通過(guò)選擇數(shù)據(jù)塊中所有像素的平均值作為中心像素的平均值,便可以取得輸入圖像中的每個(gè)像素的均值濾波平均值。實(shí)際操作時(shí),根據(jù)塊大小和均值濾波窗口設(shè)置本地內(nèi)存大小,然后將輸入圖像的所有數(shù)據(jù)根據(jù)已經(jīng)設(shè)置的塊大小分割成一個(gè)個(gè)數(shù)據(jù)塊,每個(gè)數(shù)據(jù)塊被加載到一個(gè)工作組的本地內(nèi)存中,然后每個(gè)工作項(xiàng)從其對(duì)應(yīng)數(shù)據(jù)塊的本地內(nèi)存中訪問(wèn)數(shù)據(jù),而不是從全局內(nèi)存。至于在AMDGPU上的OpenCL編程,每個(gè)工作組所使用的本地內(nèi)存的最大數(shù)量可以通過(guò)調(diào)用函數(shù)clGetDeviceInfo(CL_DEVICE_LOCAL_MEM_SIZE)來(lái)獲得。一個(gè)數(shù)據(jù)塊的邊緣數(shù)據(jù)是與其相鄰數(shù)據(jù)塊所共享的,當(dāng)從全局存儲(chǔ)器加載數(shù)據(jù)時(shí),數(shù)據(jù)塊的中間部分只加載一次,相鄰數(shù)據(jù)塊共享的邊緣部分被加載兩次,數(shù)據(jù)塊的每個(gè)角落都由四個(gè)數(shù)據(jù)塊共享,所以需要加載四次角落部分。在將數(shù)據(jù)從全局存儲(chǔ)器中移動(dòng)到本地內(nèi)存后,同一工作組所有工作項(xiàng)所使用的所有數(shù)據(jù)都是從對(duì)應(yīng)的本地內(nèi)存中加載,大大減少了內(nèi)存訪問(wèn)延遲。D33.計(jì)算中所有元素的均值。D34.計(jì)算環(huán)境光,然后采用OpenCL內(nèi)存映射將數(shù)據(jù)從GPU移動(dòng)到CPU。環(huán)境光通過(guò)式三計(jì)算獲得:式三式中,是一個(gè)可調(diào)參數(shù)并且。在將數(shù)據(jù)從GPU移動(dòng)到CPU的過(guò)程中,本發(fā)明采用零拷貝技術(shù),即通過(guò)把對(duì)顯式數(shù)據(jù)傳輸函數(shù)的調(diào)用改為利用OpenCL內(nèi)存映射APIclEnqueueMapBuffer和clEnqueueUnmapMemObject而完成,避免了不必要的數(shù)據(jù)傳輸。映射和解映射函數(shù)的功能就像一個(gè)邊界,通過(guò)內(nèi)存映射操作后,讀和寫一個(gè)OpenCL內(nèi)存緩沖區(qū)的權(quán)限被傳遞到主機(jī)端(CPU)代碼,當(dāng)主機(jī)代碼完成存儲(chǔ)器訪問(wèn)后,解映射函數(shù)將緩沖區(qū)的訪問(wèn)權(quán)限返回給設(shè)備端(GPU)的內(nèi)核代碼,因此這個(gè)內(nèi)核可以再次訪問(wèn)該內(nèi)存緩沖區(qū)。因?yàn)閳?zhí)行轉(zhuǎn)換操作之后不再需要在運(yùn)行時(shí)顯式地進(jìn)行數(shù)據(jù)傳輸,因此大大減少了用于數(shù)據(jù)傳輸?shù)腍2D和D2H時(shí)間。本發(fā)明中CPU-GPU數(shù)據(jù)傳輸程序代碼如下://createaOpenCLmemorybufferS1:buf=clCreateBuffer(size,CL_MEM_READ_WRITE);//setkernelargumentforkernel1S2:clSetKernelArg(kernel1,buf);//kernel1executionS3:clEnqueueNDRangeKernel(kernel1,buf,...);//mapthememorybuffertothehostforH2DorD2HS4:host_ptr=clEnqueueMapBuffer(buf,CL_MAP_WRITE/READ);//usethehost_ptrtosetinputdata(H2D)orgetoutputdata(D2H)S5:host_side_code(host_ptr)//unmapthememorybufferandpassthebufferaccessrighttothenextkernelS6:clEnqueueUnmapMemObject(buf,host_ptr);//setkernelargumentforkernel2S7:clSetKernelArg(kernel2,buf);//kernel2executionS8:clEnqueueNDRangeKernel(kernel2,buf,...);//releasethememorybufferS9:clReleaseMemObject(buf)。D35.估計(jì)全局大氣光,采用解映射將數(shù)據(jù)從CPU返回GPU。全局大氣光根據(jù)式四計(jì)算獲得:式四D36.在OpenCL構(gòu)架下根據(jù)全局大氣光和環(huán)境光進(jìn)行去霧操作,輸出最后的無(wú)霧圖像。無(wú)霧圖像根據(jù)式五計(jì)算獲得:式五本實(shí)施例中,使用輸入的霧天圖像寬度m和高度n來(lái)表示并行視頻去霧算法中每個(gè)步驟的并行度,利用OpenCL優(yōu)化后的FHRUSI去霧算法的并行處理如下表所示,其中并行度一欄代表可以同時(shí)處理的像素點(diǎn)的數(shù)目。從表中可以看出步驟D31、D34和D36的并行性最高,達(dá)到了圖像分辨率m×n;步驟D35的并行性是最低的,因?yàn)樾枰啻斡?jì)算出輸入圖像中所有像素之間的全局最大值;步驟D32的并行度是圖像的高度m或?qū)挾萵。步驟算法串行程序的時(shí)間復(fù)雜度并行度D31計(jì)算中每個(gè)像素點(diǎn)的暗通道值O(mn)mnD32進(jìn)行均值濾波,計(jì)算O(mn)mornD33計(jì)算中所有元素的均值O(mn)N/AD34.計(jì)算環(huán)境光O(mn)mnD35計(jì)算全局大氣光O(mn)1D36圖像去霧,得到無(wú)霧圖像O(mn)mn在基于OpenCL架構(gòu)的并行實(shí)現(xiàn)中有六個(gè)內(nèi)核函數(shù),這將導(dǎo)致巨大的內(nèi)核啟動(dòng)和內(nèi)存訪問(wèn)開銷。為了降低OpenCL內(nèi)核啟動(dòng)的開銷,本實(shí)施例實(shí)際運(yùn)行過(guò)程中在水平方向和垂直方向上將內(nèi)核進(jìn)行了合并。在水平方向上,合并具有類似的操作和不同的輸入數(shù)據(jù)的內(nèi)核;在垂直方向上,當(dāng)一個(gè)內(nèi)核的輸出數(shù)據(jù)是另一個(gè)內(nèi)核的輸入數(shù)據(jù)時(shí),將它們合并,例如,均值濾波階段,在基本的并行程序中必須被分為兩個(gè)內(nèi)核,其中第一個(gè)內(nèi)核計(jì)算每一行的平均值,第二個(gè)內(nèi)核在列中完成類似的計(jì)算,由于兩者的并行方法是相同的,因此可在優(yōu)化的并行實(shí)現(xiàn)中把它們合并,內(nèi)核合并后,即可減少三分之一的內(nèi)核。D4.將RGB格式的色彩空間轉(zhuǎn)換為YUV格式的色彩空間。D5.呈現(xiàn)去霧后的視頻圖像。本發(fā)明充分利用GPU優(yōu)異的并行計(jì)算性能,將傳統(tǒng)的去霧算法并行化,并將OpenCLKernel部署到GPU并行執(zhí)行,并根據(jù)嵌入式系統(tǒng)硬件平臺(tái)的特點(diǎn)和算法本身的特點(diǎn)進(jìn)行優(yōu)化設(shè)計(jì),充分利用GPU的設(shè)備存儲(chǔ)器層次結(jié)構(gòu),在降低計(jì)算復(fù)雜度的同時(shí),提高算法的并行度,大大減少算法的執(zhí)行時(shí)間。當(dāng)前第1頁(yè)1 2 3