NEON優化——OpenCV WarpAffine雙線性插值

算法要點

warpAffine雙線性插值和最近鄰的區別

  • 根據目標圖像的某點座標算出原始圖像對應的點座標後,最近鄰是向下取整,雙線性插值需要獲得相鄰的四個點座標以及縱橫方向的權重
  • 最近鄰直接拷貝原始圖像點即可,雙線性插值需要橫豎加權

很顯然計算量要比最近鄰大一些,但是效果會更好,對於放大的情況沒有明顯的鋸齒。

優化要點

  • 在計算偏移時基本和最近鄰相同,同樣要考慮異常情況和越界讀的問題,另外要注意32位和64位的區別。
  • 關於線性插值部分和resize的類似,可以參考resize的實現,同樣涉及定點計算等。
  • 這裏對於邊界的處理做了一些簡化,如果加權的4個點部分越界了,就都不參與運算了。而opencv的實現是未越界的部分繼續參與運算。對於不怎麼涉及邊界的場景下這樣簡化是可以接受的。這樣的簡化就不會存在越界讀的問題了。

代碼實現

相對複雜的是線性插值計算部分,resize中8UC4可以當成uint來計算,但是這裏行不通,像素的每個通道都要參與計算。

測試結果

8UC4

D: warpAffine H/W 1280/960 -> 128/128: opencv takes 1.168ms, neon takes 0.276ms, time reduce 76%
D: warpAffine H/W 1280/960 -> 256/256: opencv takes 3.883ms, neon takes 1.051ms, time reduce 72%
D: warpAffine H/W 1440/1080 -> 128/128: opencv takes 1.894ms, neon takes 0.546ms, time reduce 71%
D: warpAffine H/W 1440/1080 -> 256/256: opencv takes 4.357ms, neon takes 1.570ms, time reduce 63%

8UC3

D: warpAffine H/W 1280/960 -> 128/128: opencv takes 0.986ms, neon takes 0.191ms, time reduce 80%
D: warpAffine H/W 1280/960 -> 256/256: opencv takes 3.115ms, neon takes 0.671ms, time reduce 78%
D: warpAffine H/W 1440/1080 -> 128/128: opencv takes 1.437ms, neon takes 0.339ms, time reduce 76%
D: warpAffine H/W 1440/1080 -> 256/256: opencv takes 3.530ms, neon takes 0.900ms, time reduce 74%
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章