图像匹配

差分矩阵求和:

  差分算法的核心在于差分矩阵,实质为差异矩阵,计算公式:

    差分矩阵 = 图像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')

 

 

posted @ 2020-03-15 17:42  King~~~  阅读(332)  评论(0编辑  收藏  举报