OpenCV API

目录

OpenCV API

OpenCV (cv2) 核心功能 API 一览表(传统 CV 基础篇)

以下列表涵盖了图像处理、滤波、特征提取和形态学等基础模块中常用的函数。

Ⅰ. 图像 I/O 与基本操作 (Core Functionality)

功能模块 API 函数 关键参数与用途
图像加载/保存 cv2.imread(filename, flags) 加载图像。 flags 常用于指定色彩空间:cv2.IMREAD_GRAYSCALE (灰度)、cv2.IMREAD_COLOR (彩色)。
cv2.imwrite(filename, img) 保存图像。
颜色空间转换 cv2.cvtColor(src, code) 转换图像的颜色空间。 code 示例:cv2.COLOR_BGR2GRAY (最常用)。
图像显示 cv2.imshow(winname, img) 显示图像。
cv2.waitKey(delay) 等待按键。 必须配合 imshow 使用,delay=0 表示无限等待。
cv2.destroyAllWindows() 关闭所有窗口。
图像大小调整 cv2.resize(src, dsize, ...) 调整图像大小。 dsize 为新的 (宽度, 高度) 元组。

Ⅱ. 图像滤波与平滑 (Filtering)

功能模块 API 函数 关键参数与用途 理论对应
高斯滤波 cv2.GaussianBlur(src, ksize, sigmaX) 去除高斯噪声。 ksize 为 (宽, 高) 核大小(奇数),sigmaX 为 X 方向标准差。 线性低通滤波
中值滤波 cv2.medianBlur(src, ksize) 去除椒盐噪声。 ksize 为核大小(奇数)。 非线性滤波
均值滤波 cv2.blur(src, ksize) 简单平均滤波。 ksize 为核大小。 线性低通滤波
双边滤波 cv2.bilateralFilter(...) 保留边缘的平滑。 考虑空间距离和像素值相似度。 高级非线性滤波
直方图均衡化 cv2.equalizeHist(src) 对灰度图像的直方图进行均衡化,以自动提高图像的对比度。 直方图均衡化

Ⅲ. 图像梯度与边缘检测 (Gradients & Edges)

功能模块 API 函数 关键参数与用途 理论对应
Sobel 算子 cv2.Sobel(src, ddepth, dx, dy, ...) 计算一阶导数(梯度)。 dxdy 设为 1。ddepth 常用于防止溢出(如 cv2.CV_64F)。 微分操作
Scharr 算子 cv2.Scharr(src, ddepth, dx, dy) Sobel 的升级版。 在某些情况下更精确。 微分操作
Laplacian 算子 cv2.Laplacian(src, ddepth, ...) 计算二阶导数。 常用于边缘锐化。 二阶微分操作
Canny 检测器 cv2.Canny(image, threshold1, threshold2) 最优边缘检测。 threshold1threshold2 为低、高阈值。 Canny 算法

Ⅳ. 图像阈值与形态学处理 (Thresholding & Morphology)

功能模块 API 函数 关键参数与用途 理论对应
简单阈值 cv2.threshold(src, thresh, maxval, type) 固定阈值二值化。 type 指定阈值类型(如 cv2.THRESH_BINARY)。 点运算/分割
自适应阈值 cv2.adaptiveThreshold(...) 局部自适应阈值。 用于光照不均的图像分割。 区域分割
结构元素 cv2.getStructuringElement(shape, ksize) 创建形态学核。 shape 可选矩形、椭圆、交叉等。 形态学基础
腐蚀 cv2.erode(src, kernel, iterations) 收缩前景物体。 iterations 为重复次数。 形态学操作
膨胀 cv2.dilate(src, kernel, iterations) 扩张前景物体。 形态学操作
形态学操作 cv2.morphologyEx(src, op, kernel) 执行高级操作。 op 可选 cv2.MORPH_OPEN (开运算) 或 cv2.MORPH_CLOSE (闭运算)。 礼帽/黑帽/开闭运算

Ⅴ. 特征点检测与描述 (Feature Detection)

功能模块 API 函数 关键参数与用途 理论对应
Harris 角点 cv2.cornerHarris(src, blockSize, ksize, k) 计算 Harris 响应值 R。 局部梯度分析
Shi-Tomasi 角点 cv2.goodFeaturesToTrack(...) Harris 的改进版。 直接返回最佳角点坐标。 局部梯度分析
ORB 特征 cv2.ORB_create() 创建 ORB 检测器。 适用于速度要求高的嵌入式平台。 快速特征提取
SIFT 特征 cv2.SIFT_create() 创建 SIFT 检测器。 高精度、高鲁棒性(在某些版本中可能需要单独安装 opencv-contrib-python)。 尺度和旋转不变性

补充

