【问题标题】:How to detect blurry blobs?如何检测模糊的斑点?
【发布时间】:2019-08-21 22:25:16
【问题描述】:

我想检测这张图片中的所有亮点 (https://i.imgur.com/UnTWWHz.png)

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

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

我尝试了以下代码

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)

【问题讨论】:

  • 我不能说我明白黄色圈出的和根本没有圈出的有什么不同
  • 使用更小的阈值?或者到时候噪音会达到吗?
  • 您可以使用较小的阈值并使用连接组件或形态来过滤掉太小的区域。
  • @Italy 我只圈出了其中一些作为示例。但我想检测所有模糊的
  • @Micka 我尝试更改阈值但没有效果

标签: python image opencv


【解决方案1】:

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

代码:

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)

结果:

阈值

侵蚀

带圆圈的原文

【讨论】:

  • 这很有帮助。谢谢!。我首先使用滤色器为绿色区域创建二进制蒙版。并使用 blob 检测来检测它们。但我还需要将 3 个连接的 blob 检测为 3 个不同的 blob。有没有办法用 onnectedComponentsWithStats 做到这一点?
  • @MaryamSadeghi 我认为您无法使用 connectedComponentsWithStats 将 3 个连接的 blob 检测为我提供的阈值图像中的 3 个不同的 blob。我建议您在阈值图像上使用形态变换。例如,您可以在 erode 之前使用 dilate 并查看它是否会产生更好的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 2020-09-17
  • 1970-01-01
  • 2011-09-04
  • 2012-04-05
  • 1970-01-01
  • 2020-08-09
相关资源
最近更新 更多