图像匹配
差分矩阵求和:
差分算法的核心在于差分矩阵,实质为差异矩阵,计算公式:
差分矩阵 = 图像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@_@

浙公网安备 33010602011771号