Opencv-contrib-python模块——模版匹配、图形检测

一、模版匹配

在一幅图像中寻找与给定模板最匹配的区域。

原理

在输入图像上滑动模板图像,并计算每个位置的匹配程度。匹配程度由所选的匹配方法决定。返回一个二维数组,数组的元素值表示模版在原图中每个区域的匹配程度。

matchTemplate(image, templ, method)

参数

image:原图;templ:用于查找的模版;method:匹配方法,指定匹配模板的算法。 

匹配方法

1.cv2.TM_SQDIFF:平方差匹配
算法:计算输入图像和模板之间的每个像素差的平方。
结果:值越小,匹配程度越高。

2. cv2.TM_SQDIFF_NORMED:标准化平方差匹配
算法:计算输入图像和模板之间的标准化平方差。
结果:值越小,匹配程度越高。

3.cv2.TM_CCORR:相关性匹配
算法:计算输入图像和模板之间的相关性(相似度)。
结果:值越大,匹配程度越高。

4.cv2.TM_CCORR_NORMED:标准化相关性匹配
算法:计算输入图像和模板之间的标准化相关性。
结果:值越大,匹配程度越高。

5. cv2.TM_CCOEFF:相关系数匹配
算法:计算输入图像和模板之间的相关系数(相似度)。
结果:值越大,匹配程度越高。

6.cv2.TM_CCOEFF_NORMED:标准化相关系数匹配
算法:计算输入图像和模板之间的标准化相关系数。
结果:值越大,匹配程度越高。

二、图形检测


1. 轮廓检测 findContours()

contours,hierarchy=CV2.findContours(image, mode, method)

返回一个二元组(contours,hierarchy):contours:检测到的轮廓列表,每个轮廓是一个numpy数组;hierarchy:轮廓的层次信息。

参数:

 image:需要检测轮廓的图。必须是个经过二值化处理的灰度图像;mode:轮廓检索模式。

#轮廓检索模式
cv2.RETR_EXTERNAL:只检索最外层的轮廓。
cv2.RETR_LIST:检索所有的轮廓并存储在列表中。
cv2.RETR_CCOMP:检索所有轮廓并组织为两级结构(外层和内层)。
cv2.RETR_TREE:检索所有轮廓并构建轮廓的完整层次结构树。

#轮廓逼近方法
cv2.CHAIN_APPROX_NONE:存储所有的轮廓点。
cv2.CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线方向的轮廓,只保留重要的轮廓点。
cv2.CHAIN_APPROX_TC89_L1、cv2.CHAIN_APPROX_TC89_KCOS:使用 Teh-Chin 链逼近算法,通常不需要使用这两个方法。

2.轮廓绘制 drawContours()

drawContours(image, contours, contourIdx, color[, thickness][, lineType][, hierarchy][, maxLevel][, offset])

参数:

    image:需要绘制轮廓的图,直接在原图上绘制(同时也是返回值)。可以是彩色图。

    contours:轮廓数组列表。由findContours()返回的值。

    contoursIdx:要绘制轮廓的索引。负数表示绘制所有轮廓。

    color:轮廓线颜色。BGR三元组。

    hierarchy:轮廓的层次关系。由findContours()返回的值。

    maxLevel:要绘制的轮廓的最大层次,默认为0,表示绘制所有层次的轮廓。

    offset:轮廓的偏移量。

▲若背景为白色,则整个背景也会被算作轮廓。

3.包围框

包围图像轮廓的最小边界。

(1)矩形包围框 boundingRect()

boundingRect(array)

参数array:轮廓数组。

返回一个四元组(x,y,w,h),分别代表包围框的左上角x、y坐标以及宽和高。

(2)圆形包围框 minEnclosingCircle()

minEnclosingCircle(points)

参数points:轮廓数组。

返回一个二元组(center,radius),分别表示圆心坐标 (x,y) 和半径 r (都是浮点数)。

(3) 凸包 convexHull()

convexHull(points ,clockwise=False ,returnPoints=True)
即凸多边形包围框。

参数:

    clockwise:True表示返回的点按顺时针排列,False表示逆时针排列。

    returnPoints:True表示返回值(凸包顶点坐标数组)的点为坐标,False表示返回的点为轮廓数组的索引。

(4)Canny边缘检测算法 Canny()

Canny(image, threshold1, threshold2 ,apertureSize=3 ,L2gradient=False)

检测图像中的强度梯度变化,从而识别出物体的轮廓。

参数:

    image:用于检测边缘的图。

    threshold1 / threshold2:阈值,用于边缘检测中的强度梯度。较低的阈值用于边缘起始点检测,较高的阈值用于边缘连接。阈值越小,细节、噪声越多。

    apertureSize:Sobel 算子的孔径大小。

    L2gradient:False表示使用 L1 范数,True表示使用更精确的 L2 范数来计算梯度大小。

返回检测到的边缘图,为一个二值化的灰度图像。

(5)霍夫变换

用于形状检测。

1)直线检测 HoughLines()

用于检测图像中的明显的、长的直线。返回直线的极径和极角,比较麻烦。

2)线段检测 HoughLinesP()

HoughLinesP(image, rho, theta, threshold [, minLineLength][, maxLineGap])

参数:

    image:用于检测直线的图。通常是边缘检测后的结果,如Canny算法的输出。

    rho:霍夫空间中的极径分辨率,表示检测直线使用的半径步长。通常使用1(单位:px)。

    theta:霍夫空间中的角度分辨率。通常使用pi/180(单位:rad)。

    threshold:阈值。用于筛选候选线段,只有累加器中的值高于该阈值的线段才会被返回。

    minLineLength:线段的最小长度。小于此长度的线段将被忽略。

    maxLineGap:线段之间的最小允许间隔。如果两条线段之间的距离小于此值,则它们可能会被连接成为一条线段。

返回值格式为:
[ [[x11 ,y11 ,x12 ,y12]],
  [[x21 ,y21 ,x22 ,y22]],
  [[x31 ,y31 ,x32 ,y32]],
  …………
  [[xn1 ,yn1 ,xn2 ,yn2]] ]    #(numpy数组)

其中,xi1,yi1,xi2,yi2表示线段的2个断点横纵坐标。

3)圆形检测 HoughCircles()

HoughCircles(image, method, dp, minDist [, param1][, param2][, minRadius][, maxRadius])

参数:

    image:用于检测的(灰度)图像。

    method:检测方法。唯一值:CV2.HOUGH_GRADIENT。

    dp:累加器分辨率与图像分辨率的比例倒数。值越小越精确,但计算代价更高。通常取值为 1。

    minDist:圆心间的最小距离。如果距离小于此值,则多个相邻的圆可能会被合并成一个。

    param1:用于Canny边缘检测的高阈值。

    param2:用于确定圆心的累加器阈值。值越大,圆越少,越精确。

    minRadius / maxRadius:最小 / 大半径。

返回值格式:
[[    [x1 ,y1 ,r1],
    [x2 ,y2 ,r2],
    [x3 ,y3 ,r3],
    …………
    [xn ,yn ,rn] ]]

其中,xi,yi,ri表示圆的圆心坐标和半径。

参考及代码详见:

Python个人学习笔记 opencv-contrib-python模块——模版匹配、图形检测 - 哔哩哔哩 (bilibili.com)icon-default.png?t=N7T8https://www.bilibili.com/read/cv26742604/

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值