【问题标题】:How to count the number of spots in this image?如何计算这张图片中的点数?
【发布时间】:2015-12-31 17:26:10
【问题描述】:

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

P.S.根据其中一个答案,我尝试使用ImageJ提取斑点,但结果并不令人满意:

  1. 我打开了original 非倒置图像(警告!看到它的血腥和恶心!)。
  2. 拆分通道(图像 > 颜色 > 拆分通道)。并选择蓝色通道继续。
  3. 应用 Closing 过滤器(插件 > 快速形态 > 形态过滤器),具有以下值:操作:闭合,元素:方形,半径:2px
  4. 应用White Top Hat过滤器(插件>快速形态>形态过滤器)具有以下值:操作:白色礼帽,元素:方形,半径:17px

但是,我不知道在这一步之后该怎么做才能尽可能准确地计算移植点。我尝试使用(处理 > 查找最大值),但结果对我来说似乎不够准确(使用以下设置:噪声容限:10,输出:单点,不包括边缘最大值,浅色背景):

如您所见,一些白点已被忽略,一些实际上不是毛发移植点的白色区域已被标记。

您建议使用哪种过滤器来准确找到斑点?使用ImageJ 似乎是一个不错的选择,因为它提供了我们需要的大部分过滤器。但是,请随意建议如何使用其他工具、库(如 OpenCV)等。任何帮助将不胜感激!

【问题讨论】:

  • 与其自己实现,不如尝试使用 Emgu CV 库(.net 中的 OpenCV)。我过去用过一点,但不幸的是没有太多帮助。 emgu.com/wiki/index.php/Main_Page

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


【解决方案1】:

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

在下面,左边是你的裁剪图像,右边是发现的移植物。绿色用于突出显示不止一次移植的区域。

整体方法非常基本(稍后将描述),但它仍然提供接近准确的结果。请注意,这是第一次尝试,因此还有很大的改进空间。

无论如何,让我们回到最初的说法,即你的方法是错误的。有几个主要问题:

  1. 你的图片质量很差
  2. 你说你要找斑点,其实你是在找植发objects
  3. 您完全忽略了平均头部远非平坦这一事实
  4. 您确实认为过滤器会为您的初始图像添加一些重要细节
  5. 您希望算法为您施展魔法

让我们一一回顾所有这些项目。

1.图像质量

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

我敢打赌,尽管您的大脑中拥有最先进的对象识别算法,但您很难“阅读”这些作物。

此外,您的时间很昂贵,而且您仍然需要尽可能高的准确性和稳定性。因此,以任何合理的价格尝试获得:适当的对比度、锐利的边缘、更好的色彩和分色。

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

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

3.头部的形式不容忽视

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

3D model source

4.过滤器可能没有帮助

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

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

令人难过的是,您要处理更复杂的几何图形,而且几乎没有机会了解原始图片上的实际内容。

5.抱歉,这里没有魔法

请注意以下几点:

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

结果说明

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

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

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

终于

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

更新(工具和技术)

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

基本上,一切都是“手工”完成的。水平和垂直扫描,交叉点给出区域。垂直线被排序并用于恢复实际形状。方案是国产的,代码有点丑,不想分享了,抱歉。

这个想法很明显并且解释得很好(至少我是这么认为的)。下面是一个使用不同扫描步骤的附加示例:

又一次更新

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

更多示例可在 YouTube 上找到:RobotsCanSee

或在 Telegram 中关注进度:RobotsCanSee

【讨论】:

  • 您好,非常感谢您为准备如此出色的答案所付出的努力!您能否详细说明您使用什么软件/库来对图像进行分色?如果您已经编码,您能否也提供示例代码?如果您使用过软件,您应用了哪些设置?您如何确定进行不止一次移植的区域?最后,你用什么在每个确定的区域周围画线?
  • 你好@Meysam。 NP,有趣的任务。见更新。代码真的很简单,int[][]代表和image等等,没什么可分享的。请不要错过我回答的要点-使用适当的数据,您会发现几种方法可以解决您的问题。我确实实现了基本扫描只是为了好玩,当输入数据正常时它显示了很好的结果。
  • 谢谢,您的解决方案是一个很好的起点。让我看看我是否可以改进它:) 我会及时通知你。
