我已经使用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)也许我用我测试过的值来处理这个问题是错误的,或者使用了错误的参数,但如果能得到一些帮助,我将不胜感激。我正在尝试检测第一张图像中红色箭头指示的较大的斑点。在第一个图像上运行此代码将生成第二个图像。


发布于 2021-09-24 11:55:43
因此,另一天的研究和解决方案是使用结构元素而不是斑点检测器。在这种情况下,由于相交的线,斑点没有被检测到,如果与线隔离,它将工作。在图像中搜索特定大小的结构化元素效果很好。我想我应该发布这段代码来回答我自己的问题,以防有人遇到这个问题,这可能会把他们引向另一条道路。
创建结构化元素就是这类图像的解决方案。
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)结果:

https://stackoverflow.com/questions/69275236
复制相似问题