OpenCV——进阶

1.图片的相加

2.图片的相减

3.图片溶合

复制代码
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)

核心计算公式(底层运算逻辑)

dst(x,y)=src1(x,y)×α+src2(x,y)×β+γ

输出图像每个像素 = 图 A 像素 × 权重 α + 图 B 像素 × 权重 β + 偏移常量 γ

参数逐句对应解释

  1. src1(A) 第一张输入图像,要求和第二张图尺寸、通道数完全一致,否则无法融合。
  2. alpha 图像 A 的融合权重,浮点值,控制 A 在最终画面里的透明度占比; 例:alpha=0.6 → 原图 A 贡献 60% 亮度。
  3. src2(B) 第二张输入图像,尺寸、通道必须和 src1 匹配。
  4. beta 图像 B 的融合权重,浮点值,控制 B 画面占比; 常规搭配:alpha + beta = 1,避免画面整体过亮 / 过暗,如 alpha=0.4, beta=0.6
  5. gamma(静态权重 / 亮度偏移) 全局亮度偏移常量,叠加到所有像素上:
    • gamma>0:整张图提亮
    • gamma=0:不额外增减亮度
    • gamma<0:整张图压暗

关键使用前提

两张图片宽、高、通道数量必须完全相同 ,否则直接报错; 尺寸不一致时,需要先用 cv2.resize() 缩放至统一尺寸。

4.图像的逻辑运算

表格

函数 作用
cv2.bitwise_not(src) 单张图像素按位取反(取反掩码 / 反转图像)
cv2.bitwise_and(a,b,mask) 两张图像素按位与,掩码提取前景
cv2.bitwise_or(a,b) 两张图像素按位或,合并图像
cv2.bitwise_xor(a,b) 两张图像素按位异或,提取差异区域

5.图像的缩放

dst = cv2.resize(src, dsize, fx, fy, interpolation)

参数详解

  1. src:原始输入图像

  2. dsize=(width, height) 目标尺寸,格式是 (宽度 w, 高度 h)

    ⚠️重点易错:和 img.shape 顺序相反! img.shape = (H, W, C) dsize = (W, H) 本例:直接把图片强制缩放为宽 200 像素、高 200 像素正方形。

  3. fx / fy (可选) 水平、垂直缩放比例; 如果 dsize=(0,0),启用比例模式:

    复制代码
    new = cv2.resize(img, (0,0), fx=0.5, fy=0.5)
  4. interpolation 插值算法(可选)

    表格

    插值方式 使用场景
    cv2.INTER_LINEAR(默认) 放大图像,双线性插值,效果平滑
    cv2.INTER_NEAREST 最近邻,速度最快,容易锯齿
    cv2.INTER_AREA 缩小图像优先选用
    cv2.INTER_CUBIC 放大,效果更好,速度慢

6.图像的翻转

复制代码
dst = cv2.flip(src, flipCode)
flipCode 翻转效果 通俗说明
0 沿 X 轴翻转(上下翻转) 图像垂直颠倒,上下镜像
>0(常用 1) 沿 Y 轴翻转(左右翻转) 水平镜像,自拍照片常见翻转
<0(常用 - 1) 先左右翻转,再上下翻转 旋转 180° 效果

7.图像的旋转

复制代码
dst = cv2.rotate(src, rotateCode)
常量 效果
cv2.ROTATE_90_CLOCKWISE 顺时针旋转 90°(当前代码使用)
cv2.ROTATE_180 旋转 180°
cv2.ROTATE_90_COUNTERCLOCKWISE 逆时针旋转 90°(等价顺时针 270°)

8.图像的仿射变换

复制代码
dst = cv2.warpAffine(src, M, dsize)

cv2.getRotationMatrix2D(center, angle, scale)

参数说明

  1. center=(w/2, h/2) 旋转中心点,这里取图像中心 (宽度一半, 高度一半)
  2. angle=15 旋转角度(单位:度)
    • 正数:逆时针旋转
    • 负数:顺时针旋转
  3. scale=0.2 整体缩放系数,0.2 = 缩小为原图的 20%

本例效果:图片以画面中心逆时针旋转 15°,同时缩小到原来 0.2 倍。

9.透视变换

项目 仿射变换 透视变换
求矩阵函数 getAffineTransform getPerspectiveTransform
需要匹配点 3 对点 4 对点
变换矩阵 2 行 3 列 3 行 3 列
执行函数 warpAffine warpPerspective
几何特性 平行线依旧平行,没有近大远小 平行线可以汇聚,模拟相机透视、近大远小
适用场景 旋转、平移、缩放、斜切 文档矫正、俯视转正、鸟瞰变换

10.滤波处理

cv2.filter2D(src, ddepth, kernel) 参数说明

  1. src:输入图像
  2. ddepth=-1 输出图像位深,填 -1 代表输出图像和原图深度保持一致
  3. kernel:卷积核(滤波器),二维数组

正常数学卷积不做处理,输出图会缩小; 但 OpenCV 的 filter2D 默认开启「边界填充

padding」,保证输出图像宽高和原图一模一样,所以你看不到尺寸缩小。

11.方盒滤波与均值滤波

1、基础概念

① 方盒滤波 cv2.boxFilter(src, ddepth, ksize)

卷积核公式:

\(kernel = \frac{1}{a} \begin{bmatrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix}\)

  • normalize=True(默认开启):\(a = width \times height\),各个像素求平均值 → 等价均值滤波
  • normalize=False:\(a=1\),只求和,不除以总数,像素容易溢出变白

② 均值滤波 cv2.blur(src, ksize)

