目录
一、模板匹配
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、匹配步骤
-
首先,通过
cv2.imread
函数读取原图和模板图像,并将模板图像转换成灰度图像(cv2.cvtColor
函数)。 -
然后,使用循环遍历四个不同的旋转角度(0度、90度、180度、270度)。对于每个角度,通过
np.rot90
函数对模板图像进行旋转得到新的模板图像,同时获取模板图像的高度和宽度。 -
使用模板匹配函数
cv2.matchTemplate
来计算原图和旋转后的模板图像之间的相似度。这里采用的匹配方法是cv2.TM_CCOEFF_NORMED
。 -
设定匹配阈值,只有相似度大于等于阈值的部分才认为是匹配的。
-
使用
np.where
函数获取所有符合阈值的点的坐标。 -
遍历所有的匹配点,对于每个点,使用
cv2.rectangle
函数在原图上绘制一个矩形框,将匹配区域标记出来。 -
最后,通过
cv2.imshow
和cv2.waitKey
函数展示结果图像,并等待按键关闭窗口。