根据视觉检测流程快速入门OpenCv

一、图像读取与预处理

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是输出图像的大小

以下为可选参数

fxfy分别是水平和垂直方向的缩放因子

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),分别表示输出图像的宽度和高度。这个尺寸决定了变换后图像的大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值