opencv之图像轮廓特征查找、直方图均衡化、模板匹配

一、轮廓特征查找

图像轮廓特征查找其实就是他的外接轮廓。

应用:图像分割、形状分析、物体检测与识别

根据轮廓点进行,所以要先找到轮廓。

先灰度化、二值化。目标物体白色,非目标物体黑色,选择合适的二值化方式。有了轮廓点就可以找到最上、最下、最左、最右的四个坐标。就可以绘制出矩形。

三种常见的轮廓特征:

1.外接矩形

boundingRect(轮廓点),返回值是x,y,w,h四个值其中(x,y)是外接矩形的左上角坐标,w,h分别是矩形的宽和高。然后根据返回值执行

cv.rectangle(num,(x,y),(x+w,y+h),(0,255,0),2)就可以的到外接矩形。

2.最小外接矩形

寻找最小外接矩形使用的算法叫做旋转卡壳法。

contours, hierarchy = cv2.findContours(image_np_thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 

contours为二值图像上查找所有的外部轮廓 。

rect = cv2.minAreaRect(contours)

rect 是计算轮廓最小面积外接矩形:rect 结构通常包含中心点坐标 (x, y)、宽度 width、高度 height 和旋转角度 angle.

dst=cv2.boxPoints(rect).astype(int)

cv2.boxPoints(rect)返回 是一个形状为 4行2列的数组,每一行代表一个点的坐标(x, y),顺序按照逆时针或顺时针方向排列.将最小外接矩形转换为边界框的四个角点,并转换为整数坐标.

cv2.drawContours(image, contours, contourIdx, color, thickness)

image:原图像,一般为 numpy 数组,通常为灰度或彩色图像。

contours:一个包含多个轮廓的列表,可以用上一个api得到的 [box]

contourIdx:要绘制的轮廓索引。如果设置为 -1,则绘制所有轮廓。

color:轮廓的颜色,可以是 BGR 颜色格式的三元组,例如 (0, 0, 255) 表示红色。

thickness:轮廓线的粗细,如果是正数,则绘制实线;如果是 0,则绘制轮廓点;如果是负数,则填充轮廓内部区域。

3.最小外接圆

寻找最小外接圆使用的算法是Welzl算法。Welzl算法基于一个定理:希尔伯特圆定理表明,对于平面上的任意三个不在同一直线上的点,存在一个唯一的圆同时通过这三个点,且该圆是最小面积的圆(即包含这三个点的圆中半径最小的圆,也称为最小覆盖圆)。

cv2.minEnclosingCircle(points) -> (center, radius)

oints:输入参数图片轮廓数据

返回值:

center:一个包含圆心坐标的二元组 (x, y)

radius:浮点数类型,表示计算得到的最小覆盖圆的半径。

cv2.circle(img, center, radius, color, thickness)

img:输入图像,通常是一个numpy数组,代表要绘制圆形的图像。

center:一个二元组 (x, y),表示圆心的坐标位置。

radius:整型或浮点型数值,表示圆的半径长度。

color:颜色标识,可以是BGR格式的三元组 (B, G, R),例如 (255, 0, 0) 表示红色。

thickness:整数,表示圆边框的宽度。如果设置为 -1,则会填充整个圆。

二、直方图均衡化

hist=cv2.calcHist(images, channels, mask, histSize, ranges)

images:输入图像列表,可以是一幅或多幅图像(通常是灰度图像或者彩色图像的各个通道)。

channels:一个包含整数的列表,指示在每个图像上计算直方图的通道编号。如果输入图像是灰度图,它的值就是 [0];如果是彩色图像的话,传入的参数可以是 [0],[1],[2] 它们分别对应着通道 B,G,R。

mask(可选):一个与输入图像尺寸相同的二值掩模图像,其中非零元素标记了参与直方图计算的区域,None为全部计算。

histSize:一个整数列表,也就是直方图的区间个数(BIN 的数目)。用中括号括起来,例如:[256]。

ranges:每维数据的取值范围,它是一个二维列表,每一维对应一个通道的最小值和最大值,例如对灰度图像可能是 [0, 256]

返回值hist 是一个长度为255的数组,数组中的每个值表示图像中对应灰度等级的像素计数

minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(hist)

获取直方图的最小值、最大值及其对应最小值的位置索引、最大值的位置索引

绘制直方图:

cv2.line(img, pt1, pt2, color, thickness)

img:原始图像,即要在上面画线的numpy数组(一般为uint8类型)。

pt1pt2:分别为线段的起点和终点坐标,它们都是元组类型,例如 (x1, y1)(x2, y2) 分别代表线段两端的横纵坐标。

color:线段的颜色,通常是一个包含三个元素的元组 (B, G, R) 表示BGR色彩空间的像素值,也可以是灰度图像的一个整数值。

thickness:线段的宽度,默认值是1,如果设置为负数,则线宽会被填充。

自适应直方图均衡化:

dst = cv.equalizeHist(imgGray)

imgGray为需要直方图均衡化的灰度图,返回值为处理后的图像

对比度受限的自适应直方图均衡化:

clahe = cv2.createCLAHE(clipLimit=None, tileGridSize=None)

clipLimit(可选):对比度限制参数,用于控制直方图均衡化过程中对比度增强的程度。如果设置一个大于1的值(如2.0或4.0),CLAHE会限制对比度增强的最大程度,避免过度放大噪声。如果不设置,OpenCV会使用一个默认值。tileGridSize(可选):图像分块的大小,通常是一个包含两个整数的元组,如(8, 8),表示将图像划分成8x8的小块进行独立的直方图均衡化处理。分块大小的选择会影响到CLAHE的效果以及处理速度。

创建CLAHE对象后,可以使用 .apply() 方法对图像进行CLAHE处理:

img=clahe.apply(image)

image:要均衡化的图像。

img均衡后的图像

三、模板匹配

res=cv2.matchTemplate(image, templ, method)

image:原图像,这是一个灰度图像或彩色图像(在这种情况下,匹配将在每个通道上独立进行)。

templ:模板图像,也是灰度图像或与原图像相同通道数的彩色图像。

method:匹配方法,可以是以下之一:

cv2.TM_CCOEFF,cv2.TM_CCOEFF_NORMED,cv2.TM_CCORR,cv2.TM_CCORR_NORMED,cv2.TM_SQDIFF,cv2.TM_SQDIFF_NORMED

这些方法决定了如何度量模板图像与原图像子窗口之间的相似度。

res:

函数在完成图像模板匹配后返回一个结果矩阵,这个矩阵的大小与原图像相同。矩阵的每个元素表示原图像中相应位置与模板图像匹配的相似度。

匹配方法不同,返回矩阵的值的含义也会有所区别。以下是几种常用的匹配方法及其返回值含义:

  1. cv2.TM_SQDIFFcv2.TM_SQDIFF_NORMED

    返回值越接近0,表示匹配程度越好。最小值对应的最佳匹配位置。

  2. cv2.TM_CCORRcv2.TM_CCORR_NORMED

    返回值越大,表示匹配程度越好。最大值对应的最佳匹配位置。

  3. cv2.TM_CCOEFFcv2.TM_CCOEFF_NORMED

    返回值越大,表示匹配程度越好。最大值对应的最佳匹配位置。

轮廓绘制:

找的目标图像中匹配程度最高的点,我们可以设定一个匹配阈值来筛选出多个匹配程度高的区域。

loc=np.where(array > 0.8) #loc包含array中所有大于0.8的元素索引的数组

np.where(condition) 是 NumPy 的一个函数,当条件为真时,返回满足条件的元素的索引。

zip(*loc)

*loc 是解包操作,将 loc 中的多个数组拆开,作为单独的参数传递给 zip

zip 将这些数组按元素一一配对,生成一个迭代器,每个元素是一个元组,表示一个坐标点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值