深圳网站优化费用,网页和网站的联系,做个企业网站 优帮云,注册一个网站要多少费用目录
一、边缘检测
1.1 Canny边缘检测
1.1.1 cv2.Canny函数
1.1.2 Canny边缘检测示例
1.2 角点检测
1.2.1 cv2.goodFeaturesToTrack()函数
1.2.2 OpenCV角点检测示例代码
1.3 直线检测
1.3.1 cv2.HoughLinesP()函数
1.3.2 OpenCV直线检测示例代码
1.4 圆形检测
1.4…目录
一、边缘检测
1.1 Canny边缘检测
1.1.1 cv2.Canny函数
1.1.2 Canny边缘检测示例
1.2 角点检测
1.2.1 cv2.goodFeaturesToTrack()函数
1.2.2 OpenCV角点检测示例代码
1.3 直线检测
1.3.1 cv2.HoughLinesP()函数
1.3.2 OpenCV直线检测示例代码
1.4 圆形检测
1.4.1 cv2.HoughCircles()函数
1.4.2 OpenCV圆形检测示例代码 一、边缘检测
OpenCV中进行边缘检测的一般步骤如下
1. 导入OpenCV库并读取图像
import cv2
image cv2.imread(image.jpg, 0) # 以灰度模式读取图像在这个步骤中你需要将图像加载到内存中。你可以选择以灰度模式或彩色模式读取图像。 2. 对图像进行预处理可选 根据具体情况你可以对图像进行平滑处理如高斯模糊或增强处理如直方图均衡化。这一步骤可以帮助改善边缘检测的结果。 3. 使用边缘检测算法 在OpenCV中有多种边缘检测算法可供选择。以下是一些常用的算法
Canny边缘检测算法
edges cv2.Canny(image, threshold1, threshold2)threshold1和threshold2是两个阈值用于控制边缘检测的敏感度。
Sobel算子
gradient_x cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize3)
gradient_y cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize3)
edges cv2.sqrt(gradient_x**2 gradient_y**2)使用了Sobel算子计算图像的水平和垂直梯度并将两个梯度的平方和开方得到边缘强度。 4. 显示或保存结果
cv2.imshow(Edges, edges)
cv2.waitKey(0)
cv2.destroyAllWindows()1.1 Canny边缘检测
Canny边缘检测是一种经典的图像处理算法也是OpenCV库中常用的边缘检测方法之一。它通过多个步骤来识别图像中的边缘包括高斯滤波、梯度计算、非最大抑制和双阈值处理。
以下是对Canny边缘检测算法的详细解释 高斯滤波首先输入图像会经过一个高斯滤波器以平滑图像并去除噪声。高斯滤波器是一个线性平滑滤波器它使用一个二维高斯函数来计算图像中每个像素的新值。 梯度计算在经过高斯滤波之后算法会计算每个像素的梯度幅值和方向。梯度幅值表示像素的变化强度而梯度方向表示变化的方向。 非最大抑制接下来算法会对梯度幅值进行非最大抑制。这个步骤的目的是找出图像中真正的边缘像素而抑制非边缘的像素。对于每个像素算法会检查其梯度方向并与相邻像素进行比较。只有当像素的梯度幅值是该方向上的最大值时才会被保留为边缘像素否则会被抑制。 双阈值处理最后算法会将梯度幅值分成两个阈值低阈值和高阈值。低阈值用于确定弱边缘像素而高阈值用于确定强边缘像素。具体而言如果像素的梯度幅值大于高阈值则被标记为强边缘像素。如果像素的梯度幅值小于低阈值则被排除。介于两个阈值之间的像素将被视为弱边缘像素只有在其周围有强边缘像素时才会被保留。 1.1.1 cv2.Canny函数
cv2.Canny()是OpenCV中用于执行Canny边缘检测的函数。它具有以下语法
edges cv2.Canny(image, threshold1, threshold2[, apertureSize[, L2gradient]])参数说明
image输入图像。可以是灰度图像或彩色图像。threshold1低阈值。边缘强度梯度低于该值的像素被认为不是边缘。threshold2高阈值。边缘强度梯度高于该值的像素被认为是边缘。apertureSize可选Sobel算子的孔径大小。默认值为3。L2gradient可选一个布尔值确定计算梯度的方式。如果为True则使用L2范数计算梯度更准确但计算量大如果为False则使用L1范数计算梯度快速但不太准确。默认值为False。
返回值
edges边缘检测结果图像。是一个二值图像其中白色像素表示边缘黑色像素表示背景。 注意
通常情况下推荐将threshold1设置为threshold2的1/3到1/2的值。较小的阈值会产生更多的边缘但可能有更多的噪声。较大的阈值会过滤掉较弱的边缘但可能会丢失一些边缘。 1.1.2 Canny边缘检测示例
下面是OpenCV进行Canny边缘检测的示例代码
import cv2# 读取图像
image cv2.imread(image.jpg, cv2.IMREAD_GRAYSCALE)# 执行Canny边缘检测
edges cv2.Canny(image, 100, 200)# 显示结果
cv2.imshow(Original Image, image)
cv2.imshow(Canny Edges, edges)
cv2.waitKey(0)
cv2.destroyAllWindows()调用cv2.Canny函数进行Canny边缘检测。设置低阈值为100高阈值为200。 1.2 角点检测
角点检测是计算机视觉中的一种关键技术用于检测图像中的角点或特征点。角点是图像中两条边交汇形成的点通常具有较高的局部变化和不变性。
OpenCV提供了几种角点检测算法其中两种常用的方法是Harris角点检测和Shi-Tomasi角点检测。 Harris角点检测 Harris角点检测算法通过计算图像局部区域的灰度变化判断是否存在角点。Harris角点检测算法的思想是计算每个像素的响应值响应值较大的像素被认为是角点。它基于图像的一阶和二阶矩来计算特征值从而判断每个像素是否为角点。 Shi-Tomasi角点检测 Shi-Tomasi角点检测算法是在Harris角点检测算法的基础上进行了改进。Shi-Tomasi角点检测算法使用了每个像素点的最小特征值即响应最弱的特征值作为选择角点的准则。这样可以得到比Harris角点检测更好的角点检测结果。
对于这两种角点检测算法OpenCV提供了相应的函数可以方便地进行角点检测。通过调整不同的参数如窗口大小、响应值阈值等可以得到不同的角点检测结果。 1.2.1 cv2.goodFeaturesToTrack()函数
cv2.goodFeaturesToTrack()是OpenCV中用于角点检测的函数。下面是该函数的详细解释
corners cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance, maskNone, blockSizeNone, useHarrisDetectorNone, kNone)image输入的灰度图像。 maxCorners要检测的最大角点数量。如果检测到的角点数量超过该值则会返回最强的角点。 qualityLevel角点质量因子用于筛选角点。值范围为0到1表示最好的角点质量。 minDistance两个角点之间的最小欧氏距离。如果两个角点之间的距离小于此值则其中一个角点将被删除。 mask可选一个与输入图像大小相同的掩码图像在掩码区域中不会检测到角点。 blockSize可选角点检测中使用的像素邻域大小。默认值为3。 useHarrisDetector可选一个布尔值表示是否使用Harris角点检测器。默认为False即使用Shi-Tomasi角点检测器。 k可选如果使用Harris角点检测器此参数为Harris检测器的自由参数。默认值为0.04。
函数返回检测到的角点的坐标以N x 1 x 2的Numpy数组形式返回。在返回的角点数组中每个角点的坐标可以通过corner[0][0]和corner[0][1]来访问。
注意
cv2.goodFeaturesToTrack()函数只能用于灰度图像 1.2.2 OpenCV角点检测示例代码
OpenCV进行角点检测的示例代码
import cv2
import numpy as np# 读取图像
img cv2.imread(image.jpg)
gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 使用Shi-Tomasi角点检测
corners cv2.goodFeaturesToTrack(gray, 100, 0.01, 10)
corners np.int0(corners)# 绘制角点
for corner in corners:x, y corner.ravel()cv2.circle(img, (x, y), 3, (0, 0, 255), -1)# 显示图像
cv2.imshow(Corners, img)
cv2.waitKey(0)
cv2.destroyAllWindows()首先读取图像并将其转换为灰度图像。使用cv2.goodFeaturesToTrack()函数进行角点检测其中参数gray是输入灰度图像100是要检测的角点数量0.01是角点质量因子0.01 * 最大特征值10是两个角点之间的最小距离函数返回的是检测到的角点坐标。
我们使用np.int0()将角点坐标转换为整数类型并使用cv2.circle()函数绘制出检测到的角点。最后使用cv2.imshow()显示带有角点的图像并使用cv2.waitKey()等待键盘输入。 1.3 直线检测
1.3.1 cv2.HoughLinesP()函数
cv2.HoughLinesP()函数是OpenCV中用于通过Hough变换检测图像中的直线的函数。HoughLinesP()函数是Hough变换的参数空间的一种优化它可以直接检测出图像中的直线的端点。 lines cv2.HoughLinesP(image, rho, theta, threshold, minLineLength, maxLineGap)
参数解释
image: 输入的二值图像。rho: Hough变换中表示距离精度的参数。theta: Hough变换中表示角度精度的参数。threshold: Hough变换中表示直线的最小投票数。minLineLength: 最小直线长度。maxLineGap: 最大直线间隙。
返回值
lines: 返回检测到的直线的起点和终点坐标。每个元素代表一条直线每条直线由端点坐标组成。 1.3.2 OpenCV直线检测示例代码
在OpenCV中可以使用Hough变换来进行直线检测。以下是使用OpenCV进行直线检测的示例代码
import cv2
import numpy as np# 加载图像
image cv2.imread(image.jpg)# 转换为灰度图像
gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 进行边缘检测
edges cv2.Canny(gray, 50, 150)# 进行直线检测
lines cv2.HoughLinesP(edges, 1, np.pi/180, threshold100, minLineLength100, maxLineGap10)# 绘制检测到的直线
if lines is not None:for line in lines:x1, y1, x2, y2 line[0]cv2.line(image, (x1, y1), (x2, y2), (0, 255, 0), thickness2)# 显示结果
cv2.imshow(Result, image)
cv2.waitKey(0)
cv2.destroyAllWindows()1.4 圆形检测
在OpenCV中进行圆形检测可以使用Hough圆变换。Hough圆变换可以检测图像中的圆形轮廓。
1.4.1 cv2.HoughCircles()函数
使用cv2.HoughCircles()函数可以实现圆形检测。
circles cv2.HoughCircles(image, method, dp, minDist, param1, param2, minRadius, maxRadius)
参数解释
image: 输入图像通常为灰度图像。method: Hough圆变换的检测方法一般使用cv2.HOUGH_GRADIENT。dp: 累加器图像分辨率与输入图像分辨率的倒数之比。通常设置为1。minDist: 检测到的圆心之间的最小距离。param1: 第一个方法特定的参数对于HOUGH_GRADIENT方法表示Canny边缘检测的高阈值。param2: 第二个方法特定的参数对于HOUGH_GRADIENT方法表示检测阶段圆心累加器阈值。minRadius: 最小圆形半径。maxRadius: 最大圆形半径。
返回值
circles: 返回检测到的圆形的圆心坐标和半径。 1.4.2 OpenCV圆形检测示例代码
在OpenCV中可以使用Hough圆变换来进行直线检测。以下是使用OpenCV进行圆形检测的示例代码
import cv2
import numpy as npimage cv2.imread(image.jpg)
gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray cv2.medianBlur(gray, 5)circles cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp1, minDist20, param150, param230, minRadius0, maxRadius0)if circles is not None:circles np.round(circles[0, :]).astype(int)for (x, y, r) in circles:cv2.circle(image, (x, y), r, (0, 255, 0), 4)cv2.imshow(image, image)
cv2.waitKey(0)
cv2.destroyAllWindows()以上示例代码中首先读取图像并将其转换为灰度图像。然后对灰度图像进行中值滤波来去除噪声。接下来使用cv2.HoughCircles()函数检测图像中的圆形并将检测到的圆形绘制在原图像上。最后显示原图像。