• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于OpenGL ES 的圖像濾波算法實現(xiàn)及優(yōu)化研究

      2023-11-18 03:33:00常文斌牟明任賈海鵬張云泉張思佳
      計算機工程 2023年11期
      關鍵詞:著色器紋理濾波

      常文斌,牟明任,賈海鵬,張云泉,張思佳

      (1.大連海洋大學 信息工程學院,遼寧 大連 116023;2.中國科學院計算技術研究所 處理器芯片全國重點實驗室,北京 100190)

      0 概述

      圖像濾波是圖像處理領域中具有廣泛應用場景的算法,主要應用于超聲醫(yī)學、航空航天、數(shù)字媒體、人工智能等領域。圖像濾波可以起到降低椒鹽噪聲、圖像二值化、邊緣識別和提取圖像特征的作用。常見的圖像濾波方法有形態(tài)學濾波、盒式濾波、閾值濾波、壓縮濾波、算術濾波等。從實現(xiàn)原理來分析,各種濾波算法根據(jù)原始圖像的像素狀態(tài),經(jīng)過一系列不同的運算得到目標像素值。

      圖像濾波算法的研究已經(jīng)相當廣泛,但是在實際應用中仍存在許多不足之處。例如,在Android 平臺方面,雖然開源的OpenCV 庫已經(jīng)提供了較全面的圖像濾波算法,但是與其他平臺相比,其在Android 平臺的性能表現(xiàn)仍存在較大的差距。目前,還沒有廣泛應用的專門針對Android 平臺進行優(yōu)化的高性能圖像濾波算法庫。

      隨著移動終端和Android 操作系統(tǒng)的發(fā)展和普及,面向多平臺可移植嵌入式設備的高性能圖像濾波算法庫亟待完善。雖然目前在Apple 平臺已有MPS、Core Image、Vision 等算法 庫,但是其 僅支持Apple 硬件和iOS 系統(tǒng),并不普遍適用于Android系統(tǒng)。

      為進一步提高移動Android 端及相關嵌入式平臺上圖像濾波算法的實際性能表現(xiàn),本文提出一種專門針對Android 端及其嵌入式平臺進行優(yōu)化的高性能圖像濾波算法。在Android 平臺上,基于OpenGL ES 編程接口,利用OpenGL 紋理對象和緩沖傳遞圖像數(shù)據(jù),通過計算著色器實現(xiàn)算法的并行優(yōu)化,設計一種針對移動Android 端基于OpenGL ES接口的優(yōu)化體系,實現(xiàn)并優(yōu)化一系列濾波算法,以提升算法運算性能。

      1 相關工作

      1.1 針對OpenGL 的相關工作

      OpenGL[1]是用于渲染2D、3D 矢量圖形的跨語言、跨平臺的應用程序編程接口,而本文用到的OpenGL ES 3.2[2]是OpenGL 的1 個子集,主要針對移動電話、手持設備、家電設備、汽車等嵌入式設備而設計的。研究指出,在移動設備上采用OpenGL ES實現(xiàn)的視頻濾波算法[3],相比現(xiàn)有的OpenCV 濾波算法庫,在內存和功耗方面具有更大的優(yōu)勢,在算法性能方面也有顯著提升。相關研究顯示,面向Android系統(tǒng)的硬件設備對OpenGL ES 有更加友好的支持[4]。然而,目前還缺少針對Android 平臺設計、使用OpenGL ES 實現(xiàn)和優(yōu)化性能較好的圖像濾波算法。因此,上述研究為本文選擇使用OpenGL ES 編程接口來實現(xiàn)和優(yōu)化圖像濾波算法提供了有價值的參考。

      在OpenGL 的眾多著色器中,計算著色器是一種用于通用計算的特殊著色器,其本身可以看作一種特殊的、單一階段的管線,以更加充分地利用GPU的計算能力[5]。目前,研究人員提出采用OpenGL 計算著色器實現(xiàn)矩陣乘法[6]。但是在使用計算著色器進行圖像濾波計算方面的研究還較不足,為本文基于OpenGL ES 計算著色器的算法優(yōu)化工作提供了一定的參考。

      相關研究指出,在OpenGL 中,紋理和緩沖的存儲和訪問方式非常適合在CPU 和GPU 之間高效地傳輸圖像數(shù)據(jù)[7-9]。就紋理而言,在著色器內使用紋理坐標對紋理像素進行訪問,實現(xiàn)像素級的計算和操作[10]。然而,在現(xiàn)有研究中,紋理主要被用于在片元著色器中對圖像進行采樣和處理[11],例如利用紋理映射技術將紋理圖像應用于幾何圖形中,以獲得更逼真的渲染效果[12]。在計算著色器中使用紋理操作數(shù)據(jù)的研究相對較少。因此,在OpenGL ES 中,將紋理與計算著色器相結合,以實現(xiàn)更高效的并行計算和數(shù)據(jù)操作的研究具有一定意義。

      1.2 針對濾波算法優(yōu)化的相關工作

      目前,已經(jīng)有相當一部分針對圖像濾波算法進行優(yōu)化的研究,例如,基于NVIDIA 公司的GPU 采用CUDA 編程模型[13]對盒式濾波、高斯濾波進行并行優(yōu)化[14],基于ARMv8 處理器,采用SIMD 和匯編指令對圖像濾波算法進行優(yōu)化[15]。此外,研究人員通過引入Graph-Waving 架構[16],提升SIMD 元件利用率,以有效提升算法性能。針對SIMD 等指令級并行性和流水線的優(yōu)化工作[17-19]都不同程度地提高其研究算法的性能。上述研究表明,通過并行優(yōu)化方式可以顯著提升圖像濾波算法性能,有效提高圖像濾波的處理速度和效率。然而,目前的優(yōu)化工作大多都基于多核CPU[20]或者基于GPU,使用圖形渲染方式進行優(yōu)化?;贏ndroid 平臺,使用OpenGL ES計算著色器并行優(yōu)化的研究相對不足。

      此外,還有相當一部分研究是對基于圖形學的圖像濾波效果進行優(yōu)化[21-23],并未對算法的運算效率和性能優(yōu)化做更多的闡述。例如,相關研究在移動Android 設備中將油畫濾波算法通過OpenGL ES圖形渲染管線實現(xiàn)并進行優(yōu)化[24],取得較優(yōu)的圖像效果。但是,該類工作主要側重于圖形學效果的優(yōu)化,對算法運算效率的提升并不顯著[25]。也有研究從圖形學的實現(xiàn)原理出發(fā),對形態(tài)學濾波算法的并行實現(xiàn)進行研究[26],取得了較高的計算精度和較優(yōu)的圖像效果。然而,在許多應用場景中,本文更加關注在滿足一定精度要求的同時優(yōu)化算法性能,以提高其在實際應用中的速度和效率。

      在插值和投影等優(yōu)化算法中,查表法具有較好的優(yōu)化效果[27]。這項研究為本文在閾值濾波算法中使用查表法提供了一定的參考。

      2 算法原理

      2.1 線性濾波算法

      線性濾波是指由源圖像某一像素點周圍濾波窗口數(shù)量的像素值經(jīng)過一系列的算術運算,得到最終輸出圖像像素值的濾波算法。線性濾波算法計算式如下:

      其中:kkerne(lx',y')為不同的卷積算子;x'和y'的值隨卷積算子大小而定,不同的卷積核對應不同的濾波算法。本文研究的線性濾波算法有盒式濾波和算術濾波。

      從原理方面分析,線性濾波根據(jù)某一特定卷積算子(由具體的濾波算法而定),按照從左到右、從上到下的順序,對原始圖像逐個像素進行卷積運算。

      以盒式濾波為例,當Normalize 參數(shù)設定為True時其算法原理如圖1 所示,圖中kernel 為1 個3×3 的卷積算子。將3×3 窗口內的源圖像數(shù)據(jù)與卷積算子對應位置的數(shù)據(jù)相乘,再把求得的9 個數(shù)相加,將最終值賦給當前的錨點,即為算法所求的值。錨點為濾波窗口的中心,對于某些特殊的計算需求,錨點也可自定義為濾波窗口內的任一位置。

      2.2 非線性濾波算法

      非線性濾波是指源圖像通過取最值、置零和取絕對值等一系列邏輯運算(而非算術運算),求得目標像素點的濾波算法。本文研究的非線性濾波算法包含形態(tài)學濾波、閾值濾波和壓縮濾波。從實現(xiàn)原理來分析,非線性濾波也有線性濾波中類似卷積算子的概念,但兩者的區(qū)別在于:線性濾波的卷積算子是不同算法有不同的值;在非線性濾波中,卷積算子的數(shù)值可以看作是濾波窗口內源圖像的像素值。非線性濾波算法通過在源圖像卷積窗口內進行邏輯運算,以替換源圖像像素錨點的值,從而實現(xiàn)相關濾波功能。

      形態(tài)學濾波是一種基于數(shù)學形態(tài)學的典型非線性濾波方法,通過計算濾波窗口內的最值來替換源圖像像素值,使得圖像內的噪聲被濾波窗口內的最值代替,以達到形態(tài)學的腐蝕和膨脹等目的,為圖像邊緣檢測和特征提取提供數(shù)據(jù)基礎。1 個大小為3×3 濾波窗口的形態(tài)學腐蝕濾波算法示意圖如圖2 所示,src 為源圖像像素值,dst 為輸出圖像像素值。

      圖2 形態(tài)學腐蝕濾波算法原理示意圖Fig.2 Schematic diagram of the principle of morphological erode filtering algorithm

      形態(tài)學腐蝕濾波、膨脹和梯度算法計算式分別如式(2)~式(4)所示:

      其中:eelement為濾波窗口。本文只研究矩形濾波窗口,通常其長、寬相等且為奇數(shù)如3×3、5×5、7×7 等。

      根據(jù)算法性質,形態(tài)學執(zhí)行次數(shù)可以與卷積窗口大小相關聯(lián),當執(zhí)行次數(shù)大于1 時,通過式(5)和式(6)改變窗口大小,達到多次進行濾波的圖像學效果,從而提升算法性能。

      此外,形態(tài)學的開(Open)、關(Close)算法均基于erode 和dilate 計 算,不同之 處在于:Open 算法先執(zhí)行erode 后執(zhí)行dilate,而Close 算法先執(zhí)行dilate后執(zhí)行erode。此外,Gradient 算法則是將源圖像執(zhí)行1 次dilate,再將該計算結果與源圖像進行erode 的計算結果做減法,得到形態(tài)學梯度圖。

      3 基于OpenGL 的優(yōu)化策略

      3.1 naive 實現(xiàn)

      本文所完成的圖像濾波算法首先在CPU 端進行naive 實現(xiàn),再通過OpenGL ES 移植到移動設備的CPU+GPU 異構平臺上進行優(yōu)化。

      在形態(tài)學濾波的naive 實現(xiàn)中,本文采用先行后列求最值方式,輸入整幅圖像,按照濾波窗口大小,先將經(jīng)過邊界處理源圖像的行按照濾波窗口寬度大小求出最值,將每行的計算結果放至環(huán)形緩沖區(qū)(在算法程序內部聲明,以首尾相連的方式組織數(shù)據(jù)的存儲結構),將足夠數(shù)量的行(根據(jù)聲明的空間大小和圖像數(shù)據(jù)量而定)計算完成后,再按照濾波窗口高度計算列最值,如此往復,直至循環(huán)整張圖像。該方式的優(yōu)點:減少重復訪存,在計算列最值時直接重復使用求得的行最值,不須重復訪問源圖像數(shù)據(jù),將訪存不連續(xù)的濾波窗口變成訪存連續(xù)的行,大幅減少訪存的時間開銷。

      盒式濾波的naive 實現(xiàn)與形態(tài)學先行后列的方法類似。本文將取最值操作改為求和操作,將濾波窗口內的像素值累加并存儲在中間矩陣中,然后與濾波核中的數(shù)值做乘法,求得源圖像均值。在盒式濾波中,本文通過權值置一的方法提供了非歸一化的濾波算法。該算法可以用來計算源圖像各像素在濾波窗口鄰域內的積分特征。

      在閾值濾波算法的naive 實現(xiàn)中,分為定閾值濾波算法和自適應閾值算法。在定閾值濾波算法中,本文支持自定義閾值和指定閾值計算方法。閾值計算的具體方法可以通過計算類間最大方差確定閾值的大津閾值法(Otsu's),該計算方法適合雙峰直方圖,還可以通過計算直方圖曲線與直線之間最大距離確定Triangle 閾值,適合單峰直方圖。Otsu's 算法計算類間最大方差的計算式如式(7)所示:

      其中:x為像素值;n為權重。

      閾值濾波還提供了5種不同的圖像二值化類型供用戶選擇。二值化(THRESH_BINARY)計算式如下:

      反二值化(THRESH_BINARY_INV)計算式如下:

      閾值截斷(THRESH_TRUNC)計算式如下:

      閾值置零(THRESH_TOZERO)計算式如下:

      反閾值置零(THRESH_TOZERO_INV)計算式如下:

      自適應閾值濾波的naive 實現(xiàn)示意圖如圖3 所示。本文首先采用高斯濾波或盒式濾波將源圖像(這里的源圖像為灰度圖)轉換為均值圖像;然后通過src-mean 對源圖像與均值圖像做減法,再結合權重,自適應地將源圖像轉換為二值化圖像。此外,在算法的實現(xiàn)中,本文還引入查表法,提前計算灰度圖(像素值為0~255)所有可能像素值的二值化結果,并將結果存儲在Tab 表中,通過查表法將均值圖像的值與表的索引進行對比。對于二值化計算,本文只需要將對比成功表中的二值化結果直接存入輸出圖像中。該方法在處理大規(guī)模的圖像像素數(shù)據(jù)下可以減少一部分計算量。

      圖3 自適應閾值濾波的naive 實現(xiàn)示意圖Fig.3 Schematic diagram of naive implementation of adaptive threshold filtering

      算術濾波naive 算法實現(xiàn)了單通道圖像(只包含一種顏色通道的圖像)和三通道圖像(R、G、B 圖像)像素值的加權算術運算。通過2 幅相同尺寸圖像上對應的像素點,將對應通道像素值的和、差、商、積算術運算作為目標像素點值。加權積和加權商算法計算式如下:

      其中:sscale為權值;ssaturate將像素值限制在0~255 之間。

      壓縮濾波在naive 實現(xiàn)中支持單通道和三通道這2 種圖像格式,支持將源圖像像素值按照行和列壓縮的2 種壓縮方法。算法原理為求得當前行或列的像素最值、均值或者像素和,用所求值代替源圖像的當前行或當前列,使圖像一維化。圖4 所示為三通道圖像數(shù)據(jù)按照求均值按行壓縮以及三通道圖像數(shù)據(jù)求和按列壓縮示意圖。本文通過壓縮濾波將1 個三通道圖像變成1 個一維的三通道向量。

      圖4 三通道圖像壓縮濾波算法示意圖Fig.4 Schematic diagram of three-channel image compression filtering algorithm

      在本文所實現(xiàn)的圖像濾波naive 算法中,當算法處理到圖像邊界像素時,時常會出現(xiàn)超出圖像邊界的情況。如果不對邊界進行處理,那么在訪問這些位置時可能會產(chǎn)生越界操作。針對該問題,本文提出如圖5 所示的邊界處理方法。

      該方法包括默認邊界、由用戶指定的常數(shù)邊界、用源圖像同側值填充的復制邊界、用源圖像邊界鏡像像素值填充的鏡像邊界。

      3.2 訪存優(yōu)化

      圖像濾波算法本身具有較優(yōu)的數(shù)據(jù)獨立性、局部性和數(shù)據(jù)重用性的并行特征,適合在大規(guī)模的細粒度圖形處理器GPU 中進行處理。圖像濾波算法按照計算和訪存的特性可以大致分為數(shù)據(jù)無關算法和數(shù)據(jù)相關算法。

      數(shù)據(jù)無關算法是指在算法中,源圖像各個連續(xù)的像素點通過各自單獨運算獲得目標像素值,各像素點之間沒有關聯(lián),互不影響,如本文實現(xiàn)的算術濾波和固定閾值的閾值濾波算法。該類算法計算獨立并且訪存連續(xù),具備良好的并行性。因此,本文對該類算法的優(yōu)化重點在于提高單個像素點的計算效率、提高數(shù)據(jù)的訪存以及對數(shù)據(jù)的并行計算效率。

      對于這類問題的訪存優(yōu)化,通過同時執(zhí)行多個處理單元,采用批量讀寫數(shù)據(jù)的方式可以極大程度地提升訪存效率。在CPU 向GPU 傳遞數(shù)據(jù)時,OpenGL 支持紋理和緩沖2 種大規(guī)模數(shù)據(jù)的存儲形式。相比緩沖這種通用的存儲形式而言,圖像濾波算法對圖像紋理這種結構化的存儲形式更加友好。紋理存儲形式也更加適用于計算海量數(shù)據(jù)的著色器。本文通過紋理來實現(xiàn)大規(guī)模圖像數(shù)據(jù)在本地和著色器間的傳遞和操作,提高計算著色器對圖像像素數(shù)據(jù)的處理效率。

      在著色器內部對圖像紋理進行讀取和寫入操作的具體方法有imageLoad()、imageStore(),其中imageLoad()方法的返回值類型是vec4,在單通道圖像數(shù)據(jù)中,本文嘗試使用vec4 數(shù)據(jù)類型將單通道的數(shù)據(jù)向量化,以達到高效訪存的目的。經(jīng)過實驗發(fā)現(xiàn),imageLoad()方法在單通道圖像數(shù)據(jù)中的返回值雖然仍是vec4 類型,但是實際上該方法只支持單獨像素單元的存取,在單通道數(shù)據(jù)中,并不支持使用其他通道。因此,計算著色器內的訪存優(yōu)化以更加合理的線程布局和紋理存取像素值為主的方式實現(xiàn)。

      數(shù)據(jù)相關算法是指目標圖像中每個目標像素值計算需要依賴源圖像中其他像素值參與的算法。例如,在計算目標像素值時,需要利用源圖像錨點像素值周圍一定范圍內的鄰域像素值作為卷積核的一部分,共同參與計算,從而得到目標像素值。本文所實現(xiàn)的形態(tài)學濾波、自適應閾值濾波和盒式濾波均為數(shù)據(jù)相關算法。該類算法的優(yōu)化重點在于利用數(shù)據(jù)局部性原理,減少對內存的頻繁訪問,提高訪存,以提高算法的效率和性能。例如,更加充分利用GPU的共享內存或紋理緩存從而減少數(shù)據(jù)傳輸和訪問的延遲。本文所使用的實驗平臺采用的共享內存沒有性能提升,其原因可能是該設備的GPU 中沒有共享內存硬件,也沒有高速存儲設備做支持。這一點在ARM Mali GPU 的開發(fā) 者文檔 中得到證實[28],Mali GPU 不為計算著色器實現(xiàn)提供專門的片上共享內存,而是使用系統(tǒng)的RAM 實現(xiàn)相關功能。因此,對于該類算法的優(yōu)化策略,本文使用紋理訪問圖像數(shù)據(jù)、充分利用數(shù)據(jù)局部性、合理分配線程、提高Cache的命中率,進一步提升訪存性能的優(yōu)化策略性能。

      3.3 計算著色器并行優(yōu)化

      3.3.1 并行算法

      本文采用計算著色器對圖像濾波算法進行并行優(yōu)化,計算著色器屬于無固定輸入輸出的著色器(可以自定義輸入輸出變量),是OpenGL 中一種特殊的管線。這種特性使得它具有更強的靈活性,可用于執(zhí)行各種通用計算任務,而不僅僅局限于圖形渲染。本文所提算法采用紋理來存儲數(shù)據(jù),使得計算著色器在GPU 上執(zhí)行計算任務時可以并行地直接訪問和處理大規(guī)模圖像數(shù)據(jù),無須頻繁地訪問全局內存,這種方式能有效發(fā)揮計算著色器的優(yōu)勢。在本文的工作中并行算法計算的核心是在計算著色器的眾多工作組中執(zhí)行,通過調用gldispatchCompute()方法啟動并發(fā)計算任務,將圖像按照像素點分配線程,在GPU 上進行處理。在GPU 中,全局工作組被劃分為多個局部工作組,局部工作組的大小可以自定義,在每個工作組中的若干個工作項通過計算著色器進行運算和操作。二維工作組的劃分示意圖如圖6所示。在計算著色器中,每個像素點在全局中的位置坐標可由當前工作組的坐標、局部工作組大小和工作項坐標表示,即gl_GlobalInvocationID=gl_WorkGroupID*gl_WorkGroup Size+gl_LocalInvocationID。本文在計算著色器內全局的規(guī)劃線程進行運算和操作。合理劃分工作組大小可以在一定程度上有效提升算法性能。

      在劃分工作組后,OpenGL 的每個工作組都根據(jù)計算著色器的核心算法并行地執(zhí)行相同的運算。所有的計算和操作均在計算著色器內完成。三通道圖像并行算法的示意圖如圖7 所示,pipeline 為僅有計算著色器的特殊管線,每個工作項均進入以計算著色器為核心的特殊管線中。

      圖7 三通道圖像并行算法示意圖Fig.7 Schematic diagram of three-channel image parallel algorithm

      在形態(tài)學濾波的并行算法中,本文無須將圖像整體按照行列拆分運算,而是同時開啟圖像像素點數(shù)量的工作項,以單個像素點為單位進行計算。在計算著色器中,本文提取當前錨點附近的濾波窗口大小的像素點,依次比較求出最值,再傳入到目標圖像中。針對單通道、三通道和四通道圖像數(shù)據(jù),本文分別采 用OpenGL 自帶的GL_R、GL_RGB 和GL_RGBA 向量化的方式來實現(xiàn)。由于OpenGL ES 3.2在計算著色器內僅支持布爾類型、32 bit 整數(shù)和浮點操作,因此在8U 圖像中,相比單通道數(shù)據(jù),三通道數(shù)據(jù)和四通道數(shù)據(jù)能更加充分利用存儲空間,具有較優(yōu)的優(yōu)化效果。

      在盒式濾波的并行算法中,本文開辟圖像像素點大小的工作項,將每個像素點所在位置作為錨點,向周圍擴展濾波窗口大小的像素點,在計算著色器內,將這些像素點求和,并乘以權值(計算均值時為1(/kernel.x*kernel.y))的大小,在計算完成后,將結果傳到輸出紋理坐標上,每個工作項均執(zhí)行這一相同計算。

      在自定義閾值的閾值濾波并行算法中,本文將閾值和最大值(maxval)作為統(tǒng)一變量,通過統(tǒng)一變量綁定點傳入計算著色器內,在計算著色器內判斷當前像素值與閾值的大小關系,按照不同的閾值類型,將正確的目標值寫入到輸出圖像所在的紋理坐標中。

      在自適應的閾值濾波中,本文將經(jīng)過盒式濾波和高斯濾波計算后的中間矩陣mean 和源圖像src 一起傳入計算著色器中,用式(15)和式(16)替代naive實現(xiàn)中使用的查表法,減小Tab 表所占用的內存空間和多次訪存開銷,將查表法的功能拆分重組,在計算著色器內使用如下公式精簡計算,進一步提升算法性能:

      在算術濾波的并行算法中,本文針對2 幅圖像的像素值進行并行算術運算。為實現(xiàn)該目標,本文同時將2 幅圖像的像素值綁定到紋理單元并傳入計算著色器中,在著色器內部對2 幅圖像的每個坐標位置數(shù)據(jù)進行加、減、乘、除算術運算,各紋理坐標對應像素點并行地通過計算著色器,將計算結果傳入至輸出圖像紋理單元中。算術濾波算法是典型的數(shù)據(jù)無關算法,單獨目標像素值的計算只需要2 個源圖像對應的坐標值和權值即可,不需要其他源像素值和中間計算結果的參與。這種算法對于并行訪存和并行計算非常友好。本文優(yōu)化算法在實驗設備中相對于OpenCV 開源庫中對應算法的性能提高7 倍左右。

      在壓縮濾波的并行算法中,本文基于算法原理將源圖像根據(jù)最值、均值以及求和壓縮成一行或者一列。在劃分工作組時根據(jù)目標矩陣的情況(即一行或者一列)將工作組劃分為對訪存和計算更加友好的狀態(tài)。例如,將矩陣壓縮為一列時,本文將每行作為1 個工作組,并將工作組大小設置為height 為1 的塊。本文采用這種方式在每個工作組中計算當前行的數(shù)據(jù),從而減少重復的計算次數(shù)和訪存操作。

      3.3.2 邊界處理優(yōu)化

      在并行算法的邊界處理中,由于每個線程都通過相同的計算著色器,因此并行算法將邊界處理移至計算著色器中。在這種情況下,本文只須在著色器中判斷當前計算所需坐標像素是否在源圖像內部。如果超出了源圖像的邊界,本文賦予其對應邊界鏡像坐標值或特定值等邊緣填充值即可。該方案在一定程度上提升了并行算法的整體性能,減少處理圖像邊界所帶來的大部分空間和時間開銷。

      3.3.3 數(shù)據(jù)類型優(yōu)化

      在數(shù)據(jù)類型方面,本文所使用的OpenGL ES 3.2目前支持32 bit 整數(shù)、浮點數(shù)和布爾類型數(shù)據(jù),對于其他數(shù)據(jù)類型并不支持。本文提供除整數(shù)和32 bit浮點數(shù)以下的其他數(shù)據(jù)解決方案:將8UC1 數(shù)據(jù)轉換為GL_R32UI 類 型,將8UC3 和8UC4 數(shù)據(jù)轉換為GL_RGBA32UI 類型,目前本文已經(jīng)安全地支持所有常用的8~32 bit 的有符號數(shù)和無符號數(shù)在OpenGL ES 進行傳輸和運算。

      3.4 數(shù)據(jù)通信優(yōu)化

      在CPU+GPU 的異構平臺下,將數(shù)據(jù)在CPU 和GPU 之間進行高效的通信是非常重要的,這也是本文優(yōu)化的重點方向。為此,本文分別針對小規(guī)模數(shù)據(jù)和大規(guī)模數(shù)據(jù)提出不同的解決方案。

      在小規(guī)模數(shù)據(jù)方面,OpenGL 提供統(tǒng)一變量(Uniform)關鍵字,允許將這些數(shù)據(jù)作為全局變量通過glUniform*()方法綁定到緩沖區(qū)。由于本文所使用的計算著色器具有在著色器和本地之間保持同步和共享數(shù)據(jù)傳輸?shù)奶匦裕虼藢⒕彌_區(qū)作為存儲和傳輸小規(guī)模數(shù)據(jù)的媒介。

      對于大規(guī)模數(shù)據(jù),采用Uniform 需要依次綁定,這顯然是非常低效的。為此,OpenGL 提供一致區(qū)塊,將需要輸入和輸出計算著色器的大量全局數(shù)據(jù)映射在統(tǒng)一緩沖對象(Uniform Buffer Object,UBO)上,并通過綁定點使其相互對應。UBO 綁定數(shù)據(jù)示意圖如圖8 所示。

      本文在圖像數(shù)據(jù)由CPU 向GPU 上傳的過程和從GPU 向CPU 下載的過程中采用一致區(qū)塊,在GPU部分采用更利于計算著色器進行并行訪存和計算的紋理存儲形式。在OpenGL ES 中紋理也可以綁定在Uniform 綁定點上,本文經(jīng)過紋理坐標在計算著色器內部訪問圖像像素點,完成與圖像濾波相關的操作和計算。

      4 實驗結果與分析

      4.1 實驗環(huán)境搭建

      本文實現(xiàn)的高性能圖像濾波算法庫在天璣1200處理器上進行運行測試。該處理器包含1 個主頻為3.0 GHz 的A78 大核心、3 個主頻 為2.6 GHz 的A78中核心,以及4 個主頻為2.04 GHz 的A55 小核心。此外,處理器還搭載了基于ARM Mali-G77 架構的Mali-G77 MC9 GPU。實驗中采用了4.5.5 版本的OpenCV 庫和3.2 版本的OpenGL ES 接口。具體的實驗環(huán)境配置如表1 所示。

      4.2 性能對比分析

      本文使用的所有源圖像數(shù)據(jù)都是通過程序生成的隨機數(shù),使用隨機數(shù)生成的圖像數(shù)據(jù)能夠消除真實圖像數(shù)據(jù)的特殊性和偏差,從而更準確地評估不同算法和優(yōu)化技術的性能,同時確保了實驗結果的可重復性,使得其他研究人員可以在相同條件下進行復現(xiàn)和比較,使用隨機數(shù)生成的圖像數(shù)據(jù)也使得實驗更具普適性。因此,本文實驗結果不僅適用于特定類型或特定領域的圖像數(shù)據(jù),而且具有一般性和廣泛適應性,對于算法和優(yōu)化技術的推廣和應用具有重要意義。此外,本文調用了部分OpenCV 庫中圖像濾波算法與本文所提的優(yōu)化算法進行性能對比。除非特別說明,否則本文在調用這些算法時均使用了默認參數(shù),以確保對比實驗的公平性和一致性。

      本文實現(xiàn)的形態(tài)學濾波與OpenCV 庫中morphologyEx()函數(shù)在8UC3(三通道的8 bit 無符號整數(shù))的圖像數(shù)據(jù)下進行對比。形態(tài)學濾波性能對比如圖9 所示(3×3、5×5、7×7 表示卷積窗口的大?。?。本文將算法中iterations 參數(shù)設置為1,得到最直觀的性能差異。在不同規(guī)模圖像中,本文實現(xiàn)的基于OpenGL ES 的優(yōu)化算法性能提升最大約為30.543 倍,性能提升最小約為1.994 倍,平均性能提升約為16.269 倍。

      圖9 形態(tài)學濾波性能對比Fig.9 Comparison of morphological filtering performance

      從圖9 可以看出,在OpenCV 算法中,隨著卷積窗口變大,相同計算規(guī)模下的算法耗時有不同程度增加,導致算法的整體性能下降。本文所實現(xiàn)的優(yōu)化算法OpenGL 在相同情況下并未顯示出明顯的性能差異,其原因為在卷積窗口由3×3 變?yōu)?×7 時,計算單個目標像素值需要參與運算的數(shù)據(jù)由9 個(3×3)增加到49 個(7×7),即每個目標像素值的計算需要增加40 個數(shù)據(jù)。在OpenCV 的算法中,整幅圖像所有像素值的計算耗時會累積,從而導致算法的整體性能下降。相比OpenCV,本文實現(xiàn)的基于OpenGL ES優(yōu)化算法將由增大濾波窗口所帶來的負載均衡地分配到GPU 的每個核心上(從算法的角度將負載平均分配到每個工作項上)進行并行執(zhí)行,而不是在單個計算核心上累積計算耗時。因此,濾波窗口的變化對該算法性能的影響大幅減小。

      本文實現(xiàn)的盒式濾波優(yōu)化算法與OpenCV 的boxFilter()函數(shù)進行對比。圖10 所示為8UC1(單通道的8 bit 無符號整數(shù))盒式濾波性能對比。8UC1 圖像數(shù)據(jù)中性能最高提升34.425 倍,最低提升1.602 倍,平均提升15.299 倍。圖11 所示為8UC3 盒式濾波性能對比。8UC3 圖像數(shù)據(jù)下性能最高提升110.018 倍,最低提升3.903 倍,平均提升42.150 倍。從圖10和圖11可以看出,本文實現(xiàn)的基于OpenGL ES優(yōu)化算法在處理三通道數(shù)據(jù)時表現(xiàn)更明顯的優(yōu)化效果。這是因為在進行三通道數(shù)據(jù)運算時,本文進一步利用OpenGL 中紋理的特性,對三通道圖像中每個像素點上的3 個8U 數(shù)據(jù)進行向量化操作,使得數(shù)據(jù)訪問更加連續(xù)且高效。該方法將優(yōu)化前使用3 條指令才能完成的工作減少到1 條指令,顯著提升算法的執(zhí)行性能和效率。

      圖10 8UC1 盒式濾波性能對比Fig.10 Comparison of 8UC1 box filtering performance

      圖11 8UC3 盒式濾波性能對比Fig.11 Comparison of 8UC3 box filtering performance

      本文實現(xiàn)的自適應閾值濾波算法與OpenCV 的adaptiveThreshold()函數(shù)性能對比如圖12 所示,將對比的2 個算法adaptiveMethod 參數(shù)均設置為ADAPTIVE_THRESH_GAUSSIAN_C,threshold--Type參數(shù)均設置為THRESH_BINARY。本文實現(xiàn)的基于OpenGL ES 優(yōu)化算法性能最高提升39.251 倍,最低提升2.125 倍,平均提升20.688 倍。

      圖12 自適應閾值濾波性能對比Fig.12 Comparison of adaptive threshold filtering performance

      在本文實現(xiàn)的算術濾波算法中,除法(DIV,divide)算法與OpenCV 的divide()函數(shù)性能對比如圖13 所示。該算法性能最高提升13.365 倍,最低提升1.509 倍,平均提升7.437 倍。

      在壓縮濾波中,最值(MAX)、均值(AVG)以及求和(SUM)算法與OpenCV 中的reduce()函數(shù)的性能對比如圖14 所示。相比OpenCV 中對應算法,本文優(yōu)化算法性能最高提升57.863 倍,最低提升1.509 倍,平均提升29.686 倍。

      圖14 壓縮濾波性能對比Fig.14 Comparison of compression filtering performance

      從圖9~圖14 可以看出,隨著圖像規(guī)模的增大,本文優(yōu)化算法相對于OpenCV 中對應算法的性能提升也逐漸增大。這種性能提升的原因主要有:本文采用計算著色器將整幅圖像的計算任務均勻分配到GPU 的多個核心上,能夠更充分地利用GPU 的計算資源,有效提高算法的并行性;本文通過紋理存儲圖像數(shù)據(jù)的方式減少對圖像數(shù)據(jù)的頻繁讀寫操作,從而減少訪存延遲和數(shù)據(jù)傳輸開銷,進一步提升訪存性能。當圖像數(shù)據(jù)由4 096×512 個增加到4 096×2 048 個時,圖像數(shù)據(jù)增加到原來的4 倍。在OpenCV 算法中,處理這些數(shù)據(jù)所需的時間在單個核心上累積,導致大規(guī)模圖像的計算時間呈倍數(shù)增加。本文優(yōu)化算法能夠將計算任務并行地分配到GPU的多個計算核心上,該計算核心同時處理這些計算任務,更充分地利用GPU 的計算資源,使得性能提升逐漸增大。隨著圖像規(guī)模的增大,本文優(yōu)化算法在并行性和訪存優(yōu)化方面的優(yōu)勢也變得更加顯著。

      此外,OpenCV 對應的算法出現(xiàn)了一些明顯的性能下降點。這是因為在該實驗中,本文按照從小到大的趨勢分別設置了圖像的長和寬。當圖像的寬度從2 160 個像素點減小到512 個像素點時,因圖像規(guī)模變小,相應算法的運行時間也會縮短。

      整體上,本文實現(xiàn)的基于移動Android 端使用OpenGL ES 的圖像濾波算法性能明顯優(yōu)于OpenCV庫中的相關算法。實驗結果表明,本文實現(xiàn)的圖像濾波算法進行的一系列優(yōu)化手段是有效的。

      5 結束語

      本文實現(xiàn)針對移動Android平臺基于OpenGL ES的圖像濾波算法庫,實現(xiàn)了形態(tài)學濾波、多種閾值濾波、盒式濾波、壓縮濾波、算術濾波。通過OpenGL計算著色器、紋理和統(tǒng)一變量對算法進行優(yōu)化,總體上其性能與OpenCV 開源庫相關算法相比得到顯著提高,平均性能為OpenCV 的21.561 倍,在優(yōu)化性能的同時也為基于Android 平臺使用OpenGL ES 的高性能圖像濾波算法提供了新的優(yōu)化方案。本文所實現(xiàn)的圖像濾波算法全面適配8U 數(shù)據(jù)類型且滿足少量32S 數(shù)據(jù)類型。下一步將在更多數(shù)據(jù)類型上對算法的實現(xiàn)和優(yōu)化進行研究,以擴大高性能圖像濾波算法庫的數(shù)據(jù)類型應用場景。

      猜你喜歡
      著色器紋理濾波
      基于UE4 實時射線追蹤技術的研究與探討
      基于Unity Shader石油泄漏現(xiàn)象模擬的研究
      基于IMx6的opengl圖形著色器開發(fā)研究
      中國新通信(2020年2期)2020-06-24 03:06:44
      基于BM3D的復雜紋理區(qū)域圖像去噪
      軟件(2020年3期)2020-04-20 01:45:18
      使用紋理疊加添加藝術畫特效
      TEXTURE ON TEXTURE質地上的紋理
      Coco薇(2017年8期)2017-08-03 15:23:38
      消除凹凸紋理有妙招!
      Coco薇(2015年5期)2016-03-29 23:22:15
      RTS平滑濾波在事后姿態(tài)確定中的應用
      基于線性正則變換的 LMS 自適應濾波
      遙測遙控(2015年2期)2015-04-23 08:15:18
      基于隨機加權估計的Sage自適應濾波及其在導航中的應用
      黑山县| 河池市| 稻城县| 曲水县| 玉山县| 肃南| 永清县| 澎湖县| 綦江县| 平南县| 博罗县| 江山市| 太康县| 吴忠市| 平罗县| 万州区| 政和县| 金华市| 镇原县| 颍上县| 资中县| 东丰县| 左权县| 卓资县| 洛川县| 绍兴县| 衢州市| 南溪县| 七台河市| 宜良县| 辽阳市| 沾益县| 武陟县| 大同县| 南汇区| 盐津县| 乌兰察布市| 义马市| 旬邑县| 沁水县| 长泰县|