目录
(4)仿射变换(Affine Transformation)
(5)透视变换(Perspective Transformation)
(1)直方图均衡化(Histogram Equalization)
5.5 ORB(Oriented FAST and Rotated BRIEF)
一、前言与背景介绍
1.1 计算机视觉的兴起
在信息爆炸的今天,图像与视频已经成为最主要的数据来源之一。人类每天在互联网上产生的图片、视频、监控画面数以亿计。如何让计算机理解这些视觉信息,是人工智能领域的重要课题。计算机视觉(Computer Vision,简称 CV)便是研究如何让机器“看懂”世界的学科。
早期的计算机视觉研究主要集中在简单的图像处理,比如边缘检测、几何变换、形态学运算等。然而,随着人工智能、深度学习和硬件计算能力的提升,计算机视觉已经能够实现自动驾驶、医学影像诊断、人脸识别、视频监控、虚拟现实等高阶任务。
1.2 OpenCV 的诞生与发展
OpenCV(Open Source Computer Vision Library)是由英特尔公司在 1999 年发起并开源的计算机视觉库,最初是为了推动计算机视觉在工业界和学术界的普及。
OpenCV 的发展历程:
-
1999-2005:第一版 OpenCV 发布,主要以 C/C++ 接口为主,专注于基础图像处理。
-
2006-2009:社区化发展,逐渐加入更多算法(特征点检测、物体识别等)。
-
2010-2015:OpenCV 2.x 和 3.x 版本发布,Python 接口逐渐成熟,支持 GPU 加速,支持机器学习模块。
-
2016-至今:OpenCV 4.x 系列发布,专注于与深度学习框架的集成,支持 DNN 模块,可以直接加载 Caffe、TensorFlow、PyTorch 训练的模型。
如今,OpenCV 已经成为 全球最广泛使用的计算机视觉库,不仅在科研和教育中应用广泛,在工业界、安防监控、自动驾驶、医疗影像、机器人领域也被大量使用。
1.3 OpenCV 的优势
-
开源免费:任何人都可以免费使用,并在 GPL / BSD 协议下进行二次开发。
-
跨平台:支持 Windows、Linux、macOS、iOS、Android。
-
多语言接口:支持 C++、Python、Java 等。
-
高性能:底层优化良好,支持 GPU 加速。
-
社区活跃:有大量学习资料和代码示例。
1.4 OpenCV 的应用领域
-
人脸识别(安防监控、门禁系统、社交平台)
-
自动驾驶(车道检测、目标检测、障碍物识别)
-
医学影像(X 光片、CT 图像分析)
-
工业检测(产品缺陷检测、装配线视觉引导)
-
增强现实与虚拟现实(姿态估计、手势识别)
-
视频分析(运动跟踪、行为识别)
OpenCV 提供了图像的读取、显示、保存、颜色空间转换、像素操作、几何变换等基础功能。通过直方图、滤波、卷积、锐化、模糊等操作,开发者可以对图像进行预处理和增强,为后续分析提供高质量数据。
二、OpenCV 基础概念与安装使用
2.1 OpenCV 的基本组成
OpenCV 是一个模块化的计算机视觉库,包含了许多不同功能的模块,常见的有:
-
核心模块 (core):提供基本的数据结构和算法,比如
Mat(矩阵)、随机数生成器、线性代数运算等。 -
图像处理模块 (imgproc):包含图像滤波、几何变换、颜色空间转换、阈值分割等。
-
图像输入输出模块 (imgcodecs):负责图像的读取和保存(JPEG、PNG、TIFF 等)。
-
视频处理模块 (videoio):读取视频文件、摄像头流,并支持视频编码保存。
-
高层 GUI 模块 (highgui):提供窗口显示、交互操作。
-
特征检测与匹配 (features2d):SIFT、SURF、ORB 等特征点检测。
-
对象检测 (objdetect):Haar 级联分类器、HOG+SVM 等方法。
-
机器学习模块 (ml):常见的分类器、回归器、聚类方法。
-
DNN 模块 (dnn):支持加载深度学习框架训练的模型(Caffe、TensorFlow、ONNX)。
这些模块共同构成了 OpenCV 的功能体系,使得它既能处理简单的图像读取,也能运行复杂的目标检测网络。
2.2 OpenCV 的安装
OpenCV 的安装非常简单,尤其是在 Python 环境下。
(1)使用 pip 安装(推荐)
pip install opencv-python
pip install opencv-contrib-python # 包含更多扩展模块
-
opencv-python:基础模块,适合大多数图像处理任务。 -
opencv-contrib-python:在基础版的基础上,额外包含xfeatures2d等扩展功能,比如 SIFT、SURF 特征提取。
(2)conda 安装(推荐给 Anaconda 用户
conda install -c conda-forge opencv
(3)源码编译安装
在 Linux 上有时需要自己编译,以获得 GPU/CUDA 加速支持:
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
cd opencv
mkdir build && cd build
cmake -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ..
make -j8
sudo make install
2.3 测试 OpenCV 是否安装成功
安装完成后,可以在 Python 中输入:
import cv2
print(cv2.__version__)
如果正常输出版本号(例如 4.9.0),说明安装成功。
2.4 OpenCV 的图像读取与显示
(1)读取与显示图像
import cv2
# 读取图像
img = cv2.imread("example.jpg")
# 显示图像
cv2.imshow("Image", img)
cv2.waitKey(0) # 按任意键关闭窗口
cv2.destroyAllWindows()
-
cv2.imread():读取图像,默认是彩色图(BGR 格式)。 -
cv2.imshow():在窗口中显示图像。 -
cv2.waitKey(0):等待键盘输入,参数是毫秒数,0表示无限等待。 -
cv2.destroyAllWindows():关闭所有窗口。
(2)保存图像
cv2.imwrite("output.jpg", img)
(3)以不同模式读取图像
img_color = cv2.imread("example.jpg", cv2.IMREAD_COLOR) # 彩色
img_gray = cv2.imread("example.jpg", cv2.IMREAD_GRAYSCALE) # 灰度
img_unch = cv2.imread("example.jpg", cv2.IMREAD_UNCHANGED) # 原始格式(含透明通道)
2.5 OpenCV 的颜色空间
OpenCV 读取的彩色图像默认是 BGR 格式(蓝、绿、红),而不是常见的 RGB。
常见颜色空间转换:
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # BGR → RGB
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # BGR → 灰度
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # BGR → HSV
-
RGB:常见彩色空间,适合显示。
-
Gray:灰度图,单通道,适合计算。
-
HSV:色相 (H)、饱和度 (S)、明度 (V),适合颜色分割。
2.6 图像尺寸与基本属性
在 OpenCV 中,图像通常用 NumPy 数组 表示。
print(img.shape) # (高度, 宽度, 通道数)
print(img.size) # 像素总数
print(img.dtype) # 数据类型,通常是 uint8
修改大小:
resized = cv2.resize(img, (400, 300)) # 指定宽、高
裁剪图像(直接用 NumPy 切片):
crop = img[50:200, 100:300] # [y1:y2, x1:x2]
三、图像处理核心技术
3.1 图像平滑与滤波
图像常常带有噪声(如相机噪声、光照变化),需要先进行 平滑(Smoothing) 或 滤波(Filtering) 处理。
(1)均值滤波
均值滤波是一种最简单的平滑方法,用邻域像素的平均值替代中心像素。
import cv2
import numpy as np
img = cv2.imread("example.jpg")
# 3x3 均值滤波
blur = cv2.blur(img, (3,3))
cv2.imshow("Original", img)
cv2.imshow("Mean Blur", blur)
cv2.waitKey(0)
缺点:容易使图像模糊,边缘不清晰。
(2)高斯滤波
使用高斯核进行加权平均,保留更多图像细节。
gaussian = cv2.GaussianBlur(img, (5,5), 1.5)
比均值滤波效果更自然,常用于噪声抑制。
(3)中值滤波
取邻域像素的中值,特别适合去除“椒盐噪声”。
median = cv2.medianBlur(img, 5)
(4)双边滤波
在平滑的同时保留边缘,是一种高级滤波方法。
bilateral = cv2.bilateralFilter(img, 9, 75, 75)
-
第一个参数:邻域直径
-
第二个参数:颜色相似性权重
-
第三个参数:空间距离权重
双边滤波常用于美颜、去噪。
3.2 边缘检测
图像的边缘是亮度变化剧烈的区域,通常代表物体的边界。
(1)Sobel 算子
Sobel 是一种一阶导数算子,用来检测水平或垂直边缘。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sobel_x = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3) # 水平
sobel_y = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3) # 垂直
sobel = cv2.addWeighted(cv2.convertScaleAbs(sobel_x), 0.5,
cv2.convertScaleAbs(sobel_y), 0.5, 0)
cv2.imshow("Sobel Edge", sobel)
cv2.waitKey(0)
(2)Laplacian 算子
检测二阶导数,能更全面地检测边缘。
laplacian = cv2.Laplacian(gray, cv2.CV_64F)
(3)Canny 边缘检测(最常用)
Canny 算法是一种多阶段边缘检测方法,效果最好。
canny = cv2.Canny(gray, 100, 200) # 低阈值=100,高阈值=200
常用于实际工程,比如车道线检测、人脸轮廓提取。
3.3 图像阈值分割
图像分割的目标是把前景(对象)与背景分离。
(1)固定阈值分割
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
-
小于 127 → 0
-
大于等于 127 → 255
(2)自适应阈值分割
适合光照不均的情况。
adaptive = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C,
cv2.THRESH_BINARY, 11, 2)
(3)Otsu’s 阈值分割
自动计算最佳阈值。
ret2, otsu = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
Otsu 在医学影像(如细胞分割)中常用。
3.4 图像形态学操作
形态学操作主要用于二值图像,基于数学形态学。
(1)腐蚀(Erosion)
去掉前景物体的边界,使白色区域变小。
kernel = np.ones((5,5), np.uint8)
erosion = cv2.erode(thresh, kernel, iterations=1)
(2)膨胀(Dilation)
扩展前景区域,使白色区域变大。
dilation = cv2.dilate(thresh, kernel, iterations=1)
(3)开运算(Opening)
先腐蚀后膨胀,去除噪点。
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
(4)闭运算(Closing)
先膨胀后腐蚀,填充物体内部小黑洞。
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



