近邻取样插值和其速度优化
生活随笔
收集整理的這篇文章主要介紹了
近邻取样插值和其速度优化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? ?本文的主要內容轉載自博客 《圖像縮放算法?》或《圖形圖像處理-之-高質量的快速的圖像縮放 上篇 近鄰取樣插值和其速度優化》,將其中的代碼改寫在自己的機器上進行實際測試,從而更加體會到代碼優化的意義及方向。
正文說明:
? ? ? ?為了便于討論,這里只處理24bit的RGB顏色;? ? ? ? ?代碼使用C++,涉及到匯編優化的時候假定為x86平臺;使用的編譯器為vs2010; 為了代碼的可讀性,沒有加入異常處理代碼 測試環境:
Intel(R) Core(TM) i5-3570 CPU @3.40GHz ?3.80GHz
測試說明: 只測試內存數據到內存數據的縮放
縮放原理和公式圖示:
?第一個縮放函數: 一個最簡單的縮放函數(插值方式為近鄰取樣,而且我“盡力”把它寫得慢一些了。 函數將大小為 srcWidth x srcHeight的圖片縮放到 dstWidth x dst.Height的區域中。 ? ? ?第二個縮放函數: 第一個函數并沒有按照顏色數據在內存中的排列順序讀寫(內部循環遞增 y 行索引),將造成CPU緩存預讀失敗和內存顛簸導致巨大的性能損失,(很多硬件都有這種特性,包括緩存、內存、顯存、硬盤等,優化順序訪問,隨機訪問時會造成巨大的性能損失)所以先交換x,y循環的順序:
? 第三個縮放函數: x*srcWidth / dstWidth 表達式中有一個除法運算,它屬于很慢的操作(比一般的加減運算慢幾十倍!),使用定點數來優化它: ? ?第四個縮放函數: 在x的循環中y一直不變,那么可以提前計算與y相關的值;1) 可以發現srcy的值和x變量無關,可以提前到x軸循環之前;2)優化與y相關的指針計算。 ? ?第五個縮放函數: ? ? ??? ?定點數優化使函數能夠處理的最大圖片尺寸和縮放結果(肉眼不可察覺的誤差)受到了一定的影響,這里給出一個使用浮點運算的版本,可以在有這種需求的場合使用: ? ? ?第六個縮放函數: 注意到這樣一個事實:每一行的縮放比例是固定的;那么可以預先建立一個縮放映射表格來處理縮放映射算法。 ? 針對以上六個縮放函數,對三幅圖片進行不同大小的縮放,得到的測試數據如下:
? ? ? ?為了便于討論,這里只處理24bit的RGB顏色;? ? ? ? ?代碼使用C++,涉及到匯編優化的時候假定為x86平臺;使用的編譯器為vs2010; 為了代碼的可讀性,沒有加入異常處理代碼 測試環境:
Intel(R) Core(TM) i5-3570 CPU @3.40GHz ?3.80GHz
測試說明: 只測試內存數據到內存數據的縮放
縮放原理和公式圖示:
?第一個縮放函數: 一個最簡單的縮放函數(插值方式為近鄰取樣,而且我“盡力”把它寫得慢一些了。 函數將大小為 srcWidth x srcHeight的圖片縮放到 dstWidth x dst.Height的區域中。 ? ? ?第二個縮放函數: 第一個函數并沒有按照顏色數據在內存中的排列順序讀寫(內部循環遞增 y 行索引),將造成CPU緩存預讀失敗和內存顛簸導致巨大的性能損失,(很多硬件都有這種特性,包括緩存、內存、顯存、硬盤等,優化順序訪問,隨機訪問時會造成巨大的性能損失)所以先交換x,y循環的順序:
? 第三個縮放函數: x*srcWidth / dstWidth 表達式中有一個除法運算,它屬于很慢的操作(比一般的加減運算慢幾十倍!),使用定點數來優化它: ? ?第四個縮放函數: 在x的循環中y一直不變,那么可以提前計算與y相關的值;1) 可以發現srcy的值和x變量無關,可以提前到x軸循環之前;2)優化與y相關的指針計算。 ? ?第五個縮放函數: ? ? ??? ?定點數優化使函數能夠處理的最大圖片尺寸和縮放結果(肉眼不可察覺的誤差)受到了一定的影響,這里給出一個使用浮點運算的版本,可以在有這種需求的場合使用: ? ? ?第六個縮放函數: 注意到這樣一個事實:每一行的縮放比例是固定的;那么可以預先建立一個縮放映射表格來處理縮放映射算法。 ? 針對以上六個縮放函數,對三幅圖片進行不同大小的縮放,得到的測試數據如下:
總結
以上是生活随笔為你收集整理的近邻取样插值和其速度优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HSV(HSL)颜色空间及其应用
- 下一篇: SIMD学习笔记整理(索引贴)