OpenCV day6
函数内容接上文:OpenCV day4-CSDN博客 , OpenCV day5-CSDN博客
目录
平滑(模糊)
25.cv2.blur():
26.cv2.boxFilter():
27.cv2.GaussianBlur():
28.cv2.medianBlur():
29.cv2.bilateralFilter():
锐化与边缘检测
30.cv2.filter2D():
31.cv2.Sobel():
32.cv2.Scharr():
33.cv2.Laplacian():
34.cv2.Canny():
绘图与标注
35.cv2.line():
36.cv2.rectangle():
37.cv2.polylines():
38.cv2.ellipse():
39.cv2.circle():
40.cv2.putText():
轮廓分析
41.cv2.findContours():
42.cv2.drawContours():
43.cv2.approxPolyDP():
平滑(模糊)
25.cv2.blur():
功能 | 对图像进行均值模糊(平滑处理),通过邻域像素的平均值减少噪声或细节。 |
参数 | 1. src :输入图像(单通道或多通道)。2. ksize :模糊核大小(如 (5,5) )。3. anchor (可选):锚点位置(默认 (-1,-1) 表示核中心)。4. borderType (可选):边界填充方式(如 cv2.BORDER_DEFAULT )。 |
返回值 | 模糊后的图像(numpy.ndarray )。 |
关键点:
-
均值滤波:核内所有像素取平均,适用于简单去噪(但可能边缘模糊)。
-
核大小:
ksize
必须是正奇数(如(3,3)
、(5,5)
)。
26.cv2.boxFilter():
功能 | 对图像进行方框滤波(均值滤波的通用版本,可控制归一化)。 |
参数 | 1. src :输入图像。2. ddepth :输出图像深度(如 -1 表示与输入相同)。3. ksize :滤波核大小(如 (3,3) )。4. normalize (可选):是否归一化(默认 True ,效果同 cv2.blur() )。5. anchor (可选):锚点位置(默认核中心)。6. borderType (可选):边界填充方式(如 cv2.BORDER_REFLECT )。 |
返回值 | 滤波后的图像(numpy.ndarray )。 |
关键特性:
-
归一化:
normalize=True
时等同于cv2.blur()
(求均值),False
时直接求和(可能导致值溢出)。 -
灵活性:可自定义输出图像深度(如
cv2.CV_32F
保留浮点结果)。
27.cv2.GaussianBlur():
功能 | 对图像进行高斯模糊(基于高斯分布的加权平均滤波,有效减少噪声并保留边缘)。 |
参数 | 1. src :输入图像(支持多通道)。2. ksize :高斯核大小(宽高为正奇数,如(5,5) )。3. sigmaX :X方向标准差(控制模糊强度,0表示自动计算)。4. sigmaY (可选):Y方向标准差(默认同sigmaX )。5. borderType (可选):边界填充方式(如cv2.BORDER_DEFAULT )。 |
返回值 | 高斯模糊后的图像(numpy.ndarray )。 |
关键特性:
-
高斯权重:中心像素权重高,边缘权重低,比均值模糊更保边缘。
-
标准差:
sigma
越大,模糊效果越强(若为0,则根据ksize
自动计算)。 -
核大小:必须是正奇数(如
(3,3)
、(5,5)
)。
28.cv2.medianBlur():
功能 | 对图像进行中值模糊(用邻域像素的中值替代中心像素,有效去除椒盐噪声)。 |
参数 | 1. src :输入图像(支持单通道或多通道,但深度需为CV_8U 或CV_32F )。2. ksize :滤波核大小(必须为大于1的奇数,如3、5等)。 |
返回值 | 中值滤波后的图像(numpy.ndarray )。 |
关键特性:
-
非线性滤波:取邻域中位数,非均值/加权平均,适合去除椒盐噪声(突发的黑白噪点)。
-
保护边缘:相比均值模糊,能更好保留锐利边缘。
-
核限制:核大小必须是奇数(如3、5、7),且不能为1。
29.cv2.bilateralFilter():
功能 | 对图像进行双边滤波,在平滑噪声的同时保留边缘(非线性能量保持滤波)。 |
参数 | 1. src :输入图像(8位或浮点型,单通道或多通道)。2. d :邻域直径(若≤0则根据sigmaSpace 计算)。3. sigmaColor :颜色空间标准差(控制颜色相似性权重)。4. sigmaSpace :坐标空间标准差(控制距离权重)。5. borderType (可选):边界填充方式(默认cv2.BORDER_DEFAULT )。 |
返回值 | 滤波后的图像(numpy.ndarray )。 |
关键特性:
-
边缘保留:结合颜色相似性和空间距离双重权重,避免边缘模糊。
-
参数敏感:
sigmaColor
越大,颜色容忍度越高;sigmaSpace
越大,远处像素影响越大。 -
计算较慢:比高斯滤波耗时,适合小区域或实时性要求不高的场景。
锐化与边缘检测
30.cv2.filter2D():
功能 | 对图像进行自定义卷积操作,通过用户定义的核(Kernel)实现滤波效果。 |
参数 | 1. src :输入图像(单通道或多通道)。2. ddepth :输出图像深度(如 -1 表示与输入相同)。3. kernel :卷积核(numpy.ndarray ,需为单通道浮点矩阵)。4. anchor (可选):核的锚点位置(默认中心)。5. delta (可选):卷积后叠加的常数(默认0)。6. borderType (可选):边界填充方式(如 cv2.BORDER_CONSTANT )。 |
返回值 | 卷积后的图像(numpy.ndarray )。 |
关键特性:
-
灵活性强:可自定义核实现锐化、边缘检测、模糊等效果。
-
数学本质:核与图像局部区域做点乘后求和(离散卷积运算)。
-
边界处理:默认填充黑色,可通过
borderType
调整。
31.cv2.Sobel():
功能 | 使用Sobel算子计算图像的一阶梯度(用于边缘检测)。 |
参数 | 1. src :输入图像(单通道)。2. ddepth :输出图像深度(如cv2.CV_64F 保留负梯度)。3. dx :x方向导数阶数(如1表示检测垂直边缘)。4. dy :y方向导数阶数(如1表示检测水平边缘)。5. ksize (可选):Sobel核大小(默认3,仅支持1/3/5/7)。6. scale (可选):缩放因子(默认1)。7. delta (可选):结果叠加的常数(默认0)。8. borderType (可选):边界填充方式(默认cv2.BORDER_DEFAULT )。 |
返回值 | 梯度图像(numpy.ndarray )。 |
关键特性
-
梯度方向
-
dx=1, dy=0
:检测垂直边缘(对x方向求导)。 -
dx=0, dy=1
:检测水平边缘(对y方向求导)。 -
dx=1, dy=1
:同时检测两个方向的边缘(不常用,推荐分开计算后合并)。
-
-
核大小
-
ksize=1
:使用1×3或3×1核(无高斯平滑)。 -
ksize=3
(默认):3×3核,含高斯权重,抗噪性更好。
-
-
输出深度
-
使用
cv2.CV_64F
保留负梯度值,最后取绝对值:
-
grad_x = cv2.Sobel(img, cv2.CV_64F, 1, 0)
abs_grad = cv2.convertScaleAbs(grad_x) # 转为8位无符号
32.cv2.Scharr():
项目 | 说明 |
---|---|
功能 | 使用Scharr算子计算图像的一阶梯度(比Sobel更精确的边缘检测)。 |
参数 | 1. src :输入图像(单通道)。2. ddepth :输出图像深度(如cv2.CV_64F )。3. dx :x方向导数阶数(1或0)。4. dy :y方向导数阶数(1或0)。5. scale (可选):缩放因子(默认1)。6. delta (可选):结果叠加的常数(默认0)。7. borderType (可选):边界填充方式(默认cv2.BORDER_DEFAULT )。 |
返回值 | 梯度图像(numpy.ndarray )。 |
核心特性
-
与Sobel的对比
-
更高精度:Scharr算子使用3×3核时,对梯度的近似计算比Sobel更精确(尤其对对角边缘)。
-
固定核大小:仅支持
ksize=3
(不可像Sobel那样选择1/5/7)。
-
-
梯度方向
-
dx=1, dy=0
:检测垂直边缘。 -
dx=0, dy=1
:检测水平边缘。 -
不支持
dx=dy=1
(需分开计算后合并)。
-
33.cv2.Laplacian():
项目 | 说明 |
---|---|
功能 | 使用拉普拉斯算子计算图像的二阶导数,用于边缘检测(对噪声敏感,但能检测全方向边缘)。 |
参数 | 1. src :输入图像(单通道)。2. ddepth :输出图像深度(如 cv2.CV_64F 保留负值)。3. ksize (可选):核大小(默认1,仅支持1/3/5/7)。4. scale (可选):缩放因子(默认1)。5. delta (可选):结果叠加的常数(默认0)。6. borderType (可选):边界填充方式(默认 cv2.BORDER_DEFAULT )。 |
返回值 | 二阶梯度图像(numpy.ndarray )。 |
34.cv2.Canny():
功能 | 使用Canny算法进行多阶段边缘检测(低错误率+边缘细化)。 |
参数 | 1. image :输入图像(必须为单通道灰度图)。2. threshold1 :低阈值(弱边缘筛选)。3. threshold2 :高阈值(强边缘确认)。4. apertureSize (可选):Sobel算子核大小(默认3)。5. L2gradient (可选):梯度计算方式(True 用L2范数更精确,默认False 用L1范数)。 |
返回值 | 二值边缘图像(numpy.ndarray ,边缘=255,背景=0)。 |
关键特性
-
双阈值机制
-
强边缘:梯度值 >
threshold2
→ 保留。 -
弱边缘:
threshold1
< 梯度值 ≤threshold2
→ 仅当与强边缘连接时保留。 -
建议比例:
threshold2 ≈ 2×threshold1
(如50, 150
)。
-
-
处理流程
-
输出效果
-
边缘为细线(1像素宽),背景纯黑。
-
对噪声鲁棒,但依赖阈值参数调优。
-
绘图与标注
35.cv2.line():
功能 | 在图像上绘制一条线段。 |
参数 | 1. img :输入图像(直接修改该图像)。2. pt1 :线段起点坐标 (x1, y1) 。3. pt2 :线段终点坐标 (x2, y2) 。4. color :线条颜色(BGR三元组,如 (255,0,0) 表示红色)。5. thickness (可选):线条粗细(默认1)。6. lineType (可选):线条类型(如 cv2.LINE_AA 抗锯齿)。7. shift (可选):坐标小数位数(默认0)。 |
返回值 | 无(直接修改输入图像)。 |
关键特性
-
坐标系统
-
原点
(0,0)
在图像左上角,x向右增长,y向下增长。
-
-
线条样式
-
lineType=cv2.LINE_AA
:抗锯齿线条(更平滑,但速度稍慢)。 -
lineType=cv2.LINE_8
:8连通快速绘制(默认)。
-
-
颜色模式
-
BGR顺序:OpenCV默认格式(与RGB相反),例如红色为
(0,0,255)
。
-
36.cv2.rectangle():
功能 | 在图像上绘制矩形(空心或实心)。 |
参数 | 1. img :输入图像(直接修改该图像)。2. pt1 :矩形左上角坐标 (x1, y1) 。3. pt2 :矩形右下角坐标 (x2, y2) 。4. color :矩形颜色(BGR三元组,如 (0,255,0) 表示绿色)。5. thickness (可选):线条粗细(默认1,负数表示填充矩形)。6. lineType (可选):线条类型(如 cv2.LINE_AA 抗锯齿)。7. shift (可选):坐标小数位数(默认0)。 |
返回值 | 无(直接修改输入图像)。 |
关键特性
-
坐标定义
-
pt1
和pt2
分别对应矩形的左上角和右下角(无需保证x2>x1
或y2>y1
,函数会自动处理)。
-
-
填充模式
-
thickness=-1
:用指定颜色填充整个矩形。 -
thickness≥1
:绘制空心矩形边框。
-
-
颜色与样式
-
BGR顺序:例如蓝色为
(255,0,0)
。 -
lineType=cv2.LINE_AA
:抗锯齿边框(适合倾斜矩形)。
-
37.cv2.polylines():
功能 | 在图像上绘制一个或多个多边形(空心或实心)。 |
参数 | 1. img :输入图像(直接修改该图像)。2. pts :多边形顶点数组(格式见示例)。3. isClosed :是否闭合多边形(True=首尾相连)。4. color :线条颜色(BGR三元组)。5. thickness (可选):线条粗细(默认1)。6. lineType (可选):线条类型(如 cv2.LINE_AA )。7. shift (可选):坐标小数位数(默认0)。 |
返回值 | 无(直接修改输入图像)。 |
关键特性
-
顶点格式
-
单个多边形:
np.array([[x1,y1], [x2,y2], ...], dtype=np.int32)
-
多个多边形:
[poly1_pts, poly2_pts, ...]
(列表包裹多个数组)
-
-
闭合控制
-
isClosed=True
:自动连接首尾点(如绘制五角星)。 -
isClosed=False
:开放路径(如绘制折线)。
-
-
批量绘制
-
可一次性绘制多个多边形,比循环调用
cv2.line()
更高效。
-
38.cv2.ellipse():
项目 | 说明 |
---|---|
功能 | 在图像上绘制椭圆(空心或实心)、圆弧或扇形。 |
参数 | 1. img :输入图像(直接修改)。2. center :椭圆中心 (x,y) 。3. axes :主轴长度 (长轴,短轴) 。4. angle :旋转角度(顺时针,度)。5. startAngle :起始角度(0°为3点钟方向)。6. endAngle :结束角度(如360°完整椭圆)。7. color :颜色(BGR)。8. thickness (可选):线宽(默认1,-1填充)。9. lineType (可选):线型(如cv2.LINE_AA )。10. shift (可选):坐标小数位数(默认0)。 |
返回值 | 无(直接修改输入图像)。 |
关键特性
-
角度定义
-
angle
:椭圆整体旋转角度(如0°时长轴水平)。 -
startAngle/endAngle
:局部弧线范围(0°→360°绘制完整椭圆)。
-
-
填充模式
-
thickness=-1
:填充图形(如绘制实心圆)。 -
thickness≥1
:绘制边框。
-
-
特殊图形
-
圆:设
axes=(r,r)
且angle=0
。 -
扇形:设
startAngle=30, endAngle=270
。
-
39.cv2.circle():
功能 | 在图像上绘制圆形(空心或实心)。 |
参数 | 1. img :输入图像(直接修改)。2. center :圆心坐标 (x,y) 。3. radius :圆半径(像素)。4. color :颜色(BGR三元组)。5. thickness (可选):线宽(默认1,-1表示填充)。6. lineType (可选):线型(如 cv2.LINE_AA 抗锯齿)。7. shift (可选):坐标小数位数(默认0)。 |
返回值 | 无(直接修改输入图像)。 |
关键特性
-
坐标系统
-
圆心
(x,y)
的坐标系原点在图像左上角,x向右增长,y向下增长。
-
-
填充模式
-
thickness=-1
:绘制实心圆(如标记目标中心点)。 -
thickness≥1
:绘制空心圆(如标记检测框)。
-
-
抗锯齿
-
lineType=cv2.LINE_AA
:边缘平滑(适合高分辨率图像)。 -
lineType=cv2.LINE_8
:快速绘制(默认)
-
40.cv2.putText():
项目 | 说明 |
---|---|
功能 | 在图像上绘制文字(支持多种字体、大小和样式)。 |
参数 | 1. img :输入图像(直接修改)。2. text :要绘制的字符串。3. org :文字左下角起点 (x,y) 。4. fontFace :字体类型(如 cv2.FONT_HERSHEY_SIMPLEX )。5. fontScale :字体缩放因子(大小)。6. color :文字颜色(BGR三元组)。7. thickness (可选):文字粗细(默认1)。8. lineType (可选):线型(如 cv2.LINE_AA )。9. bottomLeftOrigin (可选):坐标系原点是否在左下角(默认False,即左上角)。 |
返回值 | 无(直接修改输入图像)。 |
关键特性
-
字体支持
-
常用字体:
cv2.FONT_HERSHEY_SIMPLEX
(标准)、cv2.FONT_HERSHEY_SCRIPT_SIMPLEX
(手写体)等。 -
中文支持:需加载中文字体文件(如
Pillow
库配合使用)。
-
-
坐标系统
-
org
默认基于左上角坐标系((0,0)
在左上角)。 -
设
bottomLeftOrigin=True
可切换为左下角坐标系(数学坐标系)。
-
-
抗锯齿
-
lineType=cv2.LINE_AA
:文字边缘平滑(推荐)。 -
lineType=cv2.LINE_8
:快速渲染(默认)。
-
轮廓分析
41.cv2.findContours():
功能 | 从二值图像中提取轮廓(可用于物体形状分析、边缘检测等)。 |
参数 | 1. image :输入二值图像(通常需先阈值化或边缘检测)。2. mode :轮廓检索模式(如 cv2.RETR_EXTERNAL 仅外轮廓)。3. method :轮廓近似方法(如 cv2.CHAIN_APPROX_SIMPLE 压缩冗余点)。4. offset (可选):轮廓点坐标偏移量(默认 (0,0) )。 |
返回值 | 1. contours :轮廓列表(每个轮廓为 np.array 的点集)。2. hierarchy :轮廓层级关系(树结构描述父子轮廓)。 |
关键参数详解
1. 检索模式(mode
)
模式 | 说明 |
---|---|
cv2.RETR_EXTERNAL | 仅检测最外层轮廓(忽略内部孔洞)。 |
cv2.RETR_LIST | 检测所有轮廓,无层级关系(hierarchy 为无效值)。 |
cv2.RETR_TREE | 检测所有轮廓并建立完整层级树(记录父子关系)。 |
2. 近似方法(method
)
方法 | 说明 |
---|---|
cv2.CHAIN_APPROX_NONE | 存储轮廓所有点(坐标完整,但冗余)。 |
cv2.CHAIN_APPROX_SIMPLE | 压缩水平、垂直、对角线方向的冗余点(如矩形仅保留4个角点)。 |
42.cv2.drawContours():
功能 | 在图像上绘制轮廓(支持自定义颜色、线宽、层级过滤)。 |
参数 | 1. image :输入图像(直接修改)。2. contours :轮廓列表(来自cv2.findContours() )。3. contourIdx :要绘制的轮廓索引(-1表示全部)。4. color :轮廓颜色(BGR三元组)。5. thickness (可选):线宽(默认1,-1表示填充)。6. lineType (可选):线型(如cv2.LINE_AA )。7. hierarchy (可选):层级关系(用于过滤)。8. maxLevel (可选):最大绘制层级(默认0,仅当前层)。9. offset (可选):轮廓点坐标偏移量。 |
返回值 | 无(直接修改输入图像)。 |
关键特性
-
轮廓选择
-
contourIdx=-1
:绘制所有轮廓。 -
contourIdx=2
:仅绘制列表中第3个轮廓(索引从0开始)。
-
-
填充模式
-
thickness=-1
:填充轮廓内部(如生成掩膜)。 -
thickness≥1
:绘制空心轮廓。
-
-
层级控制
-
结合
hierarchy
和maxLevel
可选择性绘制子轮廓(如只画最外层)。
-
43.cv2.approxPolyDP():
功能 | 用Douglas-Peucker算法对轮廓多边形进行近似(减少顶点数,保持形状)。 |
参数 | 1. curve :输入轮廓(np.array 形状为 (N,1,2) )。2. epsilon :近似精度(值越小,越接近原始轮廓)。3. closed :是否闭合轮廓(默认 True )。 |
返回值 | 近似后的多边形点集(np.array 形状为 (M,1,2) ,M≤N)。 |
关键特性
-
算法原理
-
通过设定最大距离容差(
epsilon
)压缩冗余顶点,保留关键转折点
-
-
参数选择
-
epsilon
通常取轮廓周长的百分比(如0.02*cv2.arcLength(curve, True)
)。 -
closed=True
时强制首尾相连。
-
-
应用场景
-
简化复杂轮廓(如文档边界矫正)。
-
形状分类(通过顶点数判断矩形、三角形等)。
-
注意事项
-
输入格式:轮廓必须是
(N,1,2)
形状(与cv2.findContours()
输出一致)。 -
精度控制:
epsilon
过大可能导致过度简化(如六边形变三角形)。 -
闭合性:开放曲线(如折线)需设
closed=False
。