一、图像读取与预处理
1.1、图像读取
cv2.imread(path, flags)
:从指定路径读取图像。path
为图像路径,flags
指定读取模式
此外还有英文大写方式:cv2.IMREAD_COLOR
(彩色模式,默认)、cv2.IMREAD_GRAYSCALE
(灰度模式)、cv2.IMREAD_UNCHANGED
(保留透明度通道)
1.2、图像显示
cv2.imshow(winname, mat)
:在指定窗口中显示图像。winname
是窗口名称,mat
是要显示的图像矩阵。
cv2.waitKey(delay)
:等待按键事件,delay
为等待时间(毫秒),0 表示无限等待。
cv2.destroyAllWindows()
:关闭所有 OpenCV 创建的窗口。
1.3、图像灰度转换
在实际的算法实现中,使用的都是灰度图,所以一般需要转化为灰度图。
cv2.cvtColor(src, code)
:将图像从一种颜色空间转换为另一种。对于彩色转灰度,code
通常设为cv2.COLOR_BGR2GRAY
cv2.COLOR_BGR2GRAY
是 OpenCV 库(在 Python 中通过 cv2
模块使用)中用于颜色空间转换的一个标志常量。
在 OpenCV 中,图像通常以 BGR(蓝、绿、红)格式存储。而 cv2.COLOR_BGR2GRAY
表示将 BGR 格式的彩色图像转换为灰度图像
1.4图像滤波
高斯滤波(Gaussian Blur)和均值滤波(Mean Blur)都是图像处理中常用的平滑技术,它们用于减少图像噪声、模糊图像边缘或细节,以及进行图像预处理。
在实际应用中,高斯滤波通常更受欢迎
在决定使用哪种滤波方法时,可以考虑以下因素:
图像内容:如果图像中包含重要的边缘信息,高斯滤波可能更合适。
噪声类型:如果主要是随机噪声,均值滤波可能更有效。
实现复杂度:如果需要快速实现,均值滤波可能更简单。
性能要求:如果对图像质量有较高要求,高斯滤波通常能提供更好的结果。
二、特征提取与检测
转角遇到爱:识别出来的特征一般都在图片的转角处,转角是一种最简单图像特征,同时提取转角也是非常高效的图像特征提取方式。
2.1、边缘检测cv2.Canny函数
edges = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])
其中image是源图像
threshold1:第一个阈值。在边缘检测过程中,低于此阈值的梯度值对应的像素点会被认为不是边缘点而被抑制
threshold2:第二个阈值。高于此阈值的梯度值对应的像素点会被直接认为是边缘点。
在threshold1与threshold2之间:如果它们与已确定的边缘点相连,则也会被认为是边缘点。这就是所谓的滞后阈值处理,它有助于连接边缘片段并减少噪声引起的虚假边缘。
2.2、角点检测cv2.goodFeaturesToTrack函数
corners = cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]])
其中image是源图像
maxCorners:表示要检测的最大角点数。有可能没有返回这么多个角点,但如果图像中的角点数量超过此值,函数将返回最显著的 maxCorners
个角点。例如,设置为 100
,则最多返回 100 个角点。
qualityLevel:角点质量水平,取值范围在 0 到 1 之间。它表示角点的最低可接受质量分数。实际检测到的角点中,质量分数低于该值的角点将被忽略。例如,设置为 0.01
,意味着只有质量分数大于 0.01 的角点才会被保留。
minDistance:两个角点之间的最小像素距离。若检测到的角点之间距离小于此值,那么质量分数较低的角点将被舍弃。这有助于确保检测到的角点分布较为均匀,避免角点过于集中。例如,设置为 10
,表示角点之间的距离至少为 10 个像素。
常配合ravel
函数一起使用,是 一个数组对象的一个方法,其作用是将多维数组展平成一维数组,x, y = corners.ravel()
会依次从展平后的数组中取出值并分别赋给 x
和 y
。
# 标记出每个点
for corner in corners:
x, y = corner.ravel()
cv2.circle(image, (int(x), int(y)), 3, (255, 0, 255), -1)
三、目标检测与识别
经过上面的预处理以及特征提取,我们已经得到了一个经处理过的图片,我们使用这个图片与模板进行匹配。
3.1、模板匹配cv2.matchTemplate函数
result = cv2.matchTemplate(image, templ, method[, result[, mask]])
image:待搜索的图像
templ:模板图像,其数据类型需与 image
一致,且尺寸应小于或等于 image
。这是我们希望在 image
中找到的小图像块。
method:cv2.TM_XXXX各种匹配方法。
计算平方差匹配(cv2.TM_SQDIFF)。归一化平方差匹配(cv2.TM_SQDIFF_NORMED)。
相关性匹配(cv2.TM_CCORR)。归一化相关性匹配(cv2.TM_CCORR_NORMED)。
系数匹配(cv2.TM_CCOEFF)。归一化系数匹配(cv2.TM_CCOEFF_NORMED)。
返回值是一个数字
四、图像形态学操作
对特征提取与模板匹配的图片进行优化,当然这个操作也可以在特征提取的前面。
这是对图片的进一步处理,,不同于预处理,此时根据现实需求,此时的二次处理更具有方向性。
4.1、腐蚀cv2.erode
让图像更加骨瘦如柴,或者说更加的细小
dst = cv2.erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]])
src:源图像
kernel:腐蚀操作所使用的结构元素(核),它是一个 numpy.ndarray
。结构元素的形状和大小决定了腐蚀操作的具体行为。常见的形状有矩形、椭圆和十字形等,可以通过 cv2.getStructuringElement
函数来创建不同形状和大小的结构元素。
例如,kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
创建了一个 5x5
的矩形结构元素。
4.2、膨胀cv2.dilate
让图像更加饱满,或者说更加模糊
dst = cv2.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]])
src:源图像
kernel:胀操作使用的结构元素(核)。它是一个 numpy.ndarray
,决定了膨胀操作的邻域形状和大小。常见的结构元素形状有矩形、椭圆和十字形。
可以通过 cv2.getStructuringElement
函数创建。例如,创建一个 3x3
的矩形结构元素可以使用 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
。
4.3、开运算与闭运算
开运算:先腐蚀后膨胀
可用于去除小的噪声物体,平滑较大物体的边界
cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)
实现,src
是输入图像,kernel
是结构元素
闭运算:先膨胀后腐蚀
可用于填充物体内的小孔,连接邻近物体
通过cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)
实现
五、图像几何变换
5.1、缩放cv2.resize函数
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
,调整图像大小。
src是原图片
dsize
是输出图像的大小
以下为可选参数
fx
和fy
分别是水平和垂直方向的缩放因子
interpolation
指定插值方法图像放大放小了,那么多出来的像素怎么选像素插入,少掉的像素怎么舍去,这就需要使用相应的算法了,如cv2.INTER_LINEAR
(双线性插值,默认用于缩放)、cv2.INTER_NEAREST
(最近邻插值)等。
5.2、旋转cv2.getRotationMatrix2D和cv2.warpAffine函数
cv2.getRotationMatrix2D(center, angle, scale)
和cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
配合使用。
5.2.1、getRotationMatrix2D
获取旋转矩阵
center
是旋转中心的坐标,以元组 (x, y)
的形式表示。这里的坐标是相对于图像左上角原点的位置。在图像旋转过程中,该点保持不动,其他点围绕它进行旋转。
angle
是旋转角度,单位为度。正值表示逆时针旋转,负值表示顺时针旋转。
scale
是缩放因子。这是一个浮点数,用于指定在旋转的同时对图像进行缩放。
5.2.2、cv2.warpAffine
应用仿射变换
src:源图像
M
是变换矩阵,这个矩阵定义了仿射变换的具体操作,例如旋转、平移、缩放等。通常可以通过 cv2.getRotationMatrix2D
(用于获取旋转矩阵)
dsize
是输出图像大小,输出图像的尺寸,是一个元组 (width, height)
,分别表示输出图像的宽度和高度。这个尺寸决定了变换后图像的大小。