【解决方案2】:

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

  1. 在原始图像上,针对每个通道
  2. 小(半径 1 或 2)闭合以去除毛发(白色中间的黑色部分)
  3. 半径为 5 的白色礼帽,用于检测每根黑头发周围的白色部分。
  4. 小关闭/打开以稍微清洁图像(您也可以使用中值过滤器)
  5. 最终腐蚀以计算剩余的白色斑点的数量。当然,您也可以使用 LoG(高斯拉普拉斯算子)或距离图。

[编辑] 使用最大值函数你不会检测到所有的白点,因为在关闭之后,一些区域是平坦的,所以最大值不是一个点,而是一个区域。在这一点上,我认为终极开放或终极侵蚀会给你中心或每个白点。但我不确定 ImageJ 中是否有一个功能/插件。你可以看看 Mamba 或 SMIL。

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

【讨论】:

  • 能否提供您在每个步骤中使用的 ImageJ 的相应功能的链接?可以分享您的示例代码吗?
  • 我在 ImageJ 中使用了插件过滤器“Fast Morphology”。然后你只需按照我的指示调用方法的名称,使用给定的参数(半径只有 1)。
  • 你在OpenCV中肯定有同样的功能
  • 您能否详细说明您在每个步骤中选择了哪些菜单项?没用过ImageJ的人很难理解“小关”的意思。
  • 好的,我可以找到所有这些,除了最后一个。 “终极侵蚀”在哪里?我只能找到“进程/二进制/侵蚀”。第一步,我使用了“图像/颜色/分割通道”,并选择了三个通道中的一个进行处理。是你的意思吗?
【解决方案3】:

正如 Renat 所提到的,您不应该期望算法为您施展魔法,但我希望能对点的数量做出合理的估计。在这里,我将为您提供一些提示和资源,请查看它们,如果您需要更多信息,请给我回电。

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

就是这样:

收集并集中地点周围的质量。 我的集中质量是什么意思?让我们从另一面打开书:如您所见,提供的图像包含一些显着点,周围环绕着一些嘈杂的灰度点

我所说的点是指不属于某个点的像素,但它们的灰度值大于零(纯黑色)——这些像素在点周围可用。很明显,如果您清除了这些嘈杂的点,您肯定会使用其他处理工具(例如形态学运算)对斑点进行良好的估计。

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

如何集中注意力?好吧,我刚刚解释的想法可以在this 论文中找到,幸运的是它的代码是可用的。请参阅第 2.2 节。主要思想是使用随机游走器永远在图像上行走。表述的公式使得步行者将更多次地访问突出点并且可以导致识别突出点。该算法采用马尔可夫链建模,遍历马尔可夫链的平衡命中时间是识别最显着点的关键。

我上面描述的只是一个提示,你应该阅读那篇简短的论文来获得这个想法的详细版本。如果您需要更多信息或资源,请告诉我。

很高兴思考这些有趣的问题。希望对您有所帮助。

【讨论】:

  • 嗨。将质量集中在斑点上是一个好主意,但我们必须看看将算法应用于该图像的可行性。您说源代码可用,但我似乎找不到源代码。你能指点我吗?
  • 这里是代码的链接。请注意,您使用了与质量浓度相关的部分代码。把结果反馈给我。 vision.caltech.edu/~harel/share/gbvs.php
  • 您好!我不知道我是否使用了正确的函数(gbvs),但生成的显着图如下:i.stack.imgur.com/0tVBA.jpg你知道我做错了什么吗?
  • @Meysam 好吧,让我检查一下。我会通知你结果。
  • 谢谢。非常感谢!
【解决方案4】:

您可以执行以下操作:

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

【讨论】:

    【解决方案5】:

    这是对图像应用不锐化半径 22、数量 5、阈值 2 后得到的结果。

    增加了点与周围区域之间的对比度。我使用了大概的假设,即这些点的直径在 18 到 25 像素之间。

    现在您可以将白色的局部最大值作为一个“点”并用黑色圆圈填充它,直到该点的圆形邻域(半径为 10-12 的圆圈)消除点。这应该让您“挑选”在超过 2 个集群中彼此连接的点。然后再次寻找局部最大值。冲洗并重复。

    实际的“点”区域与周围区域形成鲜明对比,因此这应该让您可以像通过眼球一样将它们挑选出来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      相关资源
      最近更新 更多