圖像旋轉的FPGA實現(一)

  繼續圖像處理專題,此次寫的是圖像旋轉。若要說小分辨率的圖像旋轉倒也簡單,直接將原始圖像存儲在BRAM中,而後按照旋轉後的位置關係取出即是。可是對於高分辨的圖像(720P及以上)就必須得用DDR3或者DDR4緩存了,而DDR是突發傳輸,對連續視頻流十分友好。因此在旋轉180°時倒也問題不大,可是若旋轉90°或者270°的話,每取出一個數據,緩存

就要跨行一次,而DDR跨行傳輸的效率極低,經測量大概是10%左右,根本沒法知足實時性要求。設計

  那麼,又該怎麼解決旋轉90°或者270°DDR傳輸效率低的問題呢?我查閱了大量資料,有一種方法是改用sram存儲圖像,這樣便沒有跨行傳輸效率低下的問題。可是如今FPGA的開發板廣泛帶的是DDR,也沒有必要爲了圖像旋轉這個功能從新設計電路,增長sram芯片。另外一種方法則是改變DDR讀寫圖像的方式,這裏也有兩種方案。方案1是對DDR進行分塊,DDR的一塊存儲一行有效圖像數據,這樣就使得DDR跨行次數減小。同時因爲DDR位寬大於像素數據位寬,因此每讀取一個數據就能得到數個像素點,可供幾回旋轉90°或者270°使用。視頻

方案2是對圖像進行分塊,寫入DDR時按照分塊尺寸對應關係,每一行寫入一個分塊,這個方法一樣會使得旋轉操做後讀取DDR跨行變少。有些人或許就會疑問,連續的視頻流怎麼分塊呢?視頻的確是連續進入的,但是咱們能夠控制寫入的地址,假如分辨率是1920*1080,分塊是192*10,那麼在DDR寫到192-8地址時,就直接跳轉到0+DDR列長度處了,進而實現DDR的一塊存儲原圖像的一行數據。開發

  這裏的話,我選擇的是第一種方案,即DDR的一塊存儲原圖像一行有效數據,並在720P和1080P各類制式下驗證經過,具體實現細節見下一篇博客。博客

       事實上,我只實現了直角旋轉,即旋轉90°,旋轉180°,旋轉270°。而想實現任意角度旋轉的話則思路一致,即從新排列圖像寫入DDR順序,使得讀DDR跨行操做次數下降,而關於這一點,萬方上有一篇名叫「基於FPGA的數字圖像旋轉引擎設計」(李傑明)的論文,你們有興趣的能夠去查閱觀看。圖像處理

相關文章
相關標籤/搜索