L0 范數圖像平滑(L0 Smooth) 的原理和 GPU 加速【CUDA】
一、概述
二、核心算法(一維)
其中 p 和 p + 1 索引鄰近的樣本(或像素)。?是關于?p 的前向差分形式的梯度。# { } 是計數操作符,輸出 p 的數量滿足,即 L0 范數的梯度。 不依賴梯度大小,因此如果一條邊只改變其對比度,則不會受其影響。這個離散計數函數是我們方法的核心。
表示結果中存在 k 個非零梯度,。在該目標函數的約束下,整體形狀與原始形狀保持一致,因為強度變化必須沿顯著邊緣出現,以盡可能減少總能量。顯然,把邊緣放在其他地方只會增加(目標函數的)成本。這種平滑效果明顯不同于以往的邊緣保持方法。k 越大,得到的近似值越小,但仍然是最顯著的對比度。
作為直接控制 重要性的權重,實際上是一個平滑參數,?越大,邊緣就越少。
三、推廣到二維
在二維圖像表示中,用 I 表示輸入圖像,用 S 表示計算結果。梯度 表示對于每個像素 p 計算其相鄰像素之間在 x 和 y 方向上的差分。
梯度的度量表示為:
它計算了 p 的幅值??不為零的個數。
根據這個定義,S便可通過下式求解得到
在實際計算中,彩色圖像的梯度大小|?Sp |被定義為梯度大小在rgb三個通道的總和。
四、目標函數的求解
其偽代碼如下:
五、具體應用場景
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 的條件下):
時間從 2167ms -> 400ms,性能提升了 5.4?倍 !【我的筆記本顯卡是 GTX970M,古老的 maxwell 架構】
GPU 參數
以上是初步的實現,性能經過進一步優化之后,總耗時減少到 139.6ms(不包括從磁盤讀取圖片的時間和開辟內存的時間【多張圖像可以重復利用】、 host <-> device 之間的拷貝時間、顯示時間)
ps: 謝絕白嫖
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。