【短道速滑五】性能只逼雙線性插值,但效果要好很多---還有什么理由不用雙三次立方插值呢?


       在2年前,我寫過SSE圖像算法優化系列十八:三次卷積插值的進一步SSE優化 一文,在那里使用了SSE對三次卷積插值進行了SSE優化,原本以為那個速度已經比較極限了,最新遇到一個項目需要更高速的效果,自己又對這個算法進行了下構思,發現原來根本不是那回事,速度極限離天花板還早着呢。

      早期的優化中,僅僅是在每個像素的放大內部使用SIMD指令進行處理,而沒有考慮每個相鄰像素或者相鄰行像素之間的聯系和關系,因此呢計算量依舊是很大。     再來仔細看看三次立方插值,他需要涉及到像素是4*4的領域,共有16個權重,但是16個權重可以看成是水平和垂直分離的,因此可以先計算行方向的累計值,然后再計算列方向的累加和,我們發現,在放大和縮小時,這4行的取樣點一般來說總會有部分是重疊的,甚至是完全重疊的,如果是完全重疊,那么水平方向的累加和是根本無需進行計算的,部分重疊時,也可以只計算重疊的部分,這個時候,整體的計算量將大大的減少。這也是行和列分離計算所帶來的好處。4*4的取樣這個特性,決定他在某方面非常合適使用SIMD指令進行優化。對於灰度圖,由於其一個采樣點水平方向只涉及到4個像素(4個字節),不適合在取樣時就計算其水平方向的累加值(是指不適合用SIMD指令,如果純C實現反而就要在取樣時計算了),我們先收集取樣數據,然后再整體計算累加值時使用SIMD指令優化,而對於24位或者是32位圖,由於取樣4個像素占用了12個字節和16個字節,此時就可以直接在取樣時進行計算,避免了收集取樣數據的耗時,使得彩色模式圖像比灰度也僅僅多了一倍時間,而不是3倍或4倍。

    就是這么一個簡單的思路,能極大的提高算法的速度,而對於另外一個經典的Lanczos4插值算法,他涉及到的領域范圍是8*8,同樣可以使用上述的方式進行優化。

       測試一幅720P的彩色圖放大到1080P,三次立方插值單次的執行時間越月8.5ms, Lanczos4的耗時17.7ms左右,如果是灰度圖像,則三次立方耗時約6ms,Lanczos4用時7.5ms,差異很小。

  如果4K彩色圖縮小到1080P圖,三次立方插值單次的執行時間越15ms, Lanczos4的耗時31ms左右,如果是灰度圖像,則三次立方耗時約10ms,Lanczos4用時也是10ms左右,也差異很小。

      和Opencv比較發現,CV你如果調用100次某個圖的放大,他是多線程的執行的,CPU使用率到了100%,而且這個時候他的速度也就是和我的差不多。

      另外,三次立方插值其實有個參數可以調節,他控制了結果是銳化還是模糊一些,如下圖所示:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM