该说图像匹配了,图像匹配在图片处理中的作用举重若轻,今天就带大家入门图像匹配,简单介绍一下基础的图像匹配吧。
何为图像匹配呢?在原图片中扣出一块区域,然后通过这块区域的像素找到它在原始图片的位置,在今天所讲的是如此。
来看看百度百科给下的定义吧: 通过对影像内容、特征、结构、关系、纹理及灰度等的对应关系,相似性和一致性的分析,寻求相似影像目标的方法。
**1.**通过欧式距离来匹配图像。
将所有像素值看成一个坐标(不用管它是多少维的),通过最小化这两个坐标的欧式距离来确定最终在原始图像上匹配的位置。
欧式距离公式为:
下面通过代码来演示如何实现
import cv2 import numpy as np def Distance(x,y): #计算欧式距离 x = np.array(x) y = np.array(y) return np.sqrt(np.sum((x-y)*(x-y))) img1 = cv2.imread('1.jpg') #原始图片 img2 = img1[300:400,300:400] #要匹配的区域 h = img2.shape[0] w = img2.shape[1] mins = le5 距离的最小值 for i in range(0,img1.shape[0]-h): #遍历图片 for j in range(0,img1.shape[1]-w): dist = img1[i:i+h,j:j+w] loss = Distance(dist,img2) if loss < mins: now_h = i now_w = j #记住当前目标区域左上角的位置 mins = loss #更新最小值 cv2.rectangle(img1,(now_w,now_h),(now_w+w,now_h+h),(255,0,0)) cv2,imshow('dist',img1) cv2,waitKey(0)
2.通过差分矩阵求和 均值来匹配
原理: 目标区域的像素值 - 模板区域的像素值,然后根据其和的大小 或者 其均值的大小来确定目标区域。
下面直接通过代码来演示
import cv2 import numpy as np img1 = cv2.imread("1.jpg") img2 = img1[100:250,200:350] h , w = img2.shape[:2] findpt = [] for i in range(0,img1.shape[0]-h): for j in range(0,img1.shape[1]-h): com = img1[i:i+h,j:j+w] - img2 if np.mean(com)<20: #np.sum(com) <1 findpt.append(i) findpt.append(j) break if len(findpt)>0: cv.rectangle(img1,(findpt[1],findpt[0]),(findpt[1]+w,findpt[0]+h),(255,0,0)) cv.imshow('dsts',img1) cv.waitKey(0)
今天的图像匹配的入门基础讲解就说到这里了,下次再见。
Thank for your reading !!!!
公众号:FPGA之旅