Python 如何检测模糊斑点?

Python 如何检测模糊斑点?,python,image,opencv,Python,Image,Opencv,我想检测这张图片中的所有亮点() 我尝试过的代码是通过阈值,但它只检测非常明亮的。如下图所示 但是有些斑点没有对焦,我需要检测它们。 你能建议一个方法吗?下图显示了我想在黄色圆圈中检测到的模糊点 我尝试了以下代码 import os import cv2 import numpy as np path="C:/Slides/Fluoroscent/E_03_G_O_subpics" imgname="sub_2_4.png" image = cv2.imread(os.path.join

我想检测这张图片中的所有亮点()

我尝试过的代码是通过阈值,但它只检测非常明亮的。如下图所示

但是有些斑点没有对焦,我需要检测它们。 你能建议一个方法吗?下图显示了我想在黄色圆圈中检测到的模糊点

我尝试了以下代码

import os
import cv2
import numpy as np


path="C:/Slides/Fluoroscent/E_03_G_O_subpics"
imgname="sub_2_4.png"
image = cv2.imread(os.path.join(path,imgname))

#  constants
BINARY_THRESHOLD = 10
CONNECTIVITY = 4
DRAW_CIRCLE_RADIUS = 18
thr=50
#  convert to gray
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

#  threshold the black/ non-black areas
_, thresh = cv2.threshold(gray_image, BINARY_THRESHOLD, thr, cv2.THRESH_BINARY)

#  find connected components
components = cv2.connectedComponentsWithStats(thresh, CONNECTIVITY, cv2.CV_32S)

#  draw circles around center of components
#see connectedComponentsWithStats function for attributes of components variable
centers = components[3]
for center in centers:
    cv2.circle(image, (int(center[0]), int(center[1])), DRAW_CIRCLE_RADIUS, (0,0,255), thickness=1)

cv2.imwrite(os.path.join(path,"result_thresh_"+str(thr)+".png"), image)
cv2.imshow("result", image)
cv2.waitKey(0)

如评论中所述,通过更改阈值,您将获得更好的结果。我将值分别更改为20和255,并添加了腐蚀以消除一些噪声。您可以使用形态学变换来获得精确的所需结果。阅读更多

代码:

结果:

门槛

侵蚀

带圆圈的原稿


我不能说我理解用黄色圈起来的和没有用较小的阈值圈起来的有什么不同?或者噪声会达到吗?你可以使用较小的阈值,并使用连接的组件或形态学来过滤过小的区域。@Italy我仅以其中一些区域为例。但我想检测所有的模糊ones@Micka我试图改变阈值,但没有效果,这是很大的帮助。非常感谢。我首先使用颜色过滤器为绿色区域创建一个二元遮罩。并使用blob检测来检测它们。但我还需要将3个连接的blob检测为3个不同的blob。有没有办法用connectedComponentsWithStats做到这一点?@MaryamSadeghi我认为你无法让connectedComponentsWithStats在我提供的阈值图像中将3个连接的Blob检测为3个不同的Blob。我建议您在阈值图像上使用形态学变换。例如,您可以在腐蚀之前使用Explate,看看它是否能产生更好的效果。
import cv2
import numpy as np

kernel = np.ones((5,5),np.uint8)
CONNECTIVITY = 4
DRAW_CIRCLE_RADIUS = 18
img = cv2.imread('blobs.png')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray_img, 20, 255, cv2.THRESH_BINARY)
erosion = cv2.erode(thresh,kernel,iterations = 1)

components = cv2.connectedComponentsWithStats(erosion, CONNECTIVITY, cv2.CV_32S)

centers = components[3]
for center in centers:
    cv2.circle(img, (int(center[0]), int(center[1])), DRAW_CIRCLE_RADIUS, (0,0,255), thickness=1)

cv2.imshow('Original', img)
cv2.imshow('Thresh', thresh)
cv2.imshow('Erosion', erosion)
cv2.waitKey(0)