本质就是:自动开启归一化的方盒滤波

复制代码
cv2.blur(img, (5,5))
# 完全等价
cv2.boxFilter(img, -1, (5,5), normalize=True)

12.高斯滤波

复制代码
dst = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY)

参数说明:

  1. src:原图
  2. ksize:卷积核尺寸 必须是奇数 (3,3) (5,5) (7,7)
  3. sigmaX:X 方向高斯标准差(控制模糊强度)
    • 如果写 0,OpenCV 自动根据核大小计算 sigma
  4. sigmaY:Y 方向标准差,默认 = sigmaX

13.中值滤波

复制代码
dst = cv2.medianBlur(src, ksize)
  • src:输入图像
  • ksize:核大小,必须是奇数(3,5,7...)

注意!和前面滤波不一样:这里只传一个数字,不是元组 (5,5)

14.双边滤波

复制代码
dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)

参数说明

  1. src:输入图像,只支持 8 位单通道 / 三通道
  2. d:滤波窗口直径
    • 推荐:d=5;如果写d=-1,程序自动根据 sigmaSpace 计算
  3. sigmaColor 色彩相似度标准差 越大,颜色差异较大的像素也会参与平滑;数值越大磨皮越强
  4. sigmaSpace 空间距离标准差 越大,更远的邻域像素参与运算

经验口诀:一般 sigmaColor == sigmaSpace,两者设成相同数值。

15.Sobel 索贝尔算子

复制代码
dst = cv2.Sobel(src, ddepth, dx, dy, ksize)

参数详解

  1. src:输入图像
  2. ddepth:输出图像深度 ⚠️重点坑:建议使用 cv2.CV_64F 梯度会产生负数(由亮→暗),uint8 会直接截断负数,丢失一部分边缘信息。
  3. dx:x 方向导数阶数,dx=1,dy=0 → Sobel X
  4. dy:y 方向导数阶数,dx=0,dy=1 → Sobel Y
  5. ksize:卷积核大小,只能取 1,3,5,7;默认 3

16.Scharr 算子

复制代码
dst = cv2.Scharr(src, ddepth, dx, dy)

参数含义和 Sobel 完全一致:

  1. src:输入灰度图像
  2. ddepth强烈推荐 cv2.CV_64F 梯度存在正负,uint8 会截断负数,丢失一半边缘
  3. dx:x 方向导数阶数,只能取 0 或 1
  4. dy:y 方向导数阶数,只能取 0 或 1

限制:dxdy 不能同时等于 1!无法一次性同时求两个方向。

17.Laplacian拉普拉斯算子

复制代码
dst = cv2.Laplacian(src, ddepth, ksize=1)

参数说明

  1. src:输入图像
  2. ddepth:输出深度,推荐 cv2.CV_64F 二阶微分同样存在正负值,uint8 直接截断会丢失信息
  3. ksize:卷积核大小,取值 1,3,5,7
    • ksize=1:使用上面 4 邻域简易核
    • ksize=3:8 邻域核

18.Canny 边缘检测

Canny 内部 4 大步骤(必背)

  1. 高斯模糊降噪 使用 5×5 高斯滤波,消除图像高斯噪声(噪声极易产生虚假边缘)
  2. 计算图像梯度(Sobel 算子) Sobel 求 \(G_x、G_y\),算出梯度幅值与梯度方向
  3. 非极大值抑制(NMS) 把 "粗宽边缘" 压缩成单像素细线。 在梯度方向上,仅保留局部最大值,其余像素置 0。
  4. 双阈值筛选 设置两个阈值:threshold1(低)、threshold2(高)
    • >高阈值:确定边缘
    • <低阈值:直接舍弃,不是边缘
    • 介于两者之间:候选边缘,只有和确定边缘相连才保留

优势:可以有效剔除零散噪点形成的伪边缘,输出干净、纤细的轮廓。

复制代码
edges = cv2.Canny(image, threshold1, threshold2, apertureSize=3, L2gradient=False)

参数说明

  1. image:输入图像,建议传入灰度图
  2. threshold1:低阈值
  3. threshold2:高阈值 经验:高低阈值比例常用 1:2 ~ 1:3
  4. apertureSize:内部 Sobel 核大小,默认 3
  5. L2gradient
    • False(默认):梯度幅值 \(|G_x|+|G_y|\),速度快
    • True:L2 范数 \(\sqrt{G_x^2+G_y^2}\),精度更高,略慢
相关推荐
蓝速科技1 小时前
蓝速 AI 双屏翻译机酒店涉外接待部署指南
人工智能
q567315231 小时前
人工智能训练数据采集:稳定代理IP高并发方案全解析
人工智能·爬虫·网络协议·tcp/ip·代理模式·代理ip
太原geo小侦探1 小时前
2026门店AI流量实测测评:同为实体门店,AI问答曝光差距在哪?
大数据·人工智能·生活·流量运营·内容运营
大鹏的NLP博客1 小时前
机器学习中的统计波动控制与表征几何优化原则:从函数稳定性到隐空间结构学习
人工智能·深度学习·机器学习
AI大法师1 小时前
一个机场如何被做成 IP 场景:宝可梦机场的设计方法总结
大数据·人工智能·设计模式·新媒体运营
yangshicong1 小时前
第19章:AI安全防护与AI安全
人工智能·python·安全·prompt·ai编程
c_lb72882 小时前
2026年不同基础做量化,先找AI能参与的位置
人工智能·python
颜酱2 小时前
06 | 把 meta_config 同步进 MySQL(生成阶段)
前端·人工智能·后端