日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

matlab 序贯相似性,序贯相似性检测算法(SSDA)实现图像匹配

發布時間:2024/1/1 循环神经网络 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 matlab 序贯相似性,序贯相似性检测算法(SSDA)实现图像匹配 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

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

算法思路

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

確定子圖的左上角坐標范圍

遍歷所有可能的子圖

求模板圖和子圖的圖像均值

隨機取不重復的點,求模板圖和子圖中該點的值與其自身圖像均值的絕對誤差

累加絕對誤差,直到超過閾值

計算累加次數,則次數最多的子圖為匹配的最終圖像

代碼

根據算法思路,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算法是對傳統模板匹配算法的改進,比傳統匹配算法快幾十到幾百倍。又上文可知,SSDA算法匹配耗時18秒,我們使用傳統的SSD算法來實現相同的功能來測試下耗時。SSD算法的實現可以參考:基于SSD的圖像匹配算法

結果如下:

SSD算法結果

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

總結

以上是生活随笔為你收集整理的matlab 序贯相似性,序贯相似性检测算法(SSDA)实现图像匹配的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。