一、轮廓近似
1、什么是轮廓近似
指对轮廓进行逼近或拟合,得到近似的轮廓。在图像处理中,轮廓表示了图像中物体的边界,因此轮廓近似可以用来描述和识别物体的形状。
2、参数解析
1)用法
import cv2
approx =cv2.approxPolyDP(curve,epsilon, closed)
2)参数
• curve:表示要输入的轮廓
• epsilon: 表示近似的精度,即两个轮廓之间最大欧氏距离,该参数越小,得到的近似结果越接近实际轮廓,反之得到的近似结果会更加粗糙
• closed:表示布尔类型的参数,表示是否封闭轮廓,如果是True,表示输入的轮廓是封闭的,近似结果也会是封闭的,否则表示输入的轮廓不是封闭的,近似结果也不会封闭
3)返回值
approx:表示近似结果,是一个ndarray数组,为一个近似后的轮廓,包含了被近似出来的轮上的点的坐标
4)代码解析及实现
import cv2
img = cv2.imread('phone.png') # 导入原图
phone_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 原图转换为灰度图
ret,phone_thresh = cv2.threshold(phone_gray,100,25,cv2.THRESH_BINARY) # 二值化,将大于100灰度值的像素更改为0,小于100像素值的更改为25
# 返回值ret为阈值,phone_thresh为二值化后的图像
image, contours, hierarchy = cv2.findContours(phone_thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE) # 将二值化后的图像进行获取轮廓处理
# 轮廓检测方式为cv2.RETR_TREE,返回所有轮廓及完整层次结构,CV2.CHAIN_APPROX_NONE为存储所有的轮廓点
epsilon = 0.001 * cv2.arcLength(contours[0],True) # 设置近似值,计算轮廓为contours[0]的周长,参数true表示轮廓为封闭的,0.001表示精度,计算的结果越小,近似的精度越高
approx = cv2.approxPolyDP(contours[0],epsilon,True) # 对轮廓进行近似,轮廓号为contours[0],近似的精度为epsilon,封闭轮廓
phone_new = img.copy() # 对原图生成一个副本
image_contours = cv2.drawContours(phone_new, [approx],contourIdx=-1,color=(0,255,0),thickness=3) # 在副本图像上进行绘制轮廓,[approx]表示要回值得轮廓,contourIdx=-1表示绘制所有的轮廓
cv2.imshow('phone',img) # 展示原图
cv2.waitKey(0)
cv2.imshow('image_contours',image_contours) # 展示绘制轮廓的近似图像
cv2.waitKey(0)
运行结果为:
前者为原图,后者为在原图副本上进行绘制轮廓
二、模型匹配
1、什么是模型匹配
模型匹配是一种通过在图像中查找和识别特定形状或物体的方法。模型匹配基于图像中的特征点,并尝试找到与预定义的模型或样本最匹配的图像区域。
2、步骤
1)提取模型的特征
对于模型或样本图像,使用特征提取算法(如SIFT、SURF或ORB)来检测和描述关键点和特征描述符。
2)在图像中查找特征点
对于待匹配的图像,同样使用相同的特征提取算法来检测和描述关键点和特征描述符。
3)进行特征匹配
通过计算模型特征点和待匹配图像中特征点之间的距离或相似度,找到最合适的匹配点。
4)模型匹配
根据特征匹配的结果,通过应用各种匹配算法(如RANSAC)来估算模型在图像中的位置和姿态。
3、参数及用法
1、用法
cv2.matchTemplate(image, templ, method, result=None, mask=None)
2、参数
1)image:待搜索对象
2)templ:模板对象
3)method:计算匹配程度的方法
• TM_SQDIFF:平方差匹配法
该方法采用平方差来进行匹配,匹配越好,值越小,匹配越差,值越大
• TM_CCORR:相关匹配法
该方法采用乘法操作,数值越大表示匹配程度越好
• TM_CCOEFF:相关系数匹配法
数值越大表示匹配程度越好
• TM_SQDIFF_NORMED:归一化平方差匹配法
匹配越好,值越小,匹配越差,值越大
• TM_CCORR_NORMED:归一化相关匹配法
数值越大表明匹配程度越好
• TM_CCOEFF_NORMED:归一化相关系数匹配法
数值越大表明匹配程度越好
3、代码实现
import cv2
kele = cv2.imread('kele.png') # 导入模版图片
template = cv2.imread('template.png') # 导入模型图片
cv2.imshow('kele',kele)
cv2.imshow('template',template)
cv2.waitKey(0)
h,w = template.shape[:2] # 获取模型高度和宽度
res = cv2.matchTemplate(kele,template,cv2.TM_CCOEFF_NORMED) # 对模版和模型进行匹配,cv2.TM_CCOEFF_NORMED为匹配程度的方法,返回匹配结果的矩阵,其中每个元素表示该位置与模板的匹配程度
# cv2.minMaxLoc可以获取矩阵中的最小值和最大值,以及最小值的索引号和最大值的索引号
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res) # 获取矩阵中最小值、最大值、最小值位置的索引号、最大值位置的索引号
top_left = max_loc
bottom_right = (top_left[0] + w,top_left[1] + h)
kele_template = cv2.rectangle(kele,top_left,bottom_right,(0,255,0),2) # 绘制矩形,图像为kele,左上角坐标为top_left,右下角坐标为bottom_right,绘制矩形的颜色为绿色,线条粗细为2
cv2.imshow('kele_template',kele_template)
cv2.waitKey(0)
运行结果为: