雙線性插值的影象縮放問題
初次開始寫部落格,想記錄下自己在公司實習所做過的事情以及學習到的東西,雖然還是有很多東西不瞭解也還沒做出來,但是也希望這是一種體驗。
我於2018.9.3入職進行實習,到現在也快過去兩個月了,我在公司進行了輪崗,在大部分崗位都待了幾周,現在回到了我應該待的部門—數字IP設計部。其中很多心路感受等有空的時候再一一補上。現在我的任務就是學習影象縮放,一方面我需要一個寫論文的方向,另一方面公司說年底會開發這方面的晶片,讓我提前做好知識儲備。今天就記錄一下自己在最近學習中的心得吧。
我所學習的影象縮放採用的演算法就是雙線性插值,這個演算法很古老,自己查到的論文上很多都是2000年左右的,但是可能工程上需要這種穩定的演算法把。各種論文中對這種演算法的描述和改進很多(因為自己有點偷懶,看的英文的很少)。但是有的論文明顯看書來在水,廢話不多說,來說說雙線性差值吧。
雙線性插值最核心的就是那一個公式,放一個圖在這裡,公式就不編輯了。按照我自己的思路,首先要有縮放因子,然後通過縮放因子對圖片拉伸或者縮小。但是在這裡我就有一個疑問,是不是有一個暫存器先存住這個初次變化的影象呢?然後在這個初次縮放影象的基礎上,通過向後對映的方法,計算出新的目標影象每一個畫素點的灰度值,這樣就得到了新的目標影象。
這個算是演算法上的一點記錄,那在硬體上怎麼實習呢?這也是我現在還很有疑問的地方,先把這些都記錄下來,不清楚的點後面再依次解決。
(1) 在硬體上首先要能接受源影象,這時候應該有個FIFO來快取進來的資料(如果是對圖片縮放還好,但是如果是對視訊進行縮放需要FIFO能儲存的住高速的視訊源)。那麼什麼時候需要讀取資料,什麼時候讀取第幾行資料,這都需要一個控制。
(2) 然後,要從FIFO中將源影象讀取出來,首先可以進行垂直方向上的插值,這樣的話就需要讀出源影象中的兩行資料,這兩行資料放置在兩個RAM中。那麼在這個擁有兩個RAM的緩衝區中,還需要一個步長值x,這個步長值我個人是認為承擔著兩個任務。第一,每個x可以看作是加權係數,來讓上下兩行資料進行垂直方向上的插值。第二,x整數前面的係數每增加1,就意味著插值的兩行要向下移動。比如,原來源資料的是第一第二行,但是x的整數位進位了,那麼就需要從FIFO中讀取第二第三行了。
(3) 在進行完垂直方向的插值之後,需要再進行水平方向的插值,計算公式不需要列出,但是還有幾個要注意的就是水平和垂直方向插值都需要指標,需要告訴我什麼時候一行結束了,什麼時候整個幀的插值都結束了。
對於硬體怎麼設計以及各個暫存器應該怎麼配置,現在還處於迷茫狀態中。為什麼寫下這篇部落格,主要是最近情感遇到了重大問題,很難受,希望通過整理這些東西讓我有一個緩衝,也能讓我的注意力有所轉移,後面有問題再補充。