① Sobel 算子 (cv2.Sobel
)
功能:
用于计算图像的梯度,通过卷积操作提取边缘和方向信息,尤其是水平方向和垂直方向上的变化。
参数:
src
:输入图像(通常是灰度图像)。ddepth
:输出图像的深度(如cv2.CV_64F
)。dx
:x方向导数的阶数(如1表示一阶)。dy
:y方向导数的阶数(如1表示一阶)。ksize
:Sobel核大小(必须为1、3、5、7之一)。
代码:
import cv2
import numpy as np
# 读取灰度图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# Sobel 算子计算梯度
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3) # x方向梯度
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3) # y方向梯度
# 转换为可显示图像
sobel_x = cv2.convertScaleAbs(sobel_x)
sobel_y = cv2.convertScaleAbs(sobel_y)
# 合并梯度
sobel_combined = cv2.addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0)
cv2.imshow('Sobel X', sobel_x)
cv2.imshow('Sobel Y', sobel_y)
cv2.imshow('Sobel Combined', sobel_combined)
cv2.waitKey(0)
cv2.destroyAllWindows()
返回值:
返回处理后的图像,表示指定方向上的梯度图。
应用:
- 边缘检测。
- 图像增强,提取特定方向的纹理信息。
② Laplacian 算子 (cv2.Laplacian
)
功能:
计算图像的二阶导数,检测图像中的边缘区域,具有增强细节的效果。
参数:
src
:输入图像(通常是灰度图像)。ddepth
:输出图像的深度(如cv2.CV_64F
)。ksize
:可选参数,核大小(默认为1,通常较小)。
代码:
# Laplacian 算子
laplacian = cv2.Laplacian(image, cv2.CV_64F, ksize=3)
laplacian = cv2.convertScaleAbs(laplacian)
cv2.imshow('Laplacian', laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()
返回值:
处理后的图像,表示图像中二阶导数的结果,突出边缘区域。
应用:
- 更敏感地检测细节和边缘。
- 提取图像纹理和轮廓。
③ Canny 算子 (cv2.Canny
)
功能:
经典的边缘检测算法,采用多级边缘检测,结合高斯滤波、梯度计算和双阈值处理实现精确边缘提取。
参数:
image
:输入图像(通常为灰度图)。threshold1
:低阈值,用于边缘连接。threshold2
:高阈值,用于强边缘检测。apertureSize
:Sobel算子的核大小(默认为3)。L2gradient
:布尔值,是否采用更精确的L2范数计算梯度(默认为False)。
代码:
# Canny 边缘检测
edges = cv2.Canny(image, threshold1=100, threshold2=200)
cv2.imshow('Canny Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
返回值:
二值图像,其中白色像素表示检测到的边缘。
应用:
- 精确提取边缘,用于物体识别、分割等任务。
- 与Hough变换结合进行直线、圆形检测。
④ cv2.findContours
功能:
提取图像中的轮廓,通过寻找边界点描述形状。
参数:
image
:输入的二值图像(如Canny输出)。mode
:轮廓检索模式(如cv2.RETR_EXTERNAL
、cv2.RETR_TREE
)。method
:近似方法(如cv2.CHAIN_APPROX_SIMPLE
、cv2.CHAIN_APPROX_NONE
)。
代码:
# 读取二值图像
binary_image = cv2.Canny(image, 100, 200)
# 查找轮廓
contours, hierarchy = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
返回值:
contours
:一个Python列表,包含每个轮廓的点集。hierarchy
:层次结构信息(如果模式使用了层次关系)。
应用:
- 提取物体的形状特征。
- 物体分割和形状分析。
⑤ cv2.drawContours
功能:
在图像上绘制轮廓。
参数:
image
:目标图像,用于绘制。contours
:轮廓列表(findContours
的输出)。contourIdx
:指定要绘制的轮廓索引(-1表示绘制所有轮廓)。color
:轮廓颜色(如(0,255,0)
)。thickness
:轮廓线的粗细(-1表示填充轮廓)。
代码:
# 读取二值图像
binary_image = cv2.Canny(image, 100, 200)
# 查找轮廓
contours, hierarchy = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
output_image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)
cv2.drawContours(output_image, contours, -1, (0, 255, 0), 2)
cv2.imshow('Contours', output_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
返回值:
返回绘制了轮廓的图像。
应用:
- 形状可视化。
- 在调试过程中标注和验证检测结果。
⑥ 透视变换 (cv2.getPerspectiveTransform
+ cv2.warpPerspective
)
功能:
用于将图像从一种透视投影映射到另一种透视投影,实现图像校正和变形。
步骤和参数:
-
获取透视变换矩阵:
- 使用
cv2.getPerspectiveTransform
,输入原始图像中的四个点和目标图像中的四个点,计算变换矩阵。 - 参数:
src
:原图的四个点坐标。dst
:目标图的四个点坐标。
- 返回值:3×3变换矩阵。
- 使用
-
应用透视变换:
- 使用
cv2.warpPerspective
实现变换。 - 参数:
src
:输入图像。M
:透视变换矩阵。dsize
:输出图像尺寸。
- 返回值:透视变换后的图像。
- 使用
代码:
# 输入图像
src_image = cv2.imread('document.jpg')
# 定义原始点和目标点
src_points = np.float32([[100, 200], [400, 200], [100, 500], [400, 500]])
dst_points = np.float32([[0, 0], [300, 0], [0, 400], [300, 400]])
# 获取透视变换矩阵
M = cv2.getPerspectiveTransform(src_points, dst_points)
# 应用透视变换
output_image = cv2.warpPerspective(src_image, M, (300, 400))
cv2.imshow('Original Image', src_image)
cv2.imshow('Warped Image', output_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
应用:
- 图像校正(如文档拍摄图纠正)。
- 提取特定区域进行分析(如桌面上的卡片)。
⑦ 外接边界框的举例与对比说明
举例
给定一个轮廓,使用以下两种方法生成外接矩形:
- 最小外接矩形 (
cv2.minAreaRect
):返回任意角度的最小矩形。rect = cv2.minAreaRect(contour) box = cv2.boxPoints(rect) box = np.int0(box) cv2.drawContours(image, [box], 0, (0, 255, 0), 2)
- 水平外接矩形 (
cv2.boundingRect
):返回轴对齐的矩形。x, y, w, h = cv2.boundingRect(contour) cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)
对比说明
- 最小外接矩形:
能够精确描述任意角度的轮廓形状,但计算复杂度较高。 - 水平外接矩形:
只考虑水平和垂直方向,速度快,但可能浪费较多空间(不适合倾斜物体)。
应用场景:
- 最小外接矩形:适用于复杂形状(如倾斜的物体)。
- 水平外接矩形:适用于快速目标定位(如目标区域的检测)。