如何计算此图片中的点数?

时间:2015-10-03 17:03:02

标签: algorithm image-processing computer-vision image-segmentation imagej

我正在尝试计算下图中移植的头发数量。所以实际上,我必须计算在图像中心可以找到的斑点数量。 (我已经上传了秃头皮的倒置图像,因为原始图像是血腥且非常令人厌恶的,所以已经移植了新的毛发!要查看原始的非倒置图像,请单击{{3要查看更大版本的倒置图像,只需单击它即可。是否有任何已知的图像处理算法来检测这些斑点?我发现here算法可用于查找图像中的圆圈,我不确定它是否是可用于查找小点的最佳算法但是在下图中。

Circle Hough Transform

P.S。根据其中一个答案,我尝试使用enter image description here提取斑点,但结果不够令人满意:

  1. 我打开了ImageJ非反转图像(警告!它看起来很血腥恶心!)。
  2. 分割频道(图像>颜色>分割频道)。并选择蓝色通道继续。
  3. 应用Closing过滤器(插件>快速形态>形态过滤器)及其值:操作:关闭,元素:方形,半径:2px
  4. 应用White Top Hat滤镜(插件>快速形态>形态滤镜)及其值:操作:白顶帽,元素:正方形,半径:17像素 original
  5. 但是,在此步骤之后我不知道该怎么做才能尽可能准确地计算移植斑点。我尝试使用(处理>查找最大值),但结果对我来说似乎不够准确(使用这些设置:噪音容限:10,输出:单点,排除边缘最大值,浅背景):

    enter image description here

    正如你所看到的,已经忽略了一些白点,并且已经标记了一些实际上不是毛发移植点的白色区域。

    您建议使用哪些过滤器来准确找到斑点?使用ImageJ似乎是一个不错的选择,因为它提供了我们需要的大多数过滤器。但是,请随意使用其他工具,库(如OpenCV)等建议做什么。任何帮助都将受到高度赞赏!

5 个答案:

答案 0 :(得分:31)

我认为你试图以一种错误的方式解决问题。这可能听起来毫无根据,所以我最好先展示我的结果。

下面我左边有一张你的图像,并在右边发现了移植物。绿色用于突出显示多个移植区域。

enter image description here

整体方法非常基础(稍后将对其进行描述),但它仍能提供接近准确的结果。请注意,这是第一次尝试,因此有很多增强空间。

无论如何,让我们回到最初的陈述,说你接近是错的。有几个主要问题:

  1. 你的形象质量太差了
  2. 你说你想找点,但实际上你正在寻找头发移植objects
  3. 你完全忽略了平均头部远非平坦的事实
  4. 看起来您认为过滤器会为您的初始图片添加一些重要细节
  5. 你希望算法为你做魔术
  6. 让我们逐一审核所有这些项目。

    <强> 1。图像质量

    这可能是非常明显的陈述,但在实际处理之前,您需要确保您拥有最佳的初始数据。您可能花费数周时间尝试找到一种方法来处理您没有任何重大成就的照片。以下是一些有问题的领域:

    enter image description here

    我敢打赌你很难阅读&#34;尽管你的大脑中有最先进的物体识别算法,但这些作物仍然存在。

    此外,您的时间很昂贵,您仍然需要最佳的准确性和稳定性。因此,对于任何合理的价格,尝试获得:适当的对比度,锐利的边缘,更好的颜色和颜色分离。

    <强> 2。更好地理解要识别的对象

    一般来说,您要识别3D对象。因此,您可以分析阴影以提高准确性。顺便说一下,它几乎就像是火星表面分析:)

    enter image description here

    第3。不应忽视头部的形式

    由于头部的形状,你有扭曲。同样,为了获得适当的准确度,应在实际分析之前纠正这些失真。基本上,您需要展平分析区域。

    enter image description here

    3D model source

    <强> 4。过滤器可能无法提供

    过滤器不会添加信息,但可以轻松删除一些重要细节。你已经提到了Hough变换,所以这里有一个有趣的问题:Find lines in shape

    我将以此问题为例。基本上,您需要从给定图片中提取几何图形。形状中的线条看起来有点复杂,因此您可能决定使用skeletonization

    enter image description here

    所有的悲伤,你有更复杂的几何形状来处理,几乎没有机会了解原始图片上的实际情况。

    <强> 5。对不起,这里没有魔法

    请注意以下事项:

    enter image description here

    您必须尝试获得更好的数据,以获得更好的准确性和稳定性。模型本身也很重要。

    结果解释

    正如我所说,我的方法非常简单:图像被分色,然后我使用非常基本的算法来识别具有特定颜色的区域。

    enter image description here

    可以更聪明的方式进行分色,可以改善区域检测等。对于这个PoC,我只有一个简单的规则来突出显示具有多个种植体的区域。确定区域可以进行更高级的分析。

    无论如何,更好的图像质量将让您使用更简单的方法并获得适当的结果。

    <强>最后

    诊所如何设法让Yondu成为客户? :)

    enter image description here

    更新(工具和技术)

    • 海报化 - GIMP(默认设置,最小颜色)
    • 移植识别和可视化 - Java程序,无库或其他依赖
    • 确定区域后很容易找到平均大小,然后与其他区域进行比较,并将显着更大的区域标记为多次移植。

    基本上,一切都已完成&#34;手工&#34;。水平和垂直扫描,交叉点给出区域。垂直线被排序并用于恢复实际形状。解决方案是自产自销,代码有点难看,所以不想分享它,抱歉。

    这个想法非常明显并得到了很好的解释(至少我是这么认为的)。以下是使用不同扫描步骤的其他示例:

    enter image description here

    又一次更新

    为验证一个非常基本的想法而开发的一小段代码进化了一些,现在它可以实时处理4K视频分割。这个想法是一样的:水平和垂直扫描,由相交线定义的区域等。仍然没有外部库,只是很多乐趣和更优化的代码。

    enter image description here

    enter image description here

    可以在此处找到其他示例:RobotsCanSee

答案 1 :(得分:5)

我刚刚使用ImageJ测试了这个解决方案,它给出了很好的初步结果:

  1. 在原始图像上,为每个频道
  2. 小(半径1或2)关闭以摆脱头发(白色中间的黑色部分)
  3. 半径为5的白色礼帽,用于检测每根黑发周围的白色部分。
  4. 小的关闭/打开以便清理一点图像(您也可以使用中值滤镜)
  5. 终极侵蚀以计算剩余的白色斑点的数量。你当然也可以使用LoG(高斯拉普拉斯算子)或距离图。
  6. [编辑] 您没有使用最大值函数检测到所有白点,因为在关闭后,某些区域是平坦的,因此最大值不是一个点,而是一个区域。在这一点上,我认为最终的开放或最终的侵蚀会给你中心或每个白点。但我不确定在ImageJ中是否有一个函数/插件。你可以看看Mamba或SMIL。

    H-maxima(在白色礼帽之后)也可以清洁你的结果,并改善白点之间的对比度。

答案 2 :(得分:3)

正如Renat所说,你不应该期望算法为你做魔术,但是我希望能够合理地估计出斑点的数量。在这里,我将给你一些提示和资源,检查出来,如果你需要更多信息,请给我回电。

首先,我对形态学操作抱有希望,但我认为完美的预处理步骤可能会大大提高它们所产生的准确性。我希望你把手指放在预处理步骤上。因此,我将使用此图像:

Enter image description here

这就是这个想法:

收集并集中在现场附近的群众。我的意思是我集中群众?让我们从另一边打开这本书:如你所见,提供的图像包含一些突出点被一些n oisy灰度级点包围。

按点,我指的是不属于光斑的像素,但是它们的灰度值大于零(纯黑色) - 这些像素可以在斑点周围获得。很明显,如果你清除这些嘈杂的点,你肯定会使用其他处理工具(如形态学操作)来估计斑点。

现在,如何让图像更清晰?如果我们可以让点向前移动到最近的位置怎么办?这就是我所说的将质量集中在斑点上。这样做,只有突出的斑点才会出现在图像中,因此我们在计算突出斑点方面迈出了重要的一步。

如何做集中的事情?好吧,我刚才解释过的想法可以在this论文中找到,它的代码很幸运。见2.2节。主要想法是使用随机助行器在图像上行走永远。陈述了这样的配方,使得助行器将更多次访问突出的位置并且可以导致识别突出的斑点。该算法建模马尔可夫链,遍历马尔可夫链的平衡点击次数是识别最突出点的关键。

我上面描述的仅仅是一个提示,您应该阅读该简短的论文以获得该想法的详细版本。如果您需要更多信息或资源,请与我们联系。

很高兴考虑这些有趣的问题。希望它有所帮助。

答案 3 :(得分:2)

您可以执行以下操作:

  1. 使用cv :: threshold
  2. 阈值图像
  3. 使用cv :: findcontour
  4. 查找连接的组件
  5. 拒绝大小超过特定尺寸的连接组件,因为您似乎只关注小圆形区域。
  6. 计算所有有效的连接组件。
  7. 希望你有一个实际点数的下降近似值。
  8. 为了在统计上更准确,您可以重复1-4一系列阈值并取平均值。

答案 4 :(得分:2)

这是将unsharpen radius 22,amount 5,threshold 2应用于图像后得到的结果。

增加点与周围区域之间的对比度。我使用球场假设点的直径在18到25像素之间。

现在你可以将白色的局部最大值作为&#34;点&#34;并用黑色圆圈填充,直到圆点的圆形邻域(半径为10-12的圆圈)擦除圆点。这应该让你“挑选”#34;这些点以超过2的簇的形式相互连接。然后再次查找局部最大值。冲洗并重复。

实际的&#34; dot&#34;区域与周围区域形成鲜明对比,所以这应该让你可以通过观察它来捡起它们。

Unsharpen radius 22, amount 5, threshold 2.