opencv 斑点检测,遗漏了一些斑点

opencv blob detection, missing some blobs

import cv2
import numpy as np

im_m = cv2.imread("primary.png", cv2.IMREAD_GRAYSCALE)

# 50, 130

# Otsu's thresholding after Gaussian filtering 
blur = cv2.GaussianBlur(im_m,(25,25),0)
#(thresh, im2) = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# Black region overflowing into digit regions with otsu

(thresh, im) = cv2.threshold(im_m, 55, 130, cv2.THRESH_BINARY)

kernel = np.ones((5,5), np.uint8)

img_dilation = cv2.dilate(im, kernel, iterations=1)
img_erosion = cv2.erode(img_dilation, kernel, iterations=1)


params = cv2.SimpleBlobDetector_Params()


params.minThreshold = 10;
params.maxThreshold = 225;


params.filterByArea = True
params.minArea = 100
params.maxArea = 1500


params.filterByCircularity = False
params.minCircularity = 0.5


params.filterByConvexity = False
params.minConvexity = 0.2


params.filterByInertia = False
params.minInertiaRatio = 0.01


ver = (cv2.__version__).split('.')
if int(ver[0]) < 3 :
    detector = cv2.SimpleBlobDetector(params)
else : 
    detector = cv2.SimpleBlobDetector_create(params)



keypoints = detector.detect(im)


im_key = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255),             cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)




cv2.imshow("Keypoints", im_key)
cv2.imshow("Erosion", img_erosion)
cv2.imshow("Dilation", img_dilation)
cv2.waitKey(0)

我对使用 opencv 进行图像处理还很陌生。我正在尝试从嘈杂的图像中检测数字。

Input Image

我做了一些实验,通过参数调整阈值和过滤,但无法检测到 3、4、0,有时是 5、7 和 2 的斑点。我只需要检测数字。对于此任务,还有比斑点检测更好的方法吗?

Output Image

一般来说,您应该为大多数参数尝试不同的值。我通常有一个带有一些滚动条的 GUI,以便交互式地修改参数。

你的情况,我猜是maxarea太小了。您可以将其设置为 10000,如果可行,则将其设置得更小,直到它开始失败。如果它不起作用,你可以尝试将 minarea 变小。

我认为你没有其他参数,但如果你有,你应该禁用所有过滤器,扩大所有范围,然后启用并逐个缩小它们(始终查看你的图像结果)