图像匹配
差分矩阵求和:
差分算法的核心在于差分矩阵,实质为差异矩阵,计算公式:
差分矩阵 = 图像A矩阵数据 - 图像B矩阵数据
算法描述:首先,计算两个图像的矩阵数据之间的差异分析图像的相似性;然后,设置一个阀值进行比较,如果差分矩阵的所有元素之和在阀值以内,则表示这两张图像是相似的,且描述统一物体。另外,他要求两个图像的大小相同。
基本思路:将切片图在原图中进行移动,并计算连个图像的差分矩阵,如果差分矩阵的所有元素之和小于1,则认为找到了切片在图中的位置。
import numpy as np import cv2 def showpiclocation(img, findimg): #定位图像 w = img.shape[1] h = img.shape[0] fw = findimg.shape[1] fh = findimg.shape[0] findpt = None for now_h in range(0,h - fh): for now_w in range(0,w - fw): comp_tz = img[now_h:now_h + fh,now_w:now_w + fw,:] - findimg if np.sum(comp_tz) < 1: findpt = now_w,now_h # print('.') if findpt != None: cv2.rectangle(img, findpt, (findpt[0] + fw,findpt[1] + fh), (255, 0,0),6) return img fn = 'all.png' fn1 = 'flower.png' myimg = cv2.imread(fn) myimg1 = cv2.imread(fn1) myimg = showpiclocation(myimg,myimg1) cv2.namedWindow('img') cv2.imshow('img', myimg) cv2.waitKey() cv2.destroyAllWindows()
图片:
切片图
差分矩阵均值:
当数字图像质量较差时,则需要计算差分矩阵的均值,并未均值设一个适当的阀值
import numpy as np import cv2 print('loading...') def showpiclocation(img, findimg): #定位图像 w = img.shape[1] h = img.shape[0] fw = findimg.shape[1] fh = findimg.shape[0] findpt = None for now_h in range(0, h-fh): for now_w in range(0, w-fw): comp_tz = img[now_h:now_h + fh, now_w:now_w + fw,:] - findimg if abs(np.mean(comp_tz)) < 20: findpt = now_w,now_h print('ok') if findpt != None: cv2.rectangle(img, findpt, (findpt[0] + fw,findpt[1] +fh), (0, 0, 255),6) return img def addnoise(img): count = 50000 for k in range(0, count): 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 = 'all.png' fn1 = 'flower.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()
欧式距离匹配:
1.噪声匹配 指的是像素嘈杂点很多的情况下,匹配图片。
#添加噪点 def addnoise(img): count = 5000 for k in range(0,count): 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()
思路:
设图像矩阵有n个元素,用n个元素值(x1,x2,...,xn)组成该图像的特侦组,特征形成了n维空间,特征组中的特征码构成每一维的数值。在n维空间下,两个图像矩阵各自形成了一个点,然后计算两个点之间的距离,距离小者为最匹配的图像。
import numpy as np import cv2 def addnoise(img): count = 5000 for k in range(0,count): 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() #欧式距离 def getEuclideanDistance(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 = 0 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 = getEuclideanDistance(my_img,my_findimg) if dis < minds: mincb_h = now_h mincb_w = now_w minds = dis findpt = mincb_w,mincb_h cv2.rectangle(img,findpt,(findpt[0]+fw,findpt[1]+fh),(0,0,255),1) 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) fn = 'all.png' fn1 = 'flower.png' myimg = cv2.imread(fn) myimg1 = cv2.imread(fn1) # addnoise(myimg) myimgn = showpiclocation(myimg,myimg1) cv2.imshow('img',myimg) cv2.waitKey() cv2.destroyWindow('img')
King@_@