南京建设高端网站,广州网站的建设,中国景观设计公司十强,长沙seo管理一、梯度处理的sobel算子函数 处理示意 Sobel 算子是一种常用的图像边缘检测方法#xff0c;结合了一阶导数和高斯平滑#xff0c;用于检测图像的梯度信息。
1、功能
Sobel 算子用于计算图像在 x 和 y 方向的梯度#xff0c;主要功能包括#xff1a;
强调图像中灰度值的…一、梯度处理的sobel算子函数 处理示意 Sobel 算子是一种常用的图像边缘检测方法结合了一阶导数和高斯平滑用于检测图像的梯度信息。
1、功能
Sobel 算子用于计算图像在 x 和 y 方向的梯度主要功能包括
强调图像中灰度值的变化部分用于检测边缘。计算水平和垂直方向的梯度值。提供平滑效果以减少噪声干扰相比于简单差分方法。
2、参数
在 OpenCV 中cv2.Sobel() 是实现 Sobel 算子的主要函数。其常用参数包括
参数名说明 src 输入图像它应该是灰度图像。 ddepth 输出图像的所需深度数据类型。通常你可以使用 -1 来表示与输入图像相同的深度或者使用如 cv2.CV_64F 等来指定特定的深度。由于梯度计算可能产生负值因此建议使用能够包含负数的数据类型。 dx x 方向上的导数阶数。如果你想要计算 x 方向上的梯度设置这个参数为 1如果你不关心 x 方向上的梯度设置这个参数为 0。 dy y 方向上的导数阶数。如果你想要计算 y 方向上的梯度设置这个参数为 1如果你不关心 y 方向上的梯度设置这个参数为 0。通常你不会同时设置 dx 和 dy 都为 0。 ksize Sobel 核的大小。它必须是 1、3、5、7 或 9 之一。这个参数决定了用于计算梯度的滤波器的大小。大小为 1 时表示使用最小的滤波器但通常你会使用更大的滤波器来平滑梯度计算。 scale 可选参数表示计算梯度时的缩放因子。默认值为 1表示不进行缩放。你可以通过调整这个参数来放大或缩小梯度的结果。 delta 可选参数表示在将结果存储到目标图像之前要添加到结果中的可选增量值。默认值为 0表示不添加增量。 borderType 像素外推方法例如 cv2.BORDER_DEFAULT、cv2.BORDER_REFLECT 等。这个参数决定了在图像边界处如何处理像素外推。
3、返回值
返回一个与输入图像尺寸相同的单通道图像。结果图像的每个像素值代表该点的梯度值。
4、应用
Sobel 算子广泛用于以下应用场景
①边缘检测
用于检测图像中显著的灰度值变化通常是物体的边缘。
②图像增强
提取图像的边缘特征以增强感兴趣的区域。
③特征提取
在计算机视觉任务中用作边缘特征检测的一步例如人脸检测、车道线检测等。
④梯度方向计算
与梯度幅值一起用于方向敏感的应用如方向滤波。
5、代码示例
import cv2# 读取一张图
img cv2.imread(./shudu.png)
img cv2.resize(img, (img.shape[1] // 2, img.shape[0] // 2))# 使用sobel算子
# 水平梯度
img_sobel cv2.Sobel(img, -1, 0, 1, ksize3)
# 垂直梯度
img_sobel_2 cv2.Sobel(img, -1, 1, 0, ksize3)cv2.imshow(image, img)
cv2.imshow(img_sobel, img_sobel)
cv2.imshow(img_sobel_2, img_sobel_2)cv2.waitKey(0) Sobel算子代码效果 二、梯度处理Laplacian算子函数
Laplacian 算子是图像处理中的一种二阶导数算子用于检测图像的边缘。它通过计算图像像素值的二阶导数即亮度变化率来突出边缘信息。
1、功能
①边缘检测
通过计算图像的二阶导数检测图像中灰度变化较大的区域。
②增强图像细节
可以提取图像的边缘特征用于后续处理。
③方向无关
不同于 Sobel 算子Laplacian 算子对方向不敏感计算的是梯度的二阶导数。
2、参数
在 OpenCV 中cv2.Laplacian() 函数实现了 Laplacian 算子的功能常用参数包括
参数名说明 src 输入图像它应该是灰度图像。 ddepth 输出图像的所需深度。这个参数决定了输出图像的深度数据类型。通常你可以使用 -1 来表示与输入图像相同的深度或者使用 cv2.CV_64F 等来指定特定的深度。由于拉普拉斯算子可能产生负值因此通常建议使用能够包含负数的数据类型如 cv2.CV_64F。 ksize 算子的大小。它必须是 1、3、5 或 7 之一。这个参数决定了用于计算拉普拉斯算子的滤波器的大小。大小为 1 时表示使用 4 邻域拉普拉斯算子其他大小则使用更大的滤波器。 scale 可选参数表示计算拉普拉斯算子时的缩放因子。默认值为 1表示不进行缩放。你可以通过调整这个参数来放大或缩小拉普拉斯算子的结果。 delta 可选参数表示在将结果存储到目标图像之前要添加到结果中的可选增量值。默认值为 0表示不添加增量。 borderType 像素外推方法例如 cv2.BORDER_DEFAULT、cv2.BORDER_REFLECT 等。这个参数决定了在图像边界处如何处理像素外推。当 ksize 大于 1 时这个参数才有意义。
3、返回值
返回一个单通道的梯度图像。每个像素值表示该点的梯度变化强度即边缘强度。
4、应用
①边缘检测
检测图像中显著的灰度变化区域用于突出边缘。
②特征提取
在计算机视觉任务中用于提取边缘作为特征输入例如物体检测、图像配准等。
③图像增强
提高图像的细节部分增强局部特征。
④前处理步骤
常作为更复杂图像处理如 Hough 变换的前置步骤。
5、代码示例
import cv2# 读取一张图
img cv2.imread(./shudu.png)
img cv2.resize(img, (img.shape[1] // 2, img.shape[0] // 2))# 使用拉普拉斯算子
img_lap cv2.Laplacian(img, -1, ksize3)cv2.imshow(image, img)
cv2.imshow(img_lap, img_lap)cv2.waitKey(0) Laplacian算子代码效果 三、Canny算子函数 双阈值筛选原理 Canny 算子是一种多阶段的图像边缘检测算法通过计算梯度并结合非极大值抑制和双阈值处理精准地提取图像中的边缘。
1、功能
①边缘检测
检测图像中灰度值变化最显著的区域提取清晰的边缘。
②降噪和增强对比
使用高斯滤波去噪并结合梯度计算增强边缘对比。
③多阶段边缘检测
包括梯度计算、非极大值抑制、双阈值处理、边缘跟踪等能准确且高效地提取边缘。
2、参数
在 OpenCV 中cv2.Canny() 是实现 Canny 算子的函数常用参数如下
3、返回值
返回一个与输入图像尺寸相同的二值图像边缘图像。像素值为 0非边缘或 255边缘。
4、应用
Canny 算子因其高精度和多功能性被广泛应用于以下场景
①物体边缘检测
用于检测图像中物体的边界适用于形状识别、分割等任务。
②特征提取
用于提取边缘特征作为后续算法的输入例如 Hough 变换、角点检测等。
③图像增强
突出图像中的边缘部分提高关键特征的显著性。
④医学图像处理
用于精确检测器官或病灶的边缘。
5、代码示例
import cv2img cv2.imread(./card.png)
img cv2.resize(img, (img.shape[1] // 2, img.shape[0] // 2))# 灰度化
img_gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化
_, img_binary cv2.threshold(img_gray, 127, 255,cv2.THRESH_BINARY cv2.THRESH_OTSU)# 寻找轮廓
contours, hierarchy cv2.findContours(img_binary,cv2.RETR_LIST, # 查询轮廓的方式cv2.CHAIN_APPROX_SIMPLE # 保存轮廓点坐标的方式)# 绘制轮廓
img_copy img.copy()
img_draw cv2.drawContours(img_copy, # 要绘制轮廓的图像contours, # 轮廓的顶点坐标集 列表-1, # 轮廓列表的索引值-1表示绘制所有轮廓(0, 0, 255), # 颜色3 # 轮廓线条粗细)cv2.imshow(image, img)
cv2.imshow(image_draw, img_draw)
cv2.waitKey(0) Canny算子函数代码效果 四、findContours函数
cv2.findContours 是 OpenCV 中用于提取图像轮廓的函数。它在图像分割和分析中非常常用例如边界检测、形状分析等。
1、功能
①轮廓检测
在二值化图像中提取轮廓信息。
②轮廓表示
提取轮廓的点集可用于计算形状特征面积、周长等。
③图像分割
根据轮廓信息将图像划分为不同的区域。
2、参数
在 OpenCV 中cv2.findContours() 是用于提取图像轮廓的函数常用参数如下
参数名类型说明image单通道图像必选参数输入图像通常是一个二值图像即只包含黑白两种颜色的图像其中白色部分代表要检测的对象黑色部分代表背景。也可以是非二值图像但通常需要先进行某种形式的预处理如阈值分割或边缘检测。mode轮廓检索模式 可选参数某些版本中必需决定轮廓的层次结构和检索方式。 method轮廓逼近方法可选参数某些版本中必需决定轮廓点集的存储方式完整存储或压缩。 offset 轮廓点的偏移量 可选参数默认值为 (0, 0)轮廓点的偏移量。这个参数允许你在原始图像坐标系的基础上对轮廓点进行平移。
其中
①常用的 mode 参数
cv2.RETR_EXTERNAL只检索最外层轮廓。cv2.RETR_LIST检索所有轮廓但不创建任何父子关系。cv2.RETR_CCOMP检索所有轮廓并将它们组织为两层结构其中顶层是连通域的外边界底层是孔的内边界。cv2.RETR_TREE检索所有轮廓并重建完整的层次结构。
②常用的 method 参数
cv2.CHAIN_APPROX_NONE存储所有的轮廓点不进行任何近似。cv2.CHAIN_APPROX_SIMPLE压缩水平、垂直和对角线段只保留它们的终点。cv2.CHAIN_APPROX_TC89_L1、cv2.CHAIN_APPROX_TC89_KCOS应用 Teh-Chin 链式近似算法的一种变体。
3、返回值
①contours某些版本
这个参数是用来存储检测到的轮廓的。它是一个 Python 列表其中每个元素都是一个轮廓轮廓是由点组成的 NumPy 数组。
②hierarchy某些版本
轮廓的层次结构信息。这是一个 NumPy 数组包含了关于轮廓之间关系的信息例如哪个轮廓是另一个轮廓的父轮廓或子轮廓。
4、应用
①形状分析
提取轮廓用于计算面积、周长、矩形包围框等。 常用于图像中的目标检测和物体分类。
②边界检测
确定图像中各个目标的边界用于绘制轮廓或进行边界处理。
③图像分割
根据轮廓信息分割图像提取感兴趣的区域。
④嵌套关系分析
使用 hierarchy 信息分析轮廓的父子关系用于目标的层次分类。
5、代码示例
import cv2img cv2.imread(./card.png)
img cv2.resize(img, (img.shape[1] // 2, img.shape[0] // 2))# 灰度化
img_gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化
_, img_binary cv2.threshold(img_gray, 127, 255,cv2.THRESH_BINARY cv2.THRESH_OTSU)# 寻找轮廓
contours, hierarchy cv2.findContours(img_binary,cv2.RETR_LIST, # 查询轮廓的方式cv2.CHAIN_APPROX_SIMPLE # 保存轮廓点坐标的方式)img_copy img.copy()
img_draw cv2.drawContours(img_copy, contours, -1, (0, 0, 255), 3)cv2.imshow(image, img)
cv2.imshow(image_draw, img_draw)
cv2.waitKey(0) findContours函数代码效果 五、drawContours函数
OpenCV 的 cv2.drawContours 函数用于在图像上绘制轮廓常与 cv2.findContours 搭配使用。它可以绘制单个或多个轮廓还能对层次结构进行可视化。
1、功能
①轮廓绘制
在图像上绘制由 findContours 提取的轮廓。
②层次关系可视化
根据轮廓的层次关系选择性地绘制轮廓。
③调试和展示
在处理图像分割、边缘检测、物体检测等任务时用于可视化轮廓信息。
2、参数
参数名类型说明contourIdx(可选默认为 -1)int 指定要绘制的轮廓的索引。如果为 -1则绘制所有轮廓。否则只绘制指定索引处的轮廓。 thickness(可选默认为 1)int 轮廓的厚度。如果为正数则轮廓将被绘制为指定厚度的线条。如果为负数例如 -1则轮廓内部将被填充。 lineType(可选默认为 cv2.LINE_8)int 线条的类型。它决定了轮廓线条的平滑度。cv2.LINE_8 表示 8-连通线cv2.LINE_4 表示 4-连通线cv2.LINE_AA 表示抗锯齿线。 maxLevel(可选默认为 INT_MAX)int 用于控制绘制轮廓的层次深度。当 contourIdx 参数为 -1 时这个参数才有效。它决定了要绘制的轮廓的最大层次深度。 contours(必选)list 这是一个 Python 列表包含要绘制的所有轮廓。每个轮廓都是一个点集通常是由 cv2.findContours() 函数返回的 NumPy 数组。 image(必选)ndarray 这是要在其上绘制轮廓的输入图像。它应该是一个三通道图像例如彩色图像或单通道图像例如灰度图像但通常是三通道图像以便可以使用不同的颜色来绘制轮廓。 hierarchy(可选默认为 None)ndarray 轮廓的层次结构信息。这是一个 NumPy 数组通常由 cv2.findContours() 函数返回。它包含了关于轮廓之间关系的信息例如哪个轮廓是另一个轮廓的父轮廓或子轮廓。在绘制所有轮廓时这个参数通常不需要。 color(可选默认为 (0, 255, 0))tuple 轮廓的颜色。它是一个三元组表示 BGR蓝、绿、红颜色空间中的颜色。例如(0, 255, 0) 表示绿色。 offset(可选默认为 (0, 0))tuple 轮廓点的偏移量。这个参数允许你在原始图像坐标系的基础上对轮廓点进行平移。
3、返回值
无返回值。函数直接在输入图像上绘制轮廓。
4、应用
①轮廓可视化
在图像处理任务中显示 findContours 提取的轮廓信息用于调试和验证算法效果。
②形状分割
将图像中提取的目标边界可视化辅助物体分割和分析。
③层次关系分析
绘制父轮廓、子轮廓等层次结构用于嵌套目标的可视化。
④目标检测
在图像上标记物体边界显示检测结果。
5、代码示例
import cv2
import numpy as np# 读取图像并调整大小
img cv2.imread(./02.png)
img cv2.resize(img, (img.shape[1] // 2, img.shape[0] // 2))# 转为灰度图
gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化
_, img_binary cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU)# 寻找轮廓
contours, hierarchy cv2.findContours(img_binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓
img_copy img.copy()
img_draw cv2.drawContours(img_copy, # 要绘制轮廓的图像contours, # 轮廓的顶点坐标集 列表-1, # 轮廓列表的索引值-1表示绘制所有轮廓(0, 0, 255), # 颜色3 # 轮廓线条粗细)cv2.imshow(image, img)
cv2.imshow(image_draw, img_draw)
cv2.waitKey(0) drawContours函数代码效果 六、透视变换函数
透视变换是 OpenCV 提供的一种几何变换用于将图像从一种视角转换为另一种视角。OpenCV 提供了 cv2.getPerspectiveTransform 和 cv2.warpPerspective 两个函数来实现透视变换。
1、功能
①cv2.getPerspectiveTransform
根据图像的原始四个点坐标源点和目标四个点坐标目标点计算透视变换矩阵。
②cv2.warpPerspective
根据透视变换矩阵对图像进行透视变换生成新的视角图像。
透视变换通常用于以下场景
将倾斜或变形的图像矫正为平面视角。提取图像中的特定区域如卡片、文档、白板等。改变图像的视角以匹配某些特定需求。
2、参数
①cv2.getPerspectiveTransform 的参数
②cv2.warpPerspective 的参数
3、返回值
①cv2.getPerspectiveTransform
返回 3×3 的透视变换矩阵。
②cv2.warpPerspective
返回透视变换后的图像。
4、应用
①图像矫正
将倾斜的图像矫正为标准平面视角例如卡片、书本、文档等。
②ROI 提取
精确提取图像中的特定区域适用于目标检测或图像分割任务。
③视角匹配
在 AR 和 3D 应用中调整图像的视角以匹配其他图像或虚拟场景。
④增强现实
将二维图像贴合到三维场景中通过透视变换实现仿真效果。
5、代码示例
import cv2
import numpy as np# 1、 读取图像并调整大小
img cv2.imread(./card.png)
img cv2.resize(img, (img.shape[1] // 2, img.shape[0] // 2))# 2、 获取透视变换矩阵
# 原图中的四个点
points1 np.array([[100, 50], [350, 75], [70, 200], [325, 230]],dtypenp.float32)
# 目标图中的四个点
points2 np.array([[0, 0], [img.shape[1], 0], [0, img.shape[0]], [img.shape[1], img.shape[0]]],dtypenp.float32)
M cv2.getPerspectiveTransform(points1, points2)# 3、透视变换
img_warp cv2.warpPerspective(img, M, (img.shape[1], img.shape[0]))cv2.imshow(image, img)
cv2.imshow(image_warp, img_warp)
cv2.waitKey(0) 透视变换函数代码效果 七、举例轮廓的外接边界框并对比说明 在 OpenCV 中可以通过 cv2.boundingRect 和 cv2.minAreaRect 方法为轮廓生成外接边界框。两者的功能和应用有所不同
1. 外接边界框方法
①cv2.boundingRect
生成一个与轮廓外接的水平矩形。
边界框的边与坐标轴平行。简单快速但不能适应旋转的物体。
②cv2.minAreaRect
生成一个最小面积的旋转矩形。
边界框可以适应物体的方向能紧贴目标轮廓。返回矩形的中心点、宽高和旋转角度。
2. 区别对比
功能水平外接矩形 (cv2.boundingRect)最小面积旋转矩形 (cv2.minAreaRect)特点水平矩形边平行于坐标轴最小面积矩形可旋转以适应物体方向适用场景简单场景或对方向无关的分析复杂场景需要考虑方向的分析效率更高相对较低返回值矩形的左上角坐标和宽高矩形中心点坐标、宽高和旋转角度
3. 示例代码
以下代码展示如何提取和绘制水平外接矩形和最小面积旋转矩形并对比效果。
import cv2
import numpy as np# 读取图像并调整大小
img cv2.imread(./outline.png)
img cv2.resize(img, (img.shape[1] // 2, img.shape[0] // 2))# 灰度化
img_gray cv2.cvtColor(img, cv2.COLOR_BGRA2GRAY)
# 二值化
_, img_binary cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY_INVcv2.THRESH_OTSU)
# 寻找轮廓
contours, _ cv2.findContours(img_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 定义轮廓
img_draw img.copy()# 给所有轮廓都绘制 外接
for i in contours:# 第一种调用外接矩形函数获取当前轮廓点的左上角的坐标(x, y) 宽w 高hx, y, w, h cv2.boundingRect(i)# 画矩形cv2.rectangle(img_draw, [x, y], [xw, yh], (0, 255, 0), 2)# 第二种调用最小面积外接矩形函数获取包含三个元素的元组中心点坐标、长宽、旋转角度# ((center_x, center_y), (width, height), angle)ret cv2.minAreaRect(i)# 调用cv2.boxPoints(ret)可以获取旋转矩阵的四个顶点box np.int32(cv2.boxPoints(ret))# 绘制轮廓cv2.drawContours(img_draw, [box], -1, (255, 255, 0), 3)cv2.imshow(image, img)
cv2.imshow(image_draw, img_draw)
cv2.waitKey(0) 水平外接矩形和最小面积旋转矩形对比 4. 输出分析
①Bounding Rectangles水平外接矩形
每个目标轮廓都被一个绿色矩形框住。 边界框总是与坐标轴平行不能很好地适应旋转的目标。
②Min Area Rectangles最小面积旋转矩形
每个目标轮廓都被一个蓝色矩形框住。 边界框根据目标的方向自动旋转紧贴目标适合复杂场景。
5. 使用建议
①cv2.boundingRect
简单场景目标方向较一致时使用例如
检测物体大小。计算水平分布特征。
优势计算快简单易用。
②cv2.minAreaRect
目标方向不一致或需要精确边界时使用例如
目标形状分析。计算旋转目标的特征。
优势灵活精确可适应旋转物体。