图像的读取、显示与保存

任何图像处理流程的开始都离不开图像的读取。OpenCV提供了 cv2.imread() 函数来加载图像。需要注意的是,OpenCV默认读取的图像颜色通道顺序是BGR(蓝、绿、红),这与常见的RGB顺序不同。读取后,使用 cv2.imshow() 可以在窗口中显示图像,而 cv2.imwrite() 则负责将处理后的结果保存到指定路径。

基础读取与显示代码示例

下面的代码演示了如何读取一张图片并在窗口中显示它:

import cv2# 读取图像(第二个参数1表示彩色,0表示灰度,-1表示包含alpha通道)img = cv2.imread('image.jpg', 1)# 显示图像cv2.imshow('Example Image', img)# 等待键盘输入,0表示无限等待cv2.waitKey(0)# 关闭所有窗口cv2.destroyAllWindows()

图像的基本属性与像素操作

理解图像的基本属性是进行后续处理的关键。一张图像可以被视为一个多维数组(NumPy数组)。通过 img.shape 可以获取图像的尺寸(高度、宽度、通道数),img.dtype 可以获取图像的数据类型(通常是uint8)。直接操作这个数组的像素值,是实现许多基础效果(如裁剪、颜色变换)的根本方法。

访问与修改像素值

通过NumPy数组的索引,我们可以轻松访问或修改特定位置的像素值。例如,pixel_value = img[100, 100] 获取了(100,100)坐标处的像素值(对于彩色图,是一个包含BGR三个值的列表)。

色彩空间的转换

虽然OpenCV默认使用BGR色彩空间,但在很多应用场景下(如物体追踪、肤色检测),其他色彩空间如HSV或灰度图更为有效。cv2.cvtColor() 函数是实现色彩空间转换的核心工具。最常用的转换是将BGR图像转为灰度图(使用 cv2.COLOR_BGR2GRAY)或HSV空间(使用 cv2.COLOR_BGR2HSV)。

图像的几何变换

几何变换是指改变图像中像素点位置的操作,包括缩放、旋转、平移和仿射变换等。缩放使用 cv2.resize() 函数,可以指定目标尺寸或缩放比例。旋转则需要先通过 cv2.getRotationMatrix2D() 获得变换矩阵,再使用 cv2.warpAffine() 应用变换。

图像的阈值处理

阈值处理是图像分割的一种简单而有效的方法,它将灰度图像转换为二值图像(只有黑白两色)。cv2.threshold() 函数是完成这一操作的核心。根据阈值规则的不同,有多种类型,如二进制阈值化、反二进制阈值化、截断阈值化等。自适应阈值化(cv2.adaptiveThreshold)能够根据图像不同区域的亮度分布自动计算阈值,对光照不均的图像效果更好。

图像的平滑(模糊)处理

平滑处理的主要目的是减少图像中的噪声或细节。OpenCV提供了多种线性滤波(如均值模糊、高斯模糊)和非线性滤波(如中值模糊、双边滤波)方法。高斯模糊(cv2.GaussianBlur())是最常用的模糊技术之一,它能有效地抑制噪声,同时比均值模糊更好地保留图像边缘。

高斯模糊的应用

在进行边缘检测等操作之前,通常先使用高斯模糊来平滑图像,以消除微小噪声的干扰,从而得到更清晰的边缘结果。

形态学操作

形态学操作是基于图像形状的一系列处理技术,其核心是卷积核(结构元素)与图像进行相互作用。最基本的形态学操作是腐蚀和膨胀。腐蚀(cv2.erode())会“侵蚀”前景物体的边界,有助于消除小白点噪声;而膨胀(cv2.dilate())则相反,能扩大前景区域。开运算(先腐蚀后膨胀)用于去噪,闭运算(先膨胀后腐蚀)用于填充前景物体中的小黑洞。

图像梯度与边缘检测

图像梯度反映了图像亮度变化的速度和方向,是边缘检测的基础。Sobel算子和Laplacian算子都是经典的梯度计算方法。然而,在实际应用中,Canny边缘检测算法因其低错误率、良好定位和单一响应等优点而被广泛使用。Canny检测包含噪声去除、计算梯度、非极大值抑制和滞后阈值四个步骤。

图像金字塔

图像金字塔是图像的多尺度表示集合。高斯金字塔用于向下采样(缩小图像),而拉普拉斯金字塔则用于从金字塔的低层图像重建上层未采样图像,常用于图像融合。图像金字塔在目标检测、图像拼接等需要多尺度分析的场景中非常有用。

图像的轮廓发现与绘制

轮廓可以简单理解为连接所有连续点(沿边界)的曲线,这些点具有相同的颜色或强度。cv2.findContours() 函数用于在二值图像中查找轮廓,它通常与阈值处理或Canny边缘检测的结果配合使用。找到轮廓后,可以使用 cv2.drawContours() 函数将轮廓绘制在图像上。轮廓分析可以用于形状分析、物体检测和识别。

