图像基础6 图像匹配--欧氏距离匹配

一、 强噪声图像匹配

上一节里,使用差分算法可以在弱噪声的情况下,有较好的匹配效果。在强噪声时,欧氏距离匹配方法相对于上面的方法会有更好的效果。

程序:

# -*- 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()


原图:
图像基础6 图像匹配--欧氏距离匹配_第1张图片

图像基础6 图像匹配--欧氏距离匹配_第2张图片

结果:
[外链图片转存中…(img-1dDpX7X9-1574725793533)]

可见在一片强噪声干扰的情况下,欧氏距离匹配算法依然有着相当好的匹配能力。

二、 变形图像匹配

原图:

图像基础6 图像匹配--欧氏距离匹配_第3张图片

加噪声(countn=50000)后的结果:

可以看出欧氏距离对弱噪声环境下的变形图像仍有不错的效果。

你可能感兴趣的:(Python,图像处理)