序貫相似性檢測算法(SSDA)實現圖像匹配

簡介

算法的原理姿骏,可以參考這個篇博客:基于灰度的模板匹配算法及老。這里不再贅述,本文使用序貫相似性檢測算法(下面簡稱:SSDA)桐筏,實現對圖像模板的匹配

算法思路

參考博客纸型,可以整理出SSDA算法的整體思路:

  1. 確定子圖的左上角坐標范圍
  2. 遍歷所有可能的子圖
  3. 求模板圖和子圖的圖像均值
  4. 隨機取不重復的點,求模板圖和子圖中該點的值與其自身圖像均值的絕對誤差
  5. 累加絕對誤差梅忌,直到超過閾值
  6. 計算累加次數狰腌,則次數最多的子圖為匹配的最終圖像

代碼

根據算法思路,demo如下:

import time
import random
import cv2
import numpy as np

def Image_Mean_Value(Image):
    res = np.sum((Image.astype("float"))) / float(Image.shape[0] * Image.shape[1])
    return res

def Image_SSDA(search_img, example_img):
    # 確定子圖的范圍
    M = search_img.shape[0]
    m = example_img.shape[0]
    N = search_img.shape[1]
    n = example_img.shape[1]
    Range_x = M - m - 1
    Range_y = N - n - 1
    search_img = cv2.cvtColor(search_img, cv2.COLOR_RGB2GRAY)
    example_img = cv2.cvtColor(example_img, cv2.COLOR_RGB2GRAY)
    # 求模板圖的均值
    example_MV = Image_Mean_Value(example_img)
    R_count_MAX = 0
    Best_x = 0
    Best_y = 0
    # 遍歷所有可能的子圖
    for i in range(Range_x):
        for j in range(Range_y):
            R_count = 0
            Absolute_error_value = 0
            # 從搜索圖中截取子圖
            subgraph_img = search_img[i:i+m, j:j+n]
            # 求子圖的均值
            search_MV = Image_Mean_Value(subgraph_img)
            # 判斷是否超過閾值
            while Absolute_error_value < SSDA_Th:
                R_count += 1
                # 取隨機的像素點
                x = random.randint(0, m - 1)
                y = random.randint(0, n - 1)
                pv_s = subgraph_img[x][y]
                pv_e = example_img[x][y]
                # 計算絕對誤差值并累加
                Absolute_error_value += abs((pv_e - example_MV) - (pv_s - search_MV))
            # 將次數最多的子圖為匹配圖像
            if R_count >= R_count_MAX:
                R_count_MAX = R_count
                Best_x = i
                Best_y = j
    # 返回最匹配圖像的坐標
    return Best_x, Best_y

if __name__ == '__main__':
    # 原圖路徑
    srcImg_path = "C:\\Users\\PC\\Desktop\\SSDA\\src.jpg"
    # 搜索圖像路徑
    searchImg_path = "C:\\Users\\PC\\Desktop\\SSDA\\find.jpg"
    # SSDA算法閾值
    SSDA_Th = 10

    src_img = cv2.imread(srcImg_path)
    search_img = cv2.imread(searchImg_path)

    start = time.perf_counter()
    Best_x, Best_y = Image_SSDA(src_img, search_img)
    end = time.perf_counter()
    print("time:", end - start)

    cv2.rectangle(src_img, (Best_y, Best_x), (Best_y + search_img.shape[1], Best_x + search_img.shape[0]), (0, 0, 255), 3)
    cv2.imshow("src_img", src_img)
    cv2.imshow("search_img", search_img)
    cv2.waitKey(0)

說明:

  • 閾值的設定:一開始將閾值設置的較大一些牧氮,保證算法的準確度琼腔;在多次測試后可以將閾值降低到合適的值。閾值越大踱葛,算法的精度約高丹莲,耗時也相對的會增加一些
  • 隨機像素點的選妊湛蟆:算法中指出堡僻,應當選取不重復的像素點,代碼中直接使用了random.randint()來生成隨機數谢床,是會有重復的可能性含,但是概率不大洲赵,這里近似于不重復

結果

運行代碼,匹配結果如下:

SSDA算法結果

總結

算法中指出胶滋,SSDA算法是對傳統(tǒng)模板匹配算法的改進,比傳統(tǒng)匹配算法快幾十到幾百倍悲敷。又上文可知究恤,SSDA算法匹配耗時18秒,我們使用傳統(tǒng)的SSD算法來實現相同的功能來測試下耗時后德。SSD算法的實現可以參考:基于SSD的圖像匹配算法
結果如下:

SSD算法結果

可以看到兩者都達到了較好的匹配效果部宿,但SSD算法耗時28秒,確實SSDA算法的速度優(yōu)于SSD算法

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市理张,隨后出現的幾起案子赫蛇,更是在濱河造成了極大的恐慌,老刑警劉巖雾叭,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悟耘,死亡現場離奇詭異,居然都是意外死亡织狐,警方通過查閱死者的電腦和手機暂幼,發(fā)現死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來移迫,“玉大人旺嬉,你說我怎么就攤上這事〕瘢” “怎么了邪媳?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長荡陷。 經常有香客問我雨效,道長,這世上最難降的妖魔是什么亲善? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任设易,我火速辦了婚禮,結果婚禮上蛹头,老公的妹妹穿的比我還像新娘顿肺。我一直安慰自己,他們只是感情好渣蜗,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布屠尊。 她就那樣靜靜地躺著,像睡著了一般耕拷。 火紅的嫁衣襯著肌膚如雪讼昆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天骚烧,我揣著相機與錄音浸赫,去河邊找鬼。 笑死赃绊,一個胖子當著我的面吹牛既峡,可吹牛的內容都是我干的。 我是一名探鬼主播碧查,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼运敢,長吁一口氣:“原來是場噩夢啊……” “哼校仑!你這毒婦竟也來了?” 一聲冷哼從身側響起传惠,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤迄沫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后卦方,有當地人在樹林里發(fā)現了一具尸體羊瘩,經...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年愿汰,在試婚紗的時候發(fā)現自己被綠了困后。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡衬廷,死狀恐怖摇予,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情吗跋,我是刑警寧澤侧戴,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站跌宛,受9級特大地震影響酗宋,放射性物質發(fā)生泄漏。R本人自食惡果不足惜疆拘,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一蜕猫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哎迄,春花似錦回右、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至旨涝,卻和暖如春蹬屹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背白华。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工慨默, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弧腥。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓厦取,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸟赫。 傳聞我的和親對象是個殘疾皇子蒜胖,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348