图像基础5 图像匹配--差分矩阵求和与均值

来源:互联网 发布:用数据包怎么传淘宝 编辑:程序博客网 时间:2024/06/05 18:35

本系列文章是学习《机器学习实践指南 案例应用分析 第2版》的笔记。
图像匹配算法是基于像素的比较和计算来实现的方法。

1. 差分矩阵求和

=AB

差分算法的核心在于差分矩阵,实质为差异矩阵。
算法过程是:
首先,计算两个图像的矩阵数据之间差异分析图像的相似性;然后,设置一个阈值进行比较,如果差分矩阵的所有元素之和在阈值以内,则表示这两张图像是相似的,且描述了同一物体。
它要求两个图像大小相同。

# - * - coding: utf-8 - * -# 简单定位图像import cv2import numpy as npprint('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 np.sum(comp_tz) <1:                findpt = now_w,now_h        print('.',)    if findpt != None:        print('fw is %d' % fw)        cv2.rectangle(img, findpt, (findpt[0]+fw, findpt[1]+fh),(255,0,0))    return imgfn = 'big.png'fn1 = 'small.png'myimg = cv2.imread(fn)myimg1 = cv2.imread(fn1)myimgf = showpiclocation(myimg,myimg1)cv2.namedWindow('img')cv2.imshow('img',myimgf)cv2.waitKey()cv2.destroyAllWindows()

结果:
这里写图片描述

使用示例图片是可以的,但使用其它图片没有成功。暂时不知道为什么。
原图:
这里写图片描述

这里写图片描述

2. 差分矩阵均值

当数字图像质量较差时,则需要计算差分矩阵的均值,并为均值设一个适当的阈值。

# - * - coding: utf-8 - * -# 少量噪声定位图像import cv2import numpy as npprint('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')        print ('.')    if findpt != None:        cv2.rectangle(img,findpt,(findpt[0]+fw, findpt[1]+fh),(0,0,255))    return imgdef addnoise(img):    coutn = 5000    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 = 'big.png'fn1 = 'small.png'myimg = cv2.imread(fn)myimg1 = cv2.imread(fn1)addnoise(myimg)myimgf = showpiclocation(myimg,myimg1)cv2.namedWindow('img')cv2.imshow('img',myimgf)cv2.waitKey()cv2.destroyAllWindows()

这里写图片描述

差分矩阵的阈值一般为10~200,阈值越大,能容忍的噪声点越多。如果阈值超过200,最好使用欧氏距离算法。