函数作用 签名 参数要点 注意事项
颜色空间转换 cv2.cvtColor(src, code) codeCOLOR_BGR2GRAYCOLOR_BGR2HSV 转换代码须与输入通道匹配
全局直方图均衡化(灰度) cv2.equalizeHist(src) src:8-bit 单通道 仅适用于灰度图;彩色图先分离亮度通道
创建 CLAHE(自适应均衡化) cv2.createCLAHE(clipLimit=40.0, tileGridSize=(8,8)) clipLimit:对比度限制;tileGridSize:局部网格;返回:CLANE对象; 参数影响局部对比与噪声放大
应用 CLAHE clahe.apply(src) src:8-bit 单通道; 返回img对象; equalizeHist 相似但局部自适应
计算直方图 cv2.calcHist(images, channels, mask, histSize, ranges[, accumulate]) images 必为列表(如 [img]);channels,histSize,ranges 为列表;mask 可选 uint8 mask 与图像尺寸匹配;ranges 为半开区间
归一化 / 缩放 cv2.normalize(src, dst, alpha, beta, norm_type=cv2.NORM_MINMAX) alpha,beta 目标范围或尺度;norm_type 类型 常用于直方图或数值缩放
线性变换并转 uint8 cv2.convertScaleAbs(src, alpha=1, beta=0) alpha:比例(对比度);beta:偏移(亮度) 执行 src*alpha+beta 后取绝对并饱和截断
线性混合 / 融合 cv2.addWeighted(src1, alpha, src2, beta, gamma) alpha,beta 系数;gamma 标量 结果为饱和截断,常用于融合或对比度调整
元素级饱和相加 cv2.add(src1, src2, dst=None, mask=None, dtype=None) 安全饱和相加 与 NumPy + 不同(无模回绕)
高斯模糊 cv2.GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=0, borderType=...) ksize 正奇数对或 (0,0)sigmaX/Y 标准差 ksize 必须为正奇数(否则断言错误);(0,0) 时根据 sigma 自动计算
中值滤波 cv2.medianBlur(src, ksize) ksize:正奇数(≥3) 对椒盐噪声效果好;ksize 必须为奇数
查表变换 cv2.LUT(src, lut) lut:长度 256 的 uint8 查找表 高效实现伽马/任意映射;lut dtype 通常为 uint8
裁剪数组到指定范围(NumPy) np.clip(a, a_min, a_max, out=None) a_min/a_max 标量或数组 常用于将像素值限定在 [0,255] 后再转 uint8
计算范数 cv2.magnitude(x, y) 计算sqrt(x^2 + y^2) 用于Sobel算子计算梯度幅值

常用功能

I. 噪声生成

高斯噪声

高斯噪声是每个像素独立加上服从正态分布 N(mean, sigma^2) 的随机值。关键注意点是先把图像转为浮点数相加、结果要截断到有效范围并转回 uint8(或保持 [0,1] 浮点范围)。

np.random.normal 用于从正态(高斯)分布抽样。

要点: - 函数签名:np.random.normal(loc=0.0, scale=1.0, size=None) - loc:均值 μ(默认 0) - scale:标准差 σ(>0,默认 1)。注意:方差 = σ² - size:输出形状(None → 返回单个标量,tuple → 返回对应形状的数组) - 返回:浮点数组(通常是 float64);如果 size=None 返回一个标量浮点数。 - 可重复性:用 np.random.seed(123) 固定旧全局生成器,或推荐使用新 API: - rng = np.random.default_rng(123); rng.normal(loc, scale, size)

示例(生成与图像同形状的高斯噪声并添加):

import numpy as np

# 旧 API(全局)
noise = np.random.normal(0, 25, img.shape)  # img.shape 例如 (H, W, 3)

# 新 API(推荐,线程安全且更可控)
rng = np.random.default_rng(42)
noise = rng.normal(0, 25, size=img.shape)

使用注意: - 噪声是浮点数,给 uint8 的图像加噪前把图像转为 float(避免溢出),加完后 np.clip(..., 0, 255).astype(np.uint8)。 - 若想让噪声强度与像素比率无关,可对图像归一化到 [0,1],并相应调整 scale(例如 σ=0.05)。 - 大样本下样本均值≈loc,样本方差≈scale**2

使用代码

原理: - 像素新值 = 原值 + N(μ, σ^2) - μ(mean)通常取 0;σ(sigma)控制噪声强度(uint8 下常用 10–30,归一化浮点图像下用 0.01–0.1)

代码示例(numpy + OpenCV):

import cv2
import numpy as np

def add_gaussian_noise(img, mean=0, sigma=10):
    # img: numpy array, 灰度或彩色(uint8 或 float)
    if img.dtype == np.uint8:
        img_f = img.astype(np.float32)
        gauss = np.random.normal(mean, sigma, img.shape).astype(np.float32)
        noisy = img_f + gauss
        noisy = np.clip(noisy, 0, 255).astype(np.uint8)
    else:
        # 假设 float 图像范围在 [0,1]
        img_f = img.astype(np.float32)
        gauss = np.random.normal(mean, sigma, img.shape).astype(np.float32)
        noisy = img_f + gauss
        noisy = np.clip(noisy, 0.0, 1.0).astype(img.dtype)
    return noisy

# 用法
img = cv2.imread("image.jpg")          # BGR, uint8
noisy = add_gaussian_noise(img, 0, 25)
cv2.imwrite("noisy.jpg", noisy)

若用 skimage(更简短、自动归一化):

