很久沒有出去溜達(dá)了,今天天氣好,就放松放松去,晚上在辦公室沒啥事,把以前寫的一個(gè)基于標(biāo)準(zhǔn)的歐式距離的模板匹配代碼共享吧。

     opencv有模板匹配的代碼,我沒看他是如何優(yōu)化的,所以不管他吧,我只描述我自己實(shí)現(xiàn)。

     基于歐式距離的模板匹配就是遍歷被匹配圖的每一個(gè)像素,然后計(jì)算以該像素為中心,和模板圖重疊部分的像素的歐式距離,當(dāng)模板圖越大時(shí),計(jì)算就急劇增加,因此做優(yōu)化才能有真正的實(shí)用價(jià)值。

     兩個(gè)標(biāo)量的歐式距離表達(dá)式為 (a - b) * (a - b),展開后為 a^2 + b^ 2 - 2ab,我們每一個(gè)像素點(diǎn)的計(jì)算就是WM * HM個(gè)像素色階值的距離的累加和(WM和HM分別為模板圖的寬度和高度),模板匹配中,模板圖所有像素的平方和是固定的,可以提前計(jì)算,而被匹配圖中每個(gè)像素點(diǎn)周邊WM * HM的像素的平方和可以使用類似BoxBlur中懶惰算法快速的得到,而只有兩者的成績項(xiàng)是必須每個(gè)點(diǎn)重新計(jì)算,這也是整個(gè)計(jì)算過程中最為耗時(shí)的部分,如果直接用C的代碼寫出來,恐怕等到花兒都謝了。

     我在圖像處理中任意核卷積(matlab中conv2函數(shù))的快速實(shí)現(xiàn)一文中曾經(jīng)給出過一種基于SSE的的快速卷積的算法,他可以一次性計(jì)算出16個(gè)字節(jié)的乘法,速度因此也得到了大的提升,因此,完全可以用在上述的計(jì)算a * b的過程中,這樣我們的模板匹配速度就能有質(zhì)的提高。

    計(jì)算模板圖的像素自乘平方和代碼非常簡單,也沒啥耗時(shí),簡單代碼如下:

網(wǎng)友評(píng)論