在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%,而且這個時候他的速度也就是和我的差不多,
另外,三次立方插值其實有個引數可以調節,他控制了結果是銳化還是模糊一些,如下圖所示:


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/226355.html
標籤:其他
