Python opencv blob检测,缺少一些blob 导入cv2 将numpy作为np导入 im\u m=cv2.imread(“primary.png”,cv2.imread\u灰度) # 50, 130 #高斯滤波后的大津阈值 模糊=cv2.高斯模糊(im_m,(25,25),0) #(thresh,im2)=cv2.阈值(模糊,0255,cv2.thresh_二进制+cv2.thresh_大津) #黑色区域溢出到数字区域与大津 (thresh,im)=cv2.阈值(im_m,55130,cv2.thresh_二进制) 内核=np.ones((5,5),np.uint8) img_displate=cv2.displate(im,内核,迭代次数=1) img_腐蚀=cv2.腐蚀(img_膨胀,内核,迭代次数=1) params=cv2.SimpleBlobDetector_params() params.minThreshold=10; 参数maxThreshold=225; params.filterByArea=True 参数minArea=100 params.maxArea=1500 params.filterByCircularity=False 参数最小圆度=0.5 params.filterByConvexity=False params.min凸度=0.2 params.filterByInertia=False 参数minInertiaRatio=0.01 版本=(cv2.版本.拆分('.')) 如果int(ver[0])

Python opencv blob检测,缺少一些blob 导入cv2 将numpy作为np导入 im\u m=cv2.imread(“primary.png”,cv2.imread\u灰度) # 50, 130 #高斯滤波后的大津阈值 模糊=cv2.高斯模糊(im_m,(25,25),0) #(thresh,im2)=cv2.阈值(模糊,0255,cv2.thresh_二进制+cv2.thresh_大津) #黑色区域溢出到数字区域与大津 (thresh,im)=cv2.阈值(im_m,55130,cv2.thresh_二进制) 内核=np.ones((5,5),np.uint8) img_displate=cv2.displate(im,内核,迭代次数=1) img_腐蚀=cv2.腐蚀(img_膨胀,内核,迭代次数=1) params=cv2.SimpleBlobDetector_params() params.minThreshold=10; 参数maxThreshold=225; params.filterByArea=True 参数minArea=100 params.maxArea=1500 params.filterByCircularity=False 参数最小圆度=0.5 params.filterByConvexity=False params.min凸度=0.2 params.filterByInertia=False 参数minInertiaRatio=0.01 版本=(cv2.版本.拆分('.')) 如果int(ver[0]),python,opencv,image-processing,blob,opencv3.0,Python,Opencv,Image Processing,Blob,Opencv3.0,我对opencv的图像处理相当陌生。我正试图从一个嘈杂的图像中检测数字 我做了一些实验,调整阈值和参数过滤,但无法检测3、4、0,有时还有5、7和2的斑点。我只需要检测数字。对于这项任务,除了斑点检测还有其他更好的方法吗 通常,您应该尝试为大多数参数使用不同的值。我通常有一个带有一些滚动条的GUI,以便以交互方式修改参数 在你的情况下,我想最大面积太小了。你可以把它设为10000,如果可行的话,把它缩小,直到它开始失效。如果它不起作用,你可以试着把尖塔缩小一些 我认为您没有其他参数,但如果有,

我对opencv的图像处理相当陌生。我正试图从一个嘈杂的图像中检测数字

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


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

在你的情况下,我想最大面积太小了。你可以把它设为10000,如果可行的话,把它缩小,直到它开始失效。如果它不起作用,你可以试着把尖塔缩小一些


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

看起来您只是按区域过滤。我猜你的params.maxarea太小了。试着用10000。我试着禁用所有的过滤器,并使minArea=0和maxArea非常大,但仍然无法检测到这些数字。相反,我得到了一些大的随机斑点。你能用几个值试试吗?例如,保留minarea=100,然后尝试稍微更改maxarea(值1500、1550、1600,…),看看结果是否更好。一旦你找到了最佳的maxarea,试着稍微改变一下minarea。如果你能为minarea和maxarea创建一个带有滚动条的简单GUI,那就容易多了。您可以为minthreshold和maxthreshold添加滚动条,这可能很重要。
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)