【问题标题】:python separate round particles by offsetting contours / shrinking polygonespython通过偏移轮廓/缩小多边形来分离圆形粒子
【发布时间】:2012-09-28 02:53:42
【问题描述】:

我是 python 新手,卡住了..

我想制作一个 python 脚本,让我可以像这样分离图像上的相邻粒子:

像这样分成不同的区域:

有人建议我使用分水岭方法,据我所知,它会给我这样的结果:

编辑 居然发现这是距离变换,不是分水岭

然后我可以使用阈值将它们分开.. 遵循这个openCV watershed guide,但它只能去除粒子。无法“转换”代码来做我想做的事。

然后我采取了另一种方法。尝试使用openCV contours,它给了我很好的粒子轮廓。然后我一直在寻找一种简单的方法来执行多边形偏移,以便像这样缩小边缘:

使用偏移轮廓(多边形)的中心应该给我粒子的数量。但我只是找到了一种简单的方法来使用 python 进行边缘偏移/多边形收缩。

【问题讨论】:

  • 您可能会感兴趣:stackoverflow.com/questions/10313602/… 距离变换可能对您的情况有用。据我了解,多边形收缩可能相当于对距离图进行阈值处理,不是吗?
  • +1 表示 Quentin 链接,distanceTransform 是您要查找的内容,示例与您的问题非常相似
  • 距离变换确实让我走得很远,但随后@Nicolas Barbey 发布了一个非常好的和简单的解决方案。

标签: python opencv numpy matplotlib


【解决方案1】:

这是一个使用 numpy、scipy 和 scikit-image(又名 skimage)的脚本。它利用局部最大值提取和分水岭加标签(即连通分量提取)。

import numpy as np
import scipy.misc
import scipy.ndimage
import skimage.feature
import skimage.morphology

# parameters
THRESHOLD = 128

# read image
im = scipy.misc.imread("JPh65.png")
# convert to gray image
im = im.mean(axis=-1)
# find peaks
peak = skimage.feature.peak_local_max(im, threshold_rel=0.9, min_distance=10)
# make an image with peaks at 1
peak_im = np.zeros_like(im)
for p in peak:
    peak_im[p[0], p[1]] = 1
# label peaks
peak_label, _ = scipy.ndimage.label(peak_im)
# propagate peak labels with watershed
labels = skimage.morphology.watershed(255 - im, peak_label)
# limit watershed labels to area where the image is intense enough
result = labels * (im > THRESHOLD)

【讨论】:

  • 非常感谢您的回答-您介意告诉我 scipy.ndimage.label 的作用以及 peak_label 如何在分水岭中使用吗?
  • scipy.ndimage.label 执行连接组件标记(它为一个由 0 包围的 1 像素的簇分配一个数字)。 peak_label 用于为分水岭设置种子(afaik 区域是通过分水岭算法从种子中生长出来的)。
  • 再次感谢@Nicolas 清除此问题。 - 只是一个愚蠢的问题:是否可以用随机数标记(似乎它正在增加)?
  • 您可以在之后更改标签编号,例如执行 result[result == 3] = 5 之类的操作。遍历标签索引和 np.random.rand 会给你一个随机数。
  • 如果您觉得我的回答对您有用并且对您有用,请不要犹豫,投赞成票;)
猜你喜欢
  • 2013-12-12
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
相关资源
最近更新 更多