目录

一、模板匹配

1、什么是模版匹配

2、原理

3、应用领域

4、案例实现

1)模版图片和输入图片信息

2)代码实现

运行结果:

二、图像旋转

1、使用numpy方法

运行结果:  (图片来源网络,如有侵权敬请联系删除。)

2、使用OpenCV方法

运行结果: (图片来源网络,如有侵权敬请联系删除。)

三、综合应用

1、识别输入图片中所有模版图

运行结果:

2、匹配步骤


一、模板匹配

1、什么是模版匹配

        模板匹配是OpenCV中的一种图像处理技术,用于在一幅图像中查找与给定模板或样本图像最相似的区域。

2、原理

        通过在输入图像中滑动模板图像,并计算模板与输入图像相应区域的相似度,找出最匹配的位置。相似度可以使用不同的度量方式来计算,最常用的是平方差匹配相关性匹配

        在模板匹配中,模板图像是由用户提供的一个小图像,用于指示需要在输入图像中查找的目标物体或特征。输入图像可以是任意大小的图像,而模板图像通常要比输入图像小。

3、应用领域

        模板匹配计算机视觉和图像处理中有广泛的应用,例如目标检测、图像识别、物体跟踪等。它是一种简单但有效的图像处理方法,可以用于自动化的图像分析和图像理解任务。

4、案例实现

1)模版图片和输入图片信息

2)代码实现
import cv2
import numpy as np

img_rgb = cv2.imread('image.jpg')
img_gray = cv2.cvtColor(img_rgb,cv2.COLOR_RGB2GRAY)   # 将输入图片转换为灰度图
template = cv2.imread('tem.jpg',0)   # 导入模版图片的灰度图
h,w = template.shape[:2]  # shape返回图片的高、宽、通道

# 使用模板匹配方法 cv2.matchTemplate 进行匹配
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)  # cv2.TM_CCOEFF_NORMED表示使用归一化的方法来匹配,返回每个点匹配的相似度,DF类型

# 设定匹配阈值,表示匹配的相似度范围
threshold = 0.9
# 获取匹配结果中所有符合阈值的点的坐标
loc = np.where(res >= threshold)  # 返回索引,这里返回的是y值和x值坐标信息,条件为大于设定阈值的值的索引

for pt in zip(*loc[::-1]):   # loc数据倒序排列,变成x,y顺序状态,zip(*)表示将可迭代对象中对应的元素打包成一个元组,这里表示返回每个点的坐标
    # 在原图上绘制匹配区域的矩形框,pt表示矩形左上角坐标,(pt[0]+w,pt[1]+h)表示右下角坐标
    cv2.rectangle(img_rgb,pt,(pt[0]+w,pt[1]+h),(0,0,255),1)

cv2.imshow('res_show',img_rgb)
cv2.waitKey(0)
运行结果:

        此时相似的图像匹配完成,但是仍然还有一些相同图像不同方向的没有匹配上,需要对模型进行剩下的处理。

二、图像旋转

1、使用numpy方法

import cv2
import numpy as np

img = cv2.imread('girl3.jpg')

"""使用numpy旋转"""
# 旋转90度,k=-1表示顺时针90
rotated_image1 = np.rot90(img,-1)   # k值表示逆时针旋转几个90度,如果为负值则反向旋转几个90度
# k=1表示逆时针旋转
rotated_image2 = np.rot90(img,1)

cv2.imshow('yuamtu',img)
cv2.waitKey()
cv2.imshow('rotated_image1',rotated_image1)
cv2.imshow('rotated_image2',rotated_image2)
cv2.waitKey(0)
运行结果:  (图片来源网络,如有侵权敬请联系删除。)

2、使用OpenCV方法

img = cv2.imread('girl3.jpg')
rotated_image = cv2.rotate(img,cv2.ROTATE_90_CLOCKWISE)  # 顺时针90度
rotated_image1 = cv2.rotate(img,cv2.ROTATE_90_COUNTERCLOCKWISE)  # 逆时针90度
rotated_image2 = cv2.rotate(img,cv2.ROTATE_180)  # 旋转180度
cv2.imshow('shun90',rotated_image)
cv2.imshow('ni90',rotated_image1)
cv2.imshow('180',rotated_image2)
cv2.waitKey(0)
运行结果: (图片来源网络,如有侵权敬请联系删除。)

三、综合应用

1、识别输入图片中所有模版图

import cv2
import numpy as np

img = cv2.imread('image.jpg')  # 读取原图
tem = cv2.imread('tem.jpg',0)  # 读取模型图,灰度图

img_gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)  # 原图转换为灰度图

for i in [0,1,2,3]:   # 遍历四个值,表示逆时针旋转几个90度
    template = np.rot90(tem,i)   # 旋转i个90度,得到一个新的模版图像
    h,w = template.shape[:2]   # 返回模版图像的高宽

    # 使用模板匹配方法 cv2.matchTemplate 进行匹配
    res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)

    # 设定匹配阈值
    threshold = 0.9
    # 获取匹配结果中所有符合阈值的点的坐标
    loc = np.where(res >= threshold)
    # 遍历所有的点
    for pt in zip(*loc[::-1]):
        # 在原图上绘制匹配区域的矩形框
        cv2.rectangle(img,pt,(pt[0]+w,pt[1]+h),(0,0,255),1)

cv2.imshow('res_show',img)
cv2.waitKey(0)
运行结果:

2、匹配步骤

  1. 首先,通过cv2.imread函数读取原图和模板图像,并将模板图像转换成灰度图像(cv2.cvtColor函数)。

  2. 然后,使用循环遍历四个不同的旋转角度(0度、90度、180度、270度)。对于每个角度,通过np.rot90函数对模板图像进行旋转得到新的模板图像,同时获取模板图像的高度和宽度。

  3. 使用模板匹配函数 cv2.matchTemplate 来计算原图和旋转后的模板图像之间的相似度。这里采用的匹配方法是 cv2.TM_CCOEFF_NORMED

  4. 设定匹配阈值,只有相似度大于等于阈值的部分才认为是匹配的。

  5. 使用 np.where 函数获取所有符合阈值的点的坐标。

  6. 遍历所有的匹配点,对于每个点,使用 cv2.rectangle 函数在原图上绘制一个矩形框,将匹配区域标记出来。

  7. 最后,通过 cv2.imshow 和 cv2.waitKey 函数展示结果图像,并等待按键关闭窗口。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