导读本教程将系统梳理 OpenCV 图像处理的核心知识点并通过两个完整的实战项目——图像融合与噪声去除——来巩固所学。我们将基于 Python OpenCV 环境涵盖图像读取、几何变换、颜色空间、视频捕获、图像融合、噪声生成、滤波降噪等关键内容每个知识点均配有 API 说明、参数详解与可运行的代码示例。一、OpenCV 概述与环境准备1.1 OpenCV 简介OpenCVOpen Source Computer Vision Library是一个开源的跨平台计算机视觉库由 Intel 发起支持 Windows、Linux、Android、macOS 等操作系统提供 C、Python、Java 等多语言接口。它包含 2500 多个 个优化算法涵盖图像处理、视频分析、物体检测、机器学习、相机标定、3D 重建等众多领域。1.2 Python 环境安装在 Python 中使用 OpenCV 需安装opencv-python包pipinstallopencv-python# 核心模块pipinstallopencv-contrib-python# 含额外模块推荐pipinstallnumpy# 数组运算依赖本教程代码均需先执行import cv2与import numpy as np。1.3 核心模块速览模块说明常见用途core核心数据结构与基础运算Mat 数组、加法、位运算imgproc图像处理滤波、几何变换、颜色空间、阈值videoio / highgui视频读写与图形界面摄像头捕获、窗口显示imgcodecs图像编解码imread / imwritefeatures2d特征检测与描述角点、SIFT、ORBdnn深度学习推理加载预训练模型做检测分类二、图像的读取、显示与保存2.1 读取图像cv2.imread语法retval cv2.imread(filename[, flags])返回值读取成功返回 NumPy 数组BGR 通道顺序文件不存在或路径错误时返回None。flags 读取标志详解标志数值说明cv2.IMREAD_COLOR1彩色加载默认忽略 alpha 通道3 通道 BGRcv2.IMREAD_GRAYSCALE0灰度加载单通道cv2.IMREAD_UNCHANGED-1包含 alpha 通道的原始加载cv2.IMREAD_REDUCED_COLOR_217彩色加载并缩为 1/2 大小cv2.IMREAD_REDUCED_GRAYSCALE_432灰度加载并缩为 1/4 大小注意OpenCV 读取的图像通道顺序为BGR蓝、绿、红而非 RGB在与 Matplotlib、PIL 交互时需用cv2.cvtColor转换。2.2 显示图像cv2.imshow语法cv2.imshow(winname, mat)winname窗口名称字符串同名窗口只创建一次。mat要显示的图像数组NumPy ndarray。2.3 等待按键cv2.waitKey语法retval cv2.waitKey([delay])delay等待按键的毫秒数。0表示无限等待直到有按键正数表示等待指定毫秒。返回值按下键的 ASCII 码超时无按键返回-1。代码中两种典型用法# 用法一阻塞显示单张图片按任意键关闭cv2.waitKey(0)# 用法二视频循环中非阻塞刷新每 1ms 检测一次按键keycv2.waitKey(1)0xFFifkey27:# 27 ESC 键 ASCII 码break 0xFF的作用waitKey在某些系统返回 32 位整数与0xFF按位与可截取低 8 位保证跨平台获取正确的 ASCII 码。2.4 关闭窗口cv2.destroyAllWindowscv2.destroyAllWindows()销毁所有由 OpenCV 创建的窗口释放资源。若只需关闭指定窗口可用cv2.destroyWindow(winname)。2.5 保存图像cv2.imwrite语法retval cv2.imwrite(filename, img[, params])将图像保存到文件返回布尔值表示是否成功。params可指定压缩质量等参数。cv2.imwrite(output.jpg,img)# 默认质量cv2.imwrite(output.jpg,img,[cv2.IMWRITE_JPEG_QUALITY,95])# JPEG 质量 0-100cv2.imwrite(output.png,img,[cv2.IMWRITE_PNG_COMPRESSION,3])# PNG 压缩级 0-9三、图像几何变换 — 缩放3.1cv2.resize详解语法dst cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])参数类型说明srcndarray输入图像dsizetuple (w, h)目标尺寸设为None时由fx/fy计算fxfloat水平缩放比例fyfloat垂直缩放比例interpolationint插值方法见下表注意dsize的顺序是(width, height)而 NumPy 数组的shape是(height, width, channels)二者顺序相反极易混淆使用时需特别注意。# 方式一指定目标尺寸宽, 高imgcv2.resize(img,(640,480))# 方式二按比例缩放dsize 设 Noneimgcv2.resize(img,None,fx0.5,fy0.5)# 缩小一半# 方式三等比缩放只指定宽h,wimg.shape[:2]new_w640new_hint(h*new_w/w)imgcv2.resize(img,(new_w,new_h))3.2 插值方法对比缩放本质上是像素的重采样不同插值方法在速度与质量间取舍插值方法标志适用场景特点最近邻插值cv2.INTER_NEAREST像素风格图、速度优先最快但放大后锯齿明显双线性插值cv2.INTER_LINEAR通用默认放大缩小均可用质量与速度均衡resize默认方法双三次插值cv2.INTER_CUBIC高质量放大更平滑速度较慢Lanczos 插值cv2.INTER_LANCZOS4高质量缩放质量最高速度最慢区域插值cv2.INTER_AREA图像缩小降采样缩小首选可避免摩尔纹选择策略缩小图像推荐INTER_AREA放大图像推荐INTER_CUBIC或INTER_LANCZOS4。四、颜色空间转换4.1cv2.cvtColor详解语法dst cv2.cvtColor(src, code[, dstCn])src输入图像。code颜色空间转换标志码。dstCn输出通道数默认自动推断。4.2 常见颜色空间颜色空间通道含义典型用途BGR蓝、绿、红OpenCV 默认OpenCV 读取与显示的默认格式GRAY单通道灰度边缘检测、人脸检测预处理RGB红、绿、蓝Matplotlib 显示、PIL 交互HSV色相 H、饱和度 S、明度 V颜色分割、追踪特定颜色物体HLS色相 H、亮度 L、饱和度 S图像增强、亮度调整YCrCb亮度 Y、红/蓝色差 Cr/Cb肤色检测、视频压缩LAB亮度 L、a绿红、b蓝黄感知均匀、色彩差异计算4.3 常用转换标志转换标志说明cv2.COLOR_BGR2GRAYBGR 转灰度加权0.299R0.587G0.114Bcv2.COLOR_GRAY2BGR灰度转 BGR三通道值相同仍为灰色cv2.COLOR_BGR2RGBBGR 转 RGB交换 R/B 通道cv2.COLOR_BGR2HSVBGR 转 HSVcv2.COLOR_HSV2BGRHSV 转 BGRcv2.COLOR_BGR2YCrCbBGR 转 YCrCb灰度转换公式Gray 0.299*R 0.587*G 0.114*B该权重源于人眼对绿色最敏感的视觉特性。五、视频与摄像头捕获5.1cv2.VideoCaptureVideoCapture是 OpenCV 用于视频捕获的类可打开摄像头、视频文件或网络视频流。# 打开默认摄像头索引 0capcv2.VideoCapture(0)# 打开第二个摄像头capcv2.VideoCapture(1)# 打开视频文件capcv2.VideoCapture(test.avi)# 打开网络流RTSP/HTTPcapcv2.VideoCapture(rtsp://192.168.1.100:554/stream)5.2 读取帧cap.read()语法ret, frame cap.read()ret布尔值True表示成功读取一帧False表示读取失败或视频结束。frame当前帧图像NumPy 数组BGR 格式。视频本质上是连续的图像帧序列循环调用read()即可逐帧处理。5.3 获取与设置属性cap.get/cap.set属性标志说明宽度cv2.CAP_PROP_FRAME_WIDTH帧宽度像素高度cv2.CAP_PROP_FRAME_HEIGHT帧高度像素帧率cv2.CAP_PROP_FPS每秒帧数总帧数cv2.CAP_PROP_FRAME_COUNT视频总帧数亮度cv2.CAP_PROP_BRIGHTNESS摄像头亮度仅摄像头对比度cv2.CAP_PROP_CONTRAST摄像头对比度# 获取帧率与总帧数fpscap.get(cv2.CAP_PROP_FPS)totalcap.get(cv2.CAP_PROP_FRAME_COUNT)# 设置摄像头分辨率cap.set(cv2.CAP_PROP_FRAME_WIDTH,1280)cap.set(cv2.CAP_PROP_FRAME_HEIGHT,720)5.4 释放资源cap.release()使用完毕后必须调用cap.release()释放摄像头或视频文件资源否则设备将一直被占用导致其他程序无法访问。完整的视频处理标准流程VideoCapture打开 → 循环read()→ 处理帧 →imshow显示 →waitKey控制刷新 →release()释放 →destroyAllWindows()关闭窗口。六、图像融合技术6.1 加权融合cv2.addWeighted这是实战项目一的核心 API将两幅图像按权重线性叠加。语法dst cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst])融合公式dst src1 * alpha src2 * beta gamma参数说明src1第一幅输入图像alpha第一幅图像的权重0~1src2第二幅输入图像beta第二幅图像的权重0~1gamma加到总和上的标量亮度偏移通常为 0注意两幅图像的尺寸和数据类型必须完全一致否则会报错。# alpha0.5, beta0.5, gamma0 → 各占 50% 透明度color_mergecv2.addWeighted(frame,0.5,bg_img,0.5,0)# 调整权重实现不同透明度效果mergecv2.addWeighted(frame,0.7,bg_img,0.3,0)# 摄像头占 70%# 加入亮度偏移mergecv2.addWeighted(frame,0.5,bg_img,0.5,30)# 整体提亮 306.2 其他图像运算方式6.2.1 饱和加法cv2.add对应像素相加超过 255 则截断为 255饱和运算不会溢出回绕即不会发生环绕。# 像素值 200 100 300 → 截断为 255dstcv2.add(img1,img2)6.2.2 NumPy 加法取模直接用运算符超过 255 取模256 环绕为 0可能导致颜色翻转。# 像素值 200 100 300 % 256 44颜色突变dstimg1img2# NumPy 加法6.2.3 图像减法cv2.subtract对应像素相减小于 0 则截断为 0饱和运算。dstcv2.subtract(img1,img2)# 饱和减法负值截为 0dstimg1-img2# NumPy 减法负值取模回绕6.2.4 位运算融合cv2.bitwise_*通过掩膜mask实现图像的局部叠加常用于水印、ROI 区域提取dstcv2.bitwise_and(src1,src2[,mask])# 与运算dstcv2.bitwise_or(src1,src2[,mask])# 或运算dstcv2.bitwise_xor(src1,src2[,mask])# 异或运算dstcv2.bitwise_not(src[,mask])# 非运算取反6.3 图像加法方式对比方式API溢出处理适用场景加权融合cv2.addWeighted按权重线性组合透明度叠加、图像过渡饱和加法cv2.add超过 255 截断为 255亮度提升、图像合成NumPy 加法img1 img2超过 255 取模环绕溢出回绕需避免易致颜色异常饱和减法cv2.subtract小于 0 截断为 0背景减除、差异检测位运算cv2.bitwise_*按位逻辑运算掩膜操作、ROI 提取