因為最後的dde演算法中,最核心的就是濾波器模組,由於做之前是沒有好好攻讀相關硬體文獻,加上相關背景寫的不好導師一頓痛批,搞得現在要本末倒置,拿結果去找自己值得這麼做的理由。但其實從研究角度來說應該是一件好事的。
(小吐個槽:說起來之前也不算是沒好好讀文獻,實在是調研的時候方向偏差太大,紅外影象增強的vlsi或fpga實現?要麼沒有,要麼都停留在很簡單的加速方式,比如已經被做成ip的直方圖均衡類演算法,甚至有人拿c轉verilog來湊數的!有參考價值的都只是單單說演算法而不是太講實現的。也都是做rtl設計的時候遇著坑了,才想到主要問題可能要去分析濾波器,而搜濾波器的硬體實現才是真的一搜嚇一跳,果然很多時候,我們思維都容易固化在頂層了,畢竟做vlsi或者fpga設計很多時候是沒辦法細份在某個具體應用領域的,都是越通用越好,而用它們加速本身也是一種底層思維,迭代成本很高,更需要我們具有這種底層的意識)。
今天就主要聊聊雙邊濾波器的硬體實現。
首先感覺比較新並且比較系統的應該算是這一篇了
tseng y c , hsu p h , chang t s . a 124 mpixels/s vlsi design for histogram-based joint bilateral filtering[j]. ieee transactions on image processing, 2011, 20(11):3231-3241.
他最好的一點是對很多處理這種濾波器的思路進行了歸類總結,並對時間複雜度和儲存消耗做了整理。
**中的歸類表
我最後的採用的設計方法,也是非常相似於durand的方法,所以我先對這種型別做一說明。雙邊濾波器擁有更多的應用場景就是因為他比一般的空間濾波器(文中稱spatial filter)有更好的邊緣保持性(edge-preserving),理解一下就是邊緣(也可以理解為輪廓)越多的地方,平滑的程度相對於非邊緣區域小一點。一般的空間濾波器,在fpga和vlsi應用中,已經有了很好辦法了,就是用暫存器組,搭建乙個卷積核,並且利用s行緩衝把zig-zag(寫z字母的順序)的順序,變成s行並行。(圖畫的很醜,大家理解)
那麼能不能把f(|c-q|),g(|ic-iq|)也寫到這個卷積核裡呢?答案是不能的,由於位置確定,計算f其實輸入都是常量,但是g的輸入可不是常量,他需要中心畫素點,而這個卷積核每移動一下(整個運算操作可以等效為卷積核按z型移動),中心畫素點都會變。g需要乙個單輸入超越函式運算模型,在硬體實現中,方法有3,一種是多項式分解,一種是cordic演算法,一種就是lut(查詢表)。前兩個這個表中沒有,就不說了,lut顧名思義,就是有限輸入情況,你拿著輸入翻譯成位址到ram裡找,1個週期就能實現,特別適合現在的情況:時間短、吞吐率一致,而且數字影象處理的灰度級本身也是有限的。但是套的時候就發現問題了,我為了簡單只話了乙個3x3的卷積核,如果大了,對於ram面積就是幾何倍的增長,如何能讓這個增長不太大就是去縮減ic-iq的灰度級(subsample),或者用線性插值(piecewise-linear)去進一步簡化lut(y=c--->y=ax+b)。當然也有人直接避開這種計算,比如paris的方法是直接用近似的方法把二維卷積化成了三維卷積(比較怪異不細說)。memory cost應該沒有表裡這樣,就basic而言我覺得應該是這樣的,不少於s*(n-1)+(s*(h+1))^2,第一項是行緩衝,第二項是查詢表加暫存器組(查詢表深度h)。
pham的方法,先x方向上濾波,再y方向上濾波
雙邊濾波器的原理
雙邊濾波器是什麼?雙邊濾波 bilateral filter 是一種可以保邊去噪的濾波器。之所以可以達到此去噪效果,是因為濾波器是由兩個函式構成。乙個函式是由幾何空間距離決定濾波器係數。另乙個由畫素差值決定濾波器係數。可以與其相比較的兩個filter 高斯低通濾波器 和 截尾均值濾波器 去掉百分率為...
python一維平滑濾波 雙邊濾波器文獻總結(一)
因為最後的dde演算法中,最核心的就是濾波器模組,由於做之前是沒有好好攻讀相關硬體文獻,加上相關背景寫的不好導師一頓痛批,搞得現在要本末倒置,拿結果去找自己值得這麼做的理由。但其實從研究角度來說應該是一件好事的。小吐個槽 說起來之前也不算是沒好好讀文獻,實在是調研的時候方向偏差太大,紅外影象增強的v...
雙邊濾波器原理及實現
雙邊濾波 bilateral filter 是一種非線性的濾波方法,是結合影象的空間鄰近度和畫素值相似度的一種折衷處理,同時考慮空域資訊和灰度相似性,達到保邊去噪的目的。具有簡單 非迭代 區域性的特點。雙邊濾波器的好處是可以做邊緣儲存 edge preserving 一般過去用的維納濾波或者高斯濾波...