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

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

1. 差分矩阵求和

差 分 矩 阵 = 图 像 A 矩 阵 数 据 − 图 像 B 矩 阵 数 据 差分矩阵 = 图像A矩阵数据 - 图像B矩阵数据 =AB

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

# - * - coding: utf-8 - * -
# 简单定位图像

import cv2
import numpy as np
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 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 img

fn = '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 cv2
import numpy as np
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')
        print ('.')
    if findpt != None:
        cv2.rectangle(img,findpt,(findpt[0]+fw, findpt[1]+fh),(0,0,255))
    return img

def 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,最好使用欧氏距离算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程圈子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值