簡介
常見的圖像匹配算法有:平均絕對差算法(MAD)样眠、絕對誤差和算法(SAD)、誤差平方和算法(SSD)翠肘、平均誤差平方和算法(MSD)檐束、歸一化積相關(guān)算法(NCC)、序貫相似性檢測算法(SSDA)束倍、hadamard變換算法(SATD)
本文主要介紹基于誤差平方和算法(SSD)的圖像匹配
SSD算法
誤差平方和算法(Sum of Squared Differences被丧,簡稱SSD算法),也叫差方和算法绪妹。即計(jì)算子圖與模板圖的L2距離甥桂。公式如下,這里不再贅述邮旷。
代碼
根據(jù)公式黄选,很容易寫出代碼,配合OpenCV可以實(shí)現(xiàn)圖像模板匹配的功能
demo如下:
import sys
import cv2
import numpy as np
def Image_SSD(src_img, search_img):
# 1.確定子圖的范圍
# 2.遍歷子圖
# 3.求模板圖和子圖的誤差平方和
# 4.返回誤差平方和最小的子圖左上角坐標(biāo)
M = src_img.shape[0]
m = search_img.shape[0]
N = src_img.shape[1]
n = search_img.shape[1]
Range_x = M - m - 1
Range_y = N - n - 1
src_img = cv2.cvtColor(src_img, cv2.COLOR_RGB2GRAY)
search_img = cv2.cvtColor(search_img, cv2.COLOR_RGB2GRAY)
min_res = sys.maxsize
Best_x = 0
Best_y = 0
for i in range(Range_x):
for j in range(Range_y):
subgraph_img = src_img[i:i+m, j:j+n]
res = np.sum((search_img.astype("float") - subgraph_img.astype("float")) ** 2) # SSD公式
if res < min_res:
min_res = res
Best_x = i
Best_y = j
return Best_x, Best_y
if __name__ == '__main__':
# 原圖路徑
srcImg_path = "C:\\Users\\PC\\Desktop\\SSD\\src.jpg"
# 搜索圖像路徑
searchImg_path = "C:\\Users\\PC\\Desktop\\SSD\\search.jpg"
src_img = cv2.imread(srcImg_path)
search_img = cv2.imread(searchImg_path)
Best_x, Best_y = Image_SSD(src_img, search_img)
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)
結(jié)果
運(yùn)行代碼婶肩,可以看到匹配到的最終效果
引申
此外的平均絕對差算法(MAD)办陷、絕對誤差和算法(SAD)貌夕、平均誤差平方和算法(MSD)和SSD算法如出一轍,只是其相似度測量公式不同
1.平均絕對差算法(MAD)
2.絕對誤差和算法(SAD)
3.平均誤差平方和算法(MSD)