以下是关于Opencv非极大值抑制的完整攻略。
Opencv非极大值抑制基本原理
非极大值抑制(Non-Maximum Suppression,NMS)是一种常用的目标检测算法,用于抑制重叠的检测框,只保留最有可能的检测结果。Opencv中的非极大值抑制算法基于图像梯度,通过比较局部极大值和阈值来抑制非极大值。
Opencv非极大值抑制的使用步骤
Opencv非极大值抑制的使用步骤如下:
- 计算图像梯度
- 找到局部极大值
- 应用阈值
- 进行非极大值抑制
下面将详细说明每步骤。
步骤1:计算图像梯度
计算图像梯度是非极大值抑制的第一步,需要使用Sobel算子或其他算子计算图像的梯度。梯度可以帮助我们找到图像中的边缘。
步骤2:找到局部极大值
找到局部极大值是非极大值抑制的第二步,需要在图像中找到局部极大值点。局部极大值点是指在一个局部区域内,该点的梯度值大。可以使用滑动窗口的方式来找到局部极大值点。
步骤3:应用阈值
应用阈值是非极值抑制的第三步,需要将局部极大值点的梯度值与设定的阈值进行比较。只有梯度值大于阈值的局部极大值点才会被保留。
步骤4:进行非极大值抑制
进行非极大值抑制是非极大值抑制的最后一步,需要在保留的局部极值点中,去除重叠的检测框,只保留最有可能的检测结果。可以使用重叠面积的比例来判断是否需要去除重叠的检测框。
示例
下面是两个Opencv非极大值抑制的示例:
示例1:使用Opencv非极大值抑制进行目标检测
import cv2
# 加载图像
img = cv2.imread('test.jpg')
# 计算图像梯度
sobelx = cv2.Sobel(img, cv2.CV_F, 1, 0, ksize=3)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
mag = cv2.magnitude(sobelx, sobely)
# 找到局部大值
local_max = cv2.dilate(mag, np.ones((3,3)))
local_max[mag < 50] = 0
# 应用阈值
threshold = 100
local_max[mag < threshold] = 0
# 进行非极大值抑制rects = []
contours, _ = cv2.findContours(local_max, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
x, y, w, h = cv2.boundingRect(contour)
rects.append((x, y, x+w, y+h))
rects = cv2.dnn.NMS(rects, [1.0]*len(rects), 0.5, 0.3)
for i in rects:
x, y, w, h = rects[i][0]
cv2.rectangle(img, (x, y), (w, h), (0, 255, 0), 2)
# 显示结果
cv2.imshow('result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
该示例中,我们使用Opencv非极大值抑制进行目标检测。首先,我们加载了一张图像,然后计算了图像的梯度,找到了局部极大值点,并应用了阈值。最后,我们使用非极大值抑制去除了重叠的检测框,只保留了最有可能的检测结果。
示例2:使用Opencv非极大值抑制进行角点检测
import cv2
# 加载图像
img = cv2.imread('test.jpg')
# 计算图像梯度
gray = cv2.cvtColor, cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray, 100, 0.01, 10)
# 进行非极大值抑制
corners = cv2.cornerSubPix(gray, corners,5,5), (-1,-1), (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.1))
corners = cv2.dnn.NMSBoxes(corners, [1.0]*len(corners), 0.5, 0.3)
for i in corners:
x, y = corners][0]
cv2.circle(img, (x, y), 5, (0, 255, 0), 2)
# 显示结果
cv2.imshow('result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
该示例中,我们使用Opencv非极大抑制进行角点检测。首先,我们加载了一张图像,然后计算了图像的梯度,找到了角点。最后,我们使用非极大值抑制去除了重叠的角点,只保留了有可能的角点。
结论
Opencv非极大值抑制是一种常用的目标检测算法,用于抑制重叠检测框,只保留最有可能的检测结果。通过本文介绍应该已经了解Opencv非极大值抑制的基本原理、使用步骤和两个示例,需要灵活使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Opencv 非极大值抑制 - Python技术站