OpenCV图形检测

图形检测

图像的轮廓

findContours()方法可以通过计算图像梯度来判断图像的边缘,然后将边缘的点封装成数组返回。
contours, hierarchy = cv2.findContours(image, mode, methode)

参数说明:

​ image:被检测的图像,必须是8位单通道二值图像。如果原始图像是彩色图像,必须转为灰度图像,并经过二值化处理。

​ mode:轮廓的检索模式

参数值含义
cv2.RETR_EXTERNAL只检测外轮廓
cv2.RETR_LIST检测所有轮廓,但不建立层次关系
cv2.RETR_CCOMP检测所有轮廓,并建立两级层次关系
cv2.RETR_TREE检测所有轮廓,并建立树状结构的层次关系

​ methode:检测轮廓时使用的方法,具体值如表所示。

参数值含义
cv2.CHAIN_APPROX_NONE储存轮廓上的所有点
cv2.CHAIN_APPROX _SIMPLE只保存水平、垂直或对角线轮廓的端点
cv2.CHAIN_APPROX_TC89_LITen—Chinl近似算法中的一种
cv2.CHAIN_APPROX_TC89_KCOSTen—Chinl近似算法中的一种

返回值说明:

​ contours:检测出的所有轮廓,list类型,每一个元素都是某个轮廓的像素坐标数组。

​ hierarchy:轮廓之间的层次关系。

drawContours()方法绘制轮廓
image = cv2.drawContours(image, contours, contourIdx, color, thickness, lineTypee, hierarchy, maxLevel, offse)

参数说明:

​ image:被绘制轮廓的原始图像,可以是多通道图像。

​ contours:findContours()方法得出的轮廓列表。

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

​ color:绘制颜色,使用BGR格式。

​ thickness:可选参数,画笔的粗细程度,如果该值为-1则绘制实心轮廓。

​ lineTypee:可选参数,绘制轮廓的线型。

​ hierarchy:可选参数,findContours()方法得出的层次关系。

​ maxLevel:可选参数,绘制轮廓的层次深度,最深绘制第maxLevel层。

​ offse:可选参数,偏移量,可以改变绘制结果的位置。

返回值说明:

​ image:同参数中的image,执行后原始图中就包含绘制的轮廓了,可以不使用此返回值保存结果。

轮廓拟合

boundingRect()方法可以自动计算轮廓最小矩形边界的坐标、宽和高。
retval = cv2.boundingRect (array)

参数说明:

​ array:轮廓数组。

返回值说明:

​ retval:元组类型,包含4个整数值,分别是最小矩形包围框的:左上角顶点的横坐标、左上角顶点的纵坐标、矩形的宽和高。所以 也可以写成x, y, w, h = cv2.boundingRect(array)的形式。

minEnclosingCircle ()方法可以自动计算轮廓最小圆形边界的圆心和半径。
center, radius = cv2.minEnclosingCircle(points)

参数说明:

​ points:轮廓数组。

返回值说明:

​ center:元组类型,包含2个浮点值,是最小圆形包围框圆心的横坐标和纵坐标。

​ radius:浮点类型,最小圆形包围框的半径。

凸包

convexHull()方法可以自动找出轮廓的凸包
hull = cv2.convexHull(points, clockwise, returnPoints)

参数说明:

​ points:轮廓数组。

​ clockwise:可选参数,布尔类型。当该值为True时,凸包中的点按顺时针排列,为False时按逆时针排列。

​ returnPoints:可选参数,布尔类型。当该值为True时返回点坐标,为False时返回点索引。默认值为True。

返回值说明:

​ hull:凸包的点阵数组。

Canny边缘检测

Canny()方法根据像素的梯度变化寻找图像边缘,最终可以绘制十分精细的二值边缘图像
edges = cv2.Canny(image, threshold1, threshold2, apertureSize, L2gradient)

参数说明:

image:检测的原始图像。

threshold1:计算过程中使用的第一个阈值,可以是最小阈值,也可以是最大阈值,通常用来设置最小阈值。

threshold2:计算过程中使用的第二个阈值,通常用来设置最大阈值。

apertureSize:可选参数,Sobel算子的孔径大小。

​ L2gradient:可选参数,计算图像梯度的标识,默认值为False。值为True时采用更精准的算法进行计算。

返回值说明:

edges:计算后得出的边缘图像,是一个二值灰度图像。

在开发过程中可以通过调整最小阈值和最大阈值控制边缘检测的精细程度。当2个阈值都较小时,检测出较多的细节;当2个阈值都较大时,忽略较多的细节。

