在按图块标记灰度图像中的对象时处理不正确的非二进制标记

Posted

技术标签:

【中文标题】在按图块标记灰度图像中的对象时处理不正确的非二进制标记【英文标题】:Handling incorrect non binary labellling when labelling objects in a greyscale image by tile 【发布时间】:2021-08-05 04:58:52 【问题描述】:

我正在做一个项目,我有一个模型可以进行实例分割以分割图像中的细胞核。下一步将是标记这些分段的核。我通过将图像处理为图块来缩放标签。

我现在面临的问题是想出一种方法来处理不正确的标签。基本上,当有一个对象由于平铺而被分割时,它们的标签是不同的。

tile_size = 2048
  for x in range(0, vec_arr.shape[2], tile_size):
                        x_max = min([vec_arr.shape[2], x + tile_size])
                        for y in range(0, vec_arr.shape[1], tile_size):
                            y_max = min([vec_arr.shape[1], y + tile_size])

上面的代码解释了我是如何平铺图像的。我使用这个 repo(https://github.com/MouseLand/cellpose/blob/master/cellpose/dynamics.py#L574) 作为标记图像的基础,因为我正在使用他们的网络。我正在寻找有关如何识别跨图块连接的对象并用相同的值填充它们的想法。

目前,我维护了一个计数器,统计了在一个图块中标记的对象数量,并从该值开始标记。

我有兴趣了解如何跨图块识别相同的对象。

【问题讨论】:

【参考方案1】:

这并不容易。

首先,您需要在平铺中重叠。每个图块应与周围的图块重叠一定量,然后在重新合成较大的图像时将其切断。重叠量至少应为核大小,但最好更大。额外的空间是为了保证在您可以看到的两个瓷砖中相同地检测到跨越瓷砖边缘的核。

接下来,当切断重叠区域并分解较大的图像时,必须完全保留或完全移除跨越图块边缘的核(部分位于重叠区域),具体取决于它“属于”哪个图块。有不同的方法来定义它。例如,您可以计算核的质心,并确定在哪个瓦片中,然后从另一个瓦片中移除核。

因此,每个核都在一个图块中被检测到。但是,如果重叠区域不够大,则核的检测可能在两个重叠的瓦片中具有不同的形状,从而导致同一核的两个不同质心。在这种情况下,核可以被认为不是任一瓦片的一部分,或两个瓦片的一部分。了解检测算法很重要,这样您才能找到正确的重叠大小,以保证对两个图块进行相同的检测。

【讨论】:

感谢您的意见。我已经实现了瓷砖重叠。使用质心,我将获得对象所属的图块的信息。有哪些方法可以检测下一个图块中的对象,该对象在前一个图块中具有质心,反之亦然?这样可以在图块中填充相同的值。 @war_wick:也许最简单的方法是将图块中的对象复制到输出图像中,但只复制那些“属于”图块的对象。另一种方法是删除重叠区域中不属于瓦片的对象(包括瓦片内的部分)。这有点记账,但并不复杂。最难的部分是让检测在图块之间保持一致。

以上是关于在按图块标记灰度图像中的对象时处理不正确的非二进制标记的主要内容,如果未能解决你的问题,请参考以下文章

计算二值图像中的前景对象

使用 libpng 编写 1 位深度的灰度 PNG 会导致图像不正确

带有自定义图块的传单地图上的标记位置随着更高的缩放级别而变化

为啥工业相机进行数据图像处理的时候常常要进行灰度化和二值化

问下matlab里image和imagesc有啥相同处和区别啊,使用时应该如何选择?

如何在matlab中实现灰度形态检测灰度图像上的圆形物体?