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