霍夫变换

霍夫变换是一种特征检测,通过算法识别图像的特征,从而判断图像中的特殊形状,例如直线和圆。本节将介绍如何检测图像中的直线和圆

直线检测

cv2.HoughLines()和cv2.HoughLinesP(),前者用于检测无限延长的直线,后者用于检测线段。

HoughLinesP()方法最后把找出的所有线段的两个端点坐标保存成一个数组。
lines = cv2.HoughLinesP(image, rho, theta, threshold, minLineLength, maxLineGap)

参数说明:

​ image:检测的原始图像。

​ rho:检测直线使用的半径步长,值为1时,表示检测所有可能的半径步长。

​ theta:搜索直线的角度,值为π/180°时,表示检测所有角度。

​ threshold:阈值,该值越小,检测出的直线就越多。

​ minLineLength:线段的最小长度,小于该长度的线段不记录到结果中。

​ maxLineGap:线段之间的最小距离。

返回值说明:

​ lines:一个数组,元素为所有检测出的线段,每条线段是一个数组,代表线段两个端点的横、纵坐标,格式为[[[x1, y1,x2, y2], [x1, y1, x2, y2]]]。

[!CAUTION]

使用该方法前应该为原始图像进行降噪处理,否则会影响检测结果。

圆环检测

HoughCircles()方法用于检测图像中的圆环

该方法在检测过程中进行两轮筛选:第一轮筛选找出可能是圆的圆心坐标,第二轮筛选计算这些圆心坐标可能对应的半径长度。该方法最后将圆心坐标和半径封装成一个浮点型数组。

circles = cv2.HoughCircles(image, method, dp, minDist, param1, param2, minRadius, maxRadius)

参数说明:

​ image:检测的原始图像。

​ method:检测方法,OpenCV 4.0.0及以前版本仅提供了cv2.HOUGH_GRADIENT作为唯一可用方法。

​ dp:累加器分辨率与原始图像分辨率之比的倒数。值为1时,累加器与原始图像具有相同的分辨率;值为2时,累加

​ 器的分辨率为原始图像的1/2。通常使用1作为参数。

​ minDist:圆心之间的最小距离。

​ param1:可选参数,Canny边缘检测使用的最大阈值。

​ param2:可选参数,检测圆环结果的投票数。第一轮筛选时投票数超过该值的圆环才会进入第二轮筛选。值越大,检测出的圆环越 少,但越精准。

​ minRadius:可选参数,圆环的最小半径。

​ maxRadius:可选参数,圆环的最大半径。

返回值说明:

​ circles:一个数组,元素为所有检测出的圆环,每个圆环也是一个数组,内容为圆心的横、纵坐标和半径长度,格式为:[[[x1 ,y1, r1], [x2 ,y2, r2]]]。

Canny()方法虽然能够检测出图像的边缘,但这个边缘是不连续的。
OpenCV可以用于识别图形验证码。一般来说,验证码的识别可以分为以下几个步骤: 1. 图像预处理:通过二值化、去噪等方式将验证码图片进行预处理,以便后续处理; 2. 字符分割:将验证码中的每个字符分割出来,以便单独进行识别; 3. 字符识别:使用机器学习或深度学习等方法对每个字符进行识别。 以下是一个简单的示例代码,用于识别由4个字符组成的图形验证码。 ```python import cv2 import numpy as np import pytesseract # 读取验证码图片 img = cv2.imread('captcha.png') # 将图片转换为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化处理 ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 去除噪声 kernel = np.ones((3, 3), np.uint8) thresh = cv2.erode(thresh, kernel, iterations=1) thresh = cv2.dilate(thresh, kernel, iterations=1) # 查找轮廓 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 对轮廓进行排序 contours = sorted(contours, key=lambda c: cv2.boundingRect(c)[0]) # 识别每个字符 captcha = '' for contour in contours: # 提取每个字符的ROI x, y, w, h = cv2.boundingRect(contour) roi = thresh[y:y + h, x:x + w] # 将字符缩放为20x20的大小 roi = cv2.resize(roi, (20, 20), interpolation=cv2.INTER_AREA) # 将字符转换为文本 captcha += pytesseract.image_to_string(roi, config='--psm 10') # 输出识别结果 print('验证码为:', captcha) ``` 需要注意的是,验证码识别是一项比较复杂的任务,可能需要根据具体的验证码做出相应的调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值