python - 计算图像上的水滴数量

标签 python opencv detection

我有水滴图像,我想计算它的数量。

这是原始图像: Normal drops

在阈值应用之后: Image ofter threshold

我在 OpenCV 上尝试了很多功能,但总是不正确。

您对如何做有什么想法吗?

谢谢

我得到的最好的结果是使用: (img_morph 是我的二值化图像)

rbc_bw = label(img_morph)
rbc_props = regionprops(rbc_bw)
fig, ax = plt.subplots(figsize=(18, 8))
ax.imshow(img_morph)
rbc_count = 0
for i, prop in enumerate(filter(lambda x: x.area > 250, rbc_props)):
    y1, x1, y2, x2 = (prop.bbox[0], prop.bbox[1],
                      prop.bbox[2], prop.bbox[3])
    width = x2 - x1
    height = y2 - y1
    r = plt.Rectangle((x1, y1), width = width, height=height,
                      color='b', fill=False)
    ax.add_patch(r)
    rbc_count += 1
print('Red Blood Cell Count:', rbc_count)
plt.show()

我的所有圈子都在这里被检测到,而且之间的间隙也被检测到。 Analysed

更困难的图像: enter image description here

最佳答案

核心思想:matchTemplate

方法:

  • 从图片中手动选择模板
    • 光线不足的输入(或始终)的直方图均衡
  • matchTemplate 具有合适的匹配模式
    • 还使用copyMakeBorder来捕获剪切边框的实例
  • 阈值和非极大值抑制

我将跳过无聊的部分并使用第一个示例输入。

手动选取模板:

template

scores = cv.matchTemplate(haystack, template, cv.TM_CCOEFF_NORMED)

阈值和 NMS:

levelmask = (scores >= 0.3)

localmax = cv.dilate(scores, None, iterations=26)
localmax = (scores == localmax)

candidates = levelmask & localmax

(nlabels, labels, stats, centroids) = cv.connectedComponentsWithStats(candidates.astype(np.uint8), connectivity=8)
print(nlabels-1, "found") # background counted too
# and then draw a circle for each centroid except label 0

这找到了 766 个实例。我看到了一些假阴性(遗漏),也看到过一次假阳性,但看起来不到 1%。

output

关于python - 计算图像上的水滴数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74633013/

相关文章:

c - 检测 PE 的 'on-the-wire'

javascript - 捕获按键以过滤元素

javascript - 运动跟踪 javascript = html5/canvas 游戏输入/控制

python - 如何从数据框中保存 CSV,以在数字列中保留零?

python - 装饰类的特定方法

python - 从 Python 的子进程调用 scp 不适用于文件列表\{a,b,c\}

c++ - Delaunay 三角剖分 opencv c++

c++ - OpenCV 2.X/C++ 中的 cvConvexityDefects?

opencv - 闭眼检测opencv C++

python - Google 日历 API V3 TimeMax 和 TimeMin 功能