很久沒有出去溜達了,今天天氣好,就放松放松去,晚上在辦公室沒啥事,把以前寫的一個基于標準的歐式距離的模板匹配代碼共享吧。
opencv有模板匹配的代碼,我沒看他是如何優(yōu)化的,所以不管他吧,我只描述我自己實現(xiàn)。
基于歐式距離的模板匹配就是遍歷被匹配圖的每一個像素,然后計算以該像素為中心,和模板圖重疊部分的像素的歐式距離,當模板圖越大時,計算就急劇增加,因此做優(yōu)化才能有真正的實用價值。
兩個標量的歐式距離表達式為 (a - b) * (a - b),展開后為 a^2 + b^ 2 - 2ab,我們每一個像素點的計算就是WM * HM個像素色階值的距離的累加和(WM和HM分別為模板圖的寬度和高度),模板匹配中,模板圖所有像素的平方和是固定的,可以提前計算,而被匹配圖中每個像素點周邊WM * HM的像素的平方和可以使用類似BoxBlur中懶惰算法快速的得到,而只有兩者的成績項是必須每個點重新計算,這也是整個計算過程中最為耗時的部分,如果直接用C的代碼寫出來,恐怕等到花兒都謝了。
我在圖像處理中任意核卷積(matlab中conv2函數(shù))的快速實現(xiàn)一文中曾經給出過一種基于SSE的的快速卷積的算法,他可以一次性計算出16個字節(jié)的乘法,速度因此也得到了大的提升,因此,完全可以用在上述的計算a * b的過程中,這樣我們的模板匹配速度就能有質的提高。
計算模板圖的像素自乘平方和代碼非常簡單,也沒啥耗時,簡單代碼如下:
延伸閱讀
學習是年輕人改變自己的最好方式