from skimage.util import random_noise
noisy = (random_noise(img, mode='gaussian', mean=0, var=(sigma/255.0)**2) * 255).astype(np.uint8)

额外注意: - 一定要区别“高斯噪声(像素加随机值)”与“高斯模糊(低通滤波)”两个不同操作。 - 如需可重复结果,先调用 np.random.seed(…) 固定随机数种子。 - 若想控制信噪比(SNR),可通过计算噪声方差与图像信号方差来设置 σ。

椒盐噪声

原理(简短):

  • 椒盐噪声:随机把部分像素设为 0(pepper)或最大值 255(salt)。
  • 参数说明:amount(总像素比例,0–1),salt_vs_pepper(盐占比,0–1),seed(可重复性)。

integers 是 NumPy 新随机生成器 Generator 的方法,用来从指定整数区间采样整数数组(推荐代替旧的 np.random.randint)。

要点:

  • 签名(常用形式):rng.integers(low, high=None, size=None, dtype=np.int64, endpoint=False)
    • low:下界(包含)。
    • high:上界(默认 None 表示采样范围为 [0, low);若指定则区间为 [low, high),当 endpoint=True 时变为 [low, high])。
    • size:输出形状(整数或元组);None 返回单个标量。
    • dtype:返回整型类型(默认 np.int64)。
    • endpoint:是否包含上界(默认为 False,不包含上界)。
  • 返回:NumPy 整数数组或标量,常用于索引或生成随机坐标。
  • 可重复性:配合 rng = np.random.default_rng(seed) 使用可复现结果。

实现

import numpy as np

def add_salt_pepper_noise(img, amount=0.05, salt_vs_pepper=0.5, seed=None):
    """
    img: uint8 灰度 (H,W) 或 彩色 (H,W,C)
    amount: 总替换比例,例如 0.05 表示 5% 像素被替换
    salt_vs_pepper: 在替换像素中盐(255)占比
    seed: 随机种子(可选)
    """
    rng = np.random.default_rng(seed)
    out = img.copy()
    h, w = img.shape[:2]
    total = h * w
    num_salt = int(np.ceil(amount * total * salt_vs_pepper))
    num_pepper = int(np.ceil(amount * total * (1.0 - salt_vs_pepper)))

    # 盐
    ys = rng.integers(0, h, num_salt)
    xs = rng.integers(0, w, num_salt)
    if img.ndim == 2:
        out[ys, xs] = 255
    else:
        out[ys, xs, :] = 255

    # 胡椒
    ys = rng.integers(0, h, num_pepper)
    xs = rng.integers(0, w, num_pepper)
    if img.ndim == 2:
        out[ys, xs] = 0
    else:
        out[ys, xs, :] = 0

    return out

补充:若你也想修正高斯噪声生成(避免把噪声直接 cast 为 uint8 导致错误),用下面的方式:

sigma = 25
noise = np.random.normal(0, sigma, gray_img.shape).astype(np.float32)
noisy_gauss = np.clip(gray_img.astype(np.float32) + noise, 0, 255).astype(np.uint8)

亮度/对比度调整

先概览可用方法(按常用性与用途): - 基本亮度/对比度:cv2.convertScaleAbs / cv2.addWeighted
- 伽马校正(非线性亮度调整):cv2.LUT + 查表法
- 直方图均衡化 / 自适应直方图(增强对比度):cv2.equalizeHist / cv2.createCLAHE
- 归一化 / 拉伸对比度:cv2.normalize 或手动线性变换(float → clip → uint8)

示例代码(常用):

1) 线性亮度/对比度(推荐)

# new = alpha * img + beta
out = cv2.convertScaleAbs(img, alpha=1.2, beta=30)   # alpha 控制对比度, beta 控制亮度
# 等价写法
out2 = cv2.addWeighted(img, 1.2, img, 0, 30)

2) 伽马校正(改变中间亮部而非线性)

gamma = 0.8  # <1 更亮, >1 更暗
inv = 1.0 / gamma
table = (np.arange(256) / 255.0) ** inv * 255
table = np.clip(table, 0, 255).astype('uint8')
out = cv2.LUT(img, table)

3) 直方图均衡化(灰度图提高全局对比)

gray_eq = cv2.equalizeHist(gray_img)         # 灰度图
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
gray_clahe = clahe.apply(gray_img)

4) 彩色图建议(调整亮度在 V 通道)

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV).astype(np.float32)
hsv[...,2] = np.clip(hsv[...,2] * 1.1 + 10, 0, 255)
out = cv2.cvtColor(hsv.astype(np.uint8), cv2.COLOR_HSV2BGR)

参数提示(经验值): - alpha(对比度):1.0(无变化)到 2~3(显著增强)
- beta(亮度):-100 到 +100(视场景)
- gamma:0.4–2.5(<1 增亮,>1 变暗)
- CLAHE clipLimit:1.5–3.0,tileGridSize 常用 (8,8)

小贴士: - 对于 convertScaleAbs,输入 uint8 可直接用;若需要更精细控制先转 float,变换后 clip 并转回 uint8。
- 彩色图最好在亮度通道(HSV V 或 LAB L)上处理,避免破坏色彩饱和度。