【问题标题】:Image segmentation with a wide range of intensity values (Otsu thresholding)具有广泛强度值的图像分割(Otsu 阈值)
【发布时间】:2023-02-10 13:57:21
【问题描述】:

我有这样的原始显微镜图像:

我想分割对象,因为你看到其中一些非常接近并且我有很大范围的强度值。

背景:700 a.u.

荧光形状:从 7000 到 32000 a.u.

为了分割它们,我使用了 skimage 包中的 Otsu 二进制分割(没有事先处理图像)

thresh, imgthresh=cv2.threshold(图像, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

结果非常好,但仍然无法将最亮的形状检测为单个对象。

我尝试了很多东西:分水岭算法、图像预处理(模糊)、侵蚀、自适应阈值处理,但没有任何效果正常,因为主要问题是图像荧光值的差异。

关于如何解决这个问题的任何聪明想法?

【问题讨论】:

  • 请向我们展示您的二值化结果。
  • 你想看数组吗?
  • 你怎么称呼数组?
  • 什么是“a.u.”以及如何将它们存储在常规图像中?
  • 一个。是对应于图像中任何像素的强度值的任意单位。

标签: python image-processing image-segmentation


【解决方案1】:

由于您的数据具有如此大的强度值范围,因此在整个图像上基于单一直方图的方法(例如 Otsu)在完成此任务时会遇到一些麻烦。我认为你最好的选择是:

  1. threshold_multiotsu:并根据强度“簇”的数量选择类别数量。不幸的是,您可能需要逐个图像地更改类的数量,因此这不是超级稳健的。
  2. threshold_local:我知道你说过你尝试过这个,但你可能会重新访问它并更改 block_size 参数,直到你得到看起来合理的东西。根据您的示例图像(并假设一点关于为什么您的示例图像中的对象是绿色的)看起来空间上彼此接近的对象通常具有相似的强度值。此外,您可能不必像在选项 1 中那样检查和更改参数。

    我怀疑这些将是最简单和最直接的方法,但您也可以使用 skimage.feature 中的内容深入研究识别对象边缘,然后填充对象。也许像这里的大纲:https://scikit-image.org/docs/stable/auto_examples/features_detection/plot_blob.html。这会涉及更多一些,但这些方法应该更稳健,可以识别强度值变化很大的物体。

    如果一切都失败了,你可以尝试几个 SOTA 包。我想到的主要是https://github.com/stardist/stardisthttps://github.com/MouseLand/cellpose,但根据此处的示例数据,这些似乎有点矫枉过正。

【讨论】:

    猜你喜欢
    • 2012-10-08
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 2014-06-09
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    相关资源
    最近更新 更多