1.图片的相加

2.图片的相减


3.图片溶合

dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)
核心计算公式(底层运算逻辑)
dst(x,y)=src1(x,y)×α+src2(x,y)×β+γ
输出图像每个像素 = 图 A 像素 × 权重 α + 图 B 像素 × 权重 β + 偏移常量 γ
参数逐句对应解释
- src1(A) 第一张输入图像,要求和第二张图尺寸、通道数完全一致,否则无法融合。
- alpha 图像 A 的融合权重,浮点值,控制 A 在最终画面里的透明度占比; 例:
alpha=0.6→ 原图 A 贡献 60% 亮度。 - src2(B) 第二张输入图像,尺寸、通道必须和 src1 匹配。
- beta 图像 B 的融合权重,浮点值,控制 B 画面占比; 常规搭配:
alpha + beta = 1,避免画面整体过亮 / 过暗,如alpha=0.4, beta=0.6。 - 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)
参数详解
-
src:原始输入图像
-
dsize=(width, height) 目标尺寸,格式是 (宽度 w, 高度 h)
⚠️重点易错:和
img.shape顺序相反!img.shape = (H, W, C)dsize = (W, H)本例:直接把图片强制缩放为宽 200 像素、高 200 像素正方形。 -
fx / fy (可选) 水平、垂直缩放比例; 如果
dsize=(0,0),启用比例模式:new = cv2.resize(img, (0,0), fx=0.5, fy=0.5) -
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)
参数说明
center=(w/2, h/2)旋转中心点,这里取图像中心(宽度一半, 高度一半)angle=15旋转角度(单位:度)- 正数:逆时针旋转
- 负数:顺时针旋转
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) 参数说明
- src:输入图像
- ddepth=-1 输出图像位深,填
-1代表输出图像和原图深度保持一致。 - 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)
参数说明:
src:原图ksize:卷积核尺寸 必须是奇数(3,3) (5,5) (7,7)sigmaX:X 方向高斯标准差(控制模糊强度)- 如果写 0,OpenCV 自动根据核大小计算 sigma
sigmaY:Y 方向标准差,默认 = sigmaX
13.中值滤波

、
dst = cv2.medianBlur(src, ksize)
src:输入图像ksize:核大小,必须是奇数(3,5,7...)
注意!和前面滤波不一样:这里只传一个数字,不是元组
(5,5)

14.双边滤波
dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
参数说明
src:输入图像,只支持 8 位单通道 / 三通道d:滤波窗口直径- 推荐:
d=5;如果写d=-1,程序自动根据 sigmaSpace 计算
- 推荐:
sigmaColor色彩相似度标准差 越大,颜色差异较大的像素也会参与平滑;数值越大磨皮越强sigmaSpace空间距离标准差 越大,更远的邻域像素参与运算
经验口诀:一般
sigmaColor == sigmaSpace,两者设成相同数值。
15.Sobel 索贝尔算子

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

dst = cv2.Scharr(src, ddepth, dx, dy)
参数含义和 Sobel 完全一致:
src:输入灰度图像ddepth:强烈推荐cv2.CV_64F梯度存在正负,uint8 会截断负数,丢失一半边缘dx:x 方向导数阶数,只能取 0 或 1dy:y 方向导数阶数,只能取 0 或 1
限制:
dx和dy不能同时等于 1!无法一次性同时求两个方向。
17.Laplacian拉普拉斯算子

dst = cv2.Laplacian(src, ddepth, ksize=1)
参数说明
src:输入图像ddepth:输出深度,推荐cv2.CV_64F二阶微分同样存在正负值,uint8 直接截断会丢失信息ksize:卷积核大小,取值1,3,5,7ksize=1:使用上面 4 邻域简易核ksize=3:8 邻域核
18.Canny 边缘检测

Canny 内部 4 大步骤(必背)
- 高斯模糊降噪 使用 5×5 高斯滤波,消除图像高斯噪声(噪声极易产生虚假边缘)
- 计算图像梯度(Sobel 算子) Sobel 求 \(G_x、G_y\),算出梯度幅值与梯度方向
- 非极大值抑制(NMS) 把 "粗宽边缘" 压缩成单像素细线。 在梯度方向上,仅保留局部最大值,其余像素置 0。
- 双阈值筛选 设置两个阈值:
threshold1(低)、threshold2(高)- >高阈值:确定边缘
- <低阈值:直接舍弃,不是边缘
- 介于两者之间:候选边缘,只有和确定边缘相连才保留
优势:可以有效剔除零散噪点形成的伪边缘,输出干净、纤细的轮廓。
edges = cv2.Canny(image, threshold1, threshold2, apertureSize=3, L2gradient=False)
参数说明
image:输入图像,建议传入灰度图threshold1:低阈值threshold2:高阈值 经验:高低阈值比例常用1:2 ~ 1:3apertureSize:内部 Sobel 核大小,默认 3L2gradientFalse(默认):梯度幅值 \(|G_x|+|G_y|\),速度快True:L2 范数 \(\sqrt{G_x^2+G_y^2}\),精度更高,略慢