上一节里,使用差分算法可以在弱噪声的情况下,有较好的匹配效果。在强噪声时,欧氏距离匹配方法相对于上面的方法会有更好的效果。
程序:
# -*- coding: utf-8 -*-
import cv2
import numpy as np
def get_EuclideanDistance(x, y):
myx = np.array(x)
myy = np.array(y)
return np.sqrt(np.sum((myx - myy)*(myx - myy)))
def findpic(img,findimg , h,fh,w,fw):
minds=1e8
mincb_h=0
mincb_w=8
for now_h in range(0,h-fh):
for now_w in range(0,w-fw):
my_img = img[now_h:now_h+fh,now_w:now_w+fw,:]
my_findimg = findimg
dis = get_EuclideanDistance(my_img , my_findimg)
if dis < minds:
mincb_h=now_h
mincb_w=now_w
minds = dis
print('.',)
findpt = mincb_w,mincb_h
cv2.rectangle(img, findpt, (findpt[0]+fw,findpt[1]+fh),(0,0,255))
return img
def showpiclocation(img,findimg):
#定位图像
w = img.shape[1]
h= img.shape[0]
fw = findimg.shape[1]
fh = findimg.shape[0]
return findpic(img,findimg,h,fh,w,fw)
def addnoise(img):
coutn = 500000
for k in range(0,coutn):
xi = int(np.random.uniform(0,img.shape[1]))
xj = int(np.random.uniform(0,img.shape[0]))
img[xj,xi,0] = 255 * np.random.rand()
img[xj,xi,1] = 255 * np.random.rand()
img[xj,xi,2] = 255 * np.random.rand()
fn = 'pictest.png'
fn1 = 'pictestt1.png'
myimg = cv2.imread(fn)
myimg1 = cv2.imread(fn1)
addnoise(myimg)
myimg = showpiclocation(myimg, myimg1)
cv2.namedWindow('img')
cv2.imshow('img',myimg)
cv2.waitKey()
cv2.destroyAllWindows()
结果:
[外链图片转存中…(img-1dDpX7X9-1574725793533)]
可见在一片强噪声干扰的情况下,欧氏距离匹配算法依然有着相当好的匹配能力。
原图:
加噪声(countn=50000)后的结果:
可以看出欧氏距离对弱噪声环境下的变形图像仍有不错的效果。