L0 範數圖像平滑(L0 Smooth) 的原理和 GPU 加速【CUDA】

一、概述

原作者提出了一種新的圖像編輯方法,通過增加過渡的陡峭度,同時消除了一個低振幅結構的可管理程度,特別有效地銳化主要邊緣。這種看似矛盾的效果是在一個利用 L0 梯度最小化的優化框架中實現的,它可以全局控制產生多少個非零梯度,以一種稀疏控制的方式近似出顯著的結構。與其他邊緣保持平滑方法不同,原作者的方法不依賴於局部特徵,而是全局定位重要的邊緣。它作爲一種基本的工具,有許多應用場景,尤其有利於邊緣提取、剪貼畫JPEG僞影去除和非真實感效果的生成。

 原作者的目標是在不影響整體銳度的情況下,通過增加過渡的陡度,在全局範圍內保持並儘可能增強最顯著的邊緣集合。在算法上,原作者提出了一種基於優化框架的稀疏梯度計數方法。其主要貢獻是提出了一種限制相鄰像素間強度變化離散個數的新策略,該策略在數學上與 L0 範數相關,用於信息稀疏性的跟蹤。作者認爲他們的方法在性質上的效果是使顯著邊緣變薄,使其更容易被檢測到,視覺上更清晰。與顏色量化和分割效果不同的是,使用作者的方法增強後的邊緣與原始邊緣基本一致。即使是小分辨率的對象和細邊,如果它們在結構上引人注目,也可以忠實地保留下來。

 在應用方面,作者認爲該框架是通用的,他們將其應用於壓縮僞影退化的剪貼畫的恢復,聲稱在大量實驗中可以得到高質量的結果。作者還聲稱他們的方法可以通過有效地去除部分噪聲、不重要的細節,甚至是輕微的模糊,使得“邊緣提取”這一非常基礎而又重要的操作受益;同時,經過平滑的結果可以立即用於圖像抽象和鉛筆素描的特效製作上。

二、核心算法(一維)

作者通過限制非零梯度的數量來增強對比度最高的邊緣,同時以全局方式實現平滑。首先,用 g 表示輸入的離散信號,用 f 表示它的平滑結果。作者的方法是離散地計算振幅的變化,記爲

                                                                      c( f ) = \#\left \{ p | | f_{p} - f_{p+1}| \neq 0 \right \}

其中 p 和 p + 1 索引鄰近的樣本(或像素)。| f_{p} - f_{p+1} | 是關於 p 的前向差分形式的梯度。# { } 是計數操作符,輸出 p 的數量滿足| f_{p} - f_{p+1} |\neq 0,即 L0 範數的梯度c(f) 不依賴梯度大小,因此如果一條邊只改變其對比度,則不會受其影響。這個離散計數函數是我們方法的核心

但是僅使用度量 c(f) 是無效的。在作者的方法中,將其與一個一般的約束結合起來——即,結果 f 在結構上應該與輸入信號 g 相似——因此作者把具體的目標函數表示爲

                                                                  \underset{f}{min} \underset{p}{\sum} (f_{p}-g_{p})^{2}   s.t. c(f) = k
c(f) = k 表示結果中存在 k 個非零梯度,。在該目標函數的約束下,整體形狀與原始形狀保持一致,因爲強度變化必須沿顯著邊緣出現,以儘可能減少總能量。顯然,把邊緣放在其他地方只會增加(目標函數的)成本。這種平滑效果明顯不同於以往的邊緣保持方法。k 越大,得到的近似值越小,但仍然是最顯著的對比度。

在實際應用中,目標函數中的 k 值可能在數萬到數千之間,特別是在不同分辨率的二維圖像中。爲了控制它,作者認爲應該採用一般形式,在結構扁平化和保持結果與輸入的相似性之間尋求平衡,並將其寫成如下形式:

                                                                  \underset{f}{min} \underset{p}{\sum} (f_{p}-g_{p})^{2} + \lambda \cdot c(f)

λ\lambda 作爲直接控制 c(f) 重要性的權重,實際上是一個平滑參數,\lambda 越大,邊緣就越少。

三、推廣到二維

在二維圖像表示中,用 I 表示輸入圖像,用 S 表示計算結果。梯度\bigtriangledown S_{p} = (\partial _{x}S_{p},\partial _{y}S_{p}) ^{T} 表示對於每個像素 p 計算其相鄰像素之間在 x 和 y 方向上的差分。

梯度的度量表示爲:                            C( S) = \#\left \{ p | | \partial _{x}S_{p} |+ |\partial _{y}S_{p}| \neq 0 \right \}

它計算了 p 的幅值 | \partial _{x}S_{p} |+ |\partial _{y}S_{p}| 不爲零的個數。

根據這個定義,S便可通過下式求解得到

                                                                     \underset{S}{min} \underset{p}{\sum} (S_{p}-I_{p})^{2} + \lambda \cdot C(S)

在實際計算中,彩色圖像的梯度大小|∂Sp |被定義爲梯度大小在rgb三個通道的總和。

四、目標函數的求解

由於新的目標函數涉及一個離散的計數度量。左右兩項分別對像素差和全局不連續進行了統計建模,因此難以求解。傳統的梯度下降法或其它離散優化方法都不可用。因此作者基於引入輔助變量的思想,採用一種特殊的半二次分裂交替優化策略,對原始項進行擴展和迭代更新(其思想有點像 EM 算法,分兩步走,走一步看一步,交替驗證優化的過程)。具體求解過程請參看原論文。

其僞代碼如下:

 

五、具體應用場景

1)邊緣的提升和提取(Edge Enhancement and Extraction)

2) 圖像的抽象和鉛筆畫特效(Image Abstraction and Pencil Sketching)

3) 剪貼畫瑕疵的修復(Clip-Art Compresion Artificat Removal)

4) 細節放大(Detail Magnification)

5)色調映射(Tone Mapping)

六、對比實驗的結果

測試圖片爲 640*640 的下圖:

 

基於原始的 OpenCV 的實現,執行時間爲:

Github 上錯誤的 CUDA 實現(在 beta_max = 1e5 的條件下):

根據作者論文和其 Matlab 代碼,以及 OpenCV 代碼我通過 CUDA 重新實現了 L0 Smooth 算法,結果如下:

時間從 2167ms -> 400ms,性能提升了 5.4 倍 !

以上是初步的實現,性能經過進一步優化之後,總耗時減少到 139.6ms(不包括從磁盤讀取圖片的時間和開闢內存的時間【多張圖像可以重複利用】、 host <-> device 之間的拷貝時間、顯示時間)

ps: 謝絕白嫖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章