如何使用 python cv2.SimpleBlobDetector 检测图像中的单个最大点?
How can I use python cv2.SimpleBlobDetector to detect the single largest spot in an image?
我在python中使用了cv2来定位轮廓,找到我想要处理的图像部分,现在我需要定位图像中最大点的中心,如下图但我想我不理解参数是如何工作的,因为它识别其他较小的点,但从来没有识别我试图检测的较大点。我正在使用以下测试代码:
params = cv2.SimpleBlobDetector_Params()
params.filterByCircularity = True
params.minCircularity = 0.1
params.filterByArea = True
params.minArea = 20.
ver = (cv2.__version__).split('.')
if int(ver[0]) < 3 :
detector = cv2.SimpleBlobDetector(params)
else :
detector = cv2.SimpleBlobDetector_create(params)
keypoints = detector.detect(cropped_img)
for kp in keypoints:
print("(%d, %d) size=%.1f resp=%.1f" % (kp.pt[0], kp.pt[1], kp.size, kp.response))
im_with_keypoints = cv2.drawKeypoints(cropped_img, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imwrite(img_path.replace('.png', '-cropped2.png'), im_with_keypoints)
也许我用我测试过的值来解决这个问题,或者完全使用了错误的参数,但我们将不胜感激。我正在尝试检测第一张图片中红色箭头指示的较大斑点。 运行 第一张图片上的这段代码生成第二张图片。
所以又进行了一天的研究,解决方案是使用结构化元素而不是斑点检测器。在这种情况下,由于相交线而未检测到斑点,如果与线隔离,它会起作用。在图像中搜索特定大小的结构化元素效果很好。我想我会 post 这个代码片段来回答我自己的问题,以防万一有人遇到这个问题,这可能会引导他们走另一条路。
创建结构元素是解决此类图像的方法。
gray = cv2.cvtColor(cropped_img,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
round_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (10,10))
detected_ball = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, round_kernel, iterations=2)
cnts = cv2.findContours(detected_ball, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
color = cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR)
for c in cnts:
x,y,w,h = cv2.boundingRect(c)
if x > 1 and y > 1:
cv2.drawContours(color, [c], -1, (0,0,255), 3)
结果:
我在python中使用了cv2来定位轮廓,找到我想要处理的图像部分,现在我需要定位图像中最大点的中心,如下图但我想我不理解参数是如何工作的,因为它识别其他较小的点,但从来没有识别我试图检测的较大点。我正在使用以下测试代码:
params = cv2.SimpleBlobDetector_Params()
params.filterByCircularity = True
params.minCircularity = 0.1
params.filterByArea = True
params.minArea = 20.
ver = (cv2.__version__).split('.')
if int(ver[0]) < 3 :
detector = cv2.SimpleBlobDetector(params)
else :
detector = cv2.SimpleBlobDetector_create(params)
keypoints = detector.detect(cropped_img)
for kp in keypoints:
print("(%d, %d) size=%.1f resp=%.1f" % (kp.pt[0], kp.pt[1], kp.size, kp.response))
im_with_keypoints = cv2.drawKeypoints(cropped_img, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imwrite(img_path.replace('.png', '-cropped2.png'), im_with_keypoints)
也许我用我测试过的值来解决这个问题,或者完全使用了错误的参数,但我们将不胜感激。我正在尝试检测第一张图片中红色箭头指示的较大斑点。 运行 第一张图片上的这段代码生成第二张图片。
所以又进行了一天的研究,解决方案是使用结构化元素而不是斑点检测器。在这种情况下,由于相交线而未检测到斑点,如果与线隔离,它会起作用。在图像中搜索特定大小的结构化元素效果很好。我想我会 post 这个代码片段来回答我自己的问题,以防万一有人遇到这个问题,这可能会引导他们走另一条路。
创建结构元素是解决此类图像的方法。
gray = cv2.cvtColor(cropped_img,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
round_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (10,10))
detected_ball = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, round_kernel, iterations=2)
cnts = cv2.findContours(detected_ball, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
color = cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR)
for c in cnts:
x,y,w,h = cv2.boundingRect(c)
if x > 1 and y > 1:
cv2.drawContours(color, [c], -1, (0,0,255), 3)
结果: