OpenCV篇:0基础带你入门python之算子与绘图篇

① 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_EXTERNALcv2.RETR_TREE)。
  • method:近似方法(如 cv2.CHAIN_APPROX_SIMPLEcv2.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)

功能
用于将图像从一种透视投影映射到另一种透视投影,实现图像校正和变形。

步骤和参数

  1. 获取透视变换矩阵

    • 使用 cv2.getPerspectiveTransform,输入原始图像中的四个点和目标图像中的四个点,计算变换矩阵。
    • 参数:
      • src:原图的四个点坐标。
      • dst:目标图的四个点坐标。
    • 返回值:3×3变换矩阵。
  2. 应用透视变换

    • 使用 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()

应用

  • 图像校正(如文档拍摄图纠正)。
  • 提取特定区域进行分析(如桌面上的卡片)。

⑦ 外接边界框的举例与对比说明

举例

给定一个轮廓,使用以下两种方法生成外接矩形:

  1. 最小外接矩形 (cv2.minAreaRect):返回任意角度的最小矩形。
    rect = cv2.minAreaRect(contour)
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    cv2.drawContours(image, [box], 0, (0, 255, 0), 2)
    
  2. 水平外接矩形 (cv2.boundingRect):返回轴对齐的矩形。
    x, y, w, h = cv2.boundingRect(contour)
    cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)
    
对比说明
  • 最小外接矩形
    能够精确描述任意角度的轮廓形状,但计算复杂度较高。
  • 水平外接矩形
    只考虑水平和垂直方向,速度快,但可能浪费较多空间(不适合倾斜物体)。

应用场景

  • 最小外接矩形:适用于复杂形状(如倾斜的物体)。
  • 水平外接矩形:适用于快速目标定位(如目标区域的检测)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值