轮廓的特征提取

对于找到的轮廓,可以计算其面积、周长、边界框、外接圆等几何特征,这些特征是区分不同物体和理解图像内容的重要手段。

直方图的计算与均衡化

图像直方图是图像像素强度分布的图形表达。cv2.calcHist() 函数可以计算一幅或多幅图像的直方图。直方图均衡化(cv2.equalizeHist())是一种增强图像对比度的方法,它使得图像的像素强度分布更加均匀,从而使得细节更加清晰。对于彩色图像,通常需要在HSV或YUV色彩空间下对亮度(V或Y)通道进行均衡化。

模板匹配

模板匹配是一种在较大图像中搜索和查找模板图像位置的方法。它通过滑动模板图像 over the source image 并计算相似度(如平方差匹配、相关匹配等)来实现。cv2.matchTemplate() 函数返回一个灰度图像,其中每个像素表示该邻域与模板匹配的程度,通过找到最大或最小值的位置即可确定模板的位置。

霍夫变换

霍夫变换是一种用于检测图像中简单形状(如直线、圆)的特征提取方法。霍夫线变换(cv2.HoughLines(), cv2.HoughLinesP())可以找到图像中的直线,其中概率霍夫线变换(HoughLinesP)效率更高。霍夫圆变换(cv2.HoughCircles())则用于检测圆形的存在。

图像分割:分水岭算法

分水岭算法是一种基于拓扑理论的数学形态学分割方法,它将图像视为一个拓扑地貌,图像中每个像素的灰度值表示该点的海拔。该算法通过模拟“浸水”过程,能够有效地将相互接触的物体分割开来。在使用分水岭算法前,通常需要先确定肯定背景、肯定前景和未知区域。

视频处理入门

视频本质上是由一系列图像(帧)快速连续播放构成的。OpenCV中的 cv2.VideoCapture 类用于从视频文件或摄像头捕获视频流。通过循环读取每一帧,就可以对视频进行实时的图像处理。处理完毕后,可以使用 cv2.VideoWriter 类将处理后的帧写入新的视频文件。

实时视频处理流程

一个典型的实时视频处理流程包括:创建VideoCapture对象、循环读取帧、对每一帧应用图像处理算法、显示处理后的帧,并在用户按下特定键(如‘q’)时退出循环。

图像的特征检测与描述(SIFT, SURF, ORB)

特征检测是计算机视觉中的高级技术,用于寻找图像中独特、稳定的点(关键点),并为其计算描述符。SIFT和SURF是经典的特征检测算法,具有尺度不变性和旋转不变性,但由于专利原因,OpenCV主库中默认不包含SIFT/SURF。ORB(Oriented FAST and Rotated BRIEF)是一个高效的免费替代品,它结合了FAST关键点检测器和BRIEF描述符,并进行了改进以实现旋转不变性。

特征匹配

在两张图像中分别检测到特征点后,下一步是进行特征匹配,即找到两张图像中对应的特征点。OpenCV提供了两种主要的匹配器:BFMatcher(暴力匹配器)和基于FLANN的匹配器。暴力匹配器计算第一幅图像中一个特征的描述符与第二幅图像中所有特征的描述符之间的距离,然后返回最接近的一个。匹配结果可以通过 cv2.drawMatches() 函数可视化。

相机校准与畸变校正

现实中的相机镜头会产生径向畸变和切向畸变,导致图像失真。相机校准的目的就是通过拍摄已知图案(如棋盘格)来计算出相机的内部参数(如焦距、主点)和畸变系数。OpenCV提供了 cv2.findChessboardCorners() 等函数来辅助完成这一过程。得到相机参数后,就可以使用 cv2.undistort() 函数对任何由该相机拍摄的图像进行畸变校正,得到无失真的图像。

图像全景拼接

全景拼接是将多张有重叠区域的图像合成为一张宽视角图像的技术。其基本步骤包括:对输入图像进行特征检测与描述、特征匹配、估计图像间的单应性矩阵(Homography)、最后对整个图像进行透视变换并融合。OpenCV的 cv2.Stitcher 类封装了这些复杂的步骤,可以相对简单地创建全景图。

交互式操作:鼠标作为画笔

OpenCV允许我们为窗口设置鼠标回调函数,从而实现交互式操作。例如,可以创建一个简单的程序,让用户通过鼠标在图像上点击来画圆或矩形。这通过 cv2.setMouseCallback() 函数实现,该函数将窗口名称和一个自定义的回调函数绑定,当鼠标事件(如移动、点击)发生时,就会调用这个回调函数。

使用OpenCV绘制图形与文本

在图像上绘制图形和添加文本是标注和展示结果的基本需求。OpenCV提供了一系列绘制函数,如 cv2.line()(画线)、cv2.circle()(画圆)、cv2.rectangle()(画矩形)、cv2.putText()(添加文本)等。这些函数可以直接在图像数组上操作,方便地将检测结果、边界框或辅助信息可视化。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