如何从图像中删除某些背景?

信息处理 图像处理 过滤器
2022-01-07 09:29:26

橘子

这是经过 Gabor 滤波后得到的图像... 除了明亮的白色圆形缺陷之外,是否有某种方法可以去除图像内部的线条。

是否尝试了另一个方向的 gabor 过滤器,结果如下:

在此处输入图像描述

阈值后:这还可以,但不是很好

在此处输入图像描述

中值滤波后:

在此处输入图像描述

提前致谢

3个回答

如果您的 Gábor 过滤器的输出是可靠的,并且您的图像数据的变化不是那么高以至于结果看起来完全不同,那么您可以使用以下方法(其中部分已经提到):

  1. 使用任何自动阈值算法对第二张图像进行二值化。如您所见,有效的阈值范围很大。

  2. 使用组件标记算法用唯一值标记像素的每个连接区域。

  3. 为图像的每个组件计算一个属性,该属性描述了您的对象与实心圆的接近程度。为此,您可以使用例如compactness我使用了低于等效磁盘半径内的像素分数该半径是与您的对象具有相同面积的磁盘的半径。

    1. 面积只是计算对象的像素数
    2. 计算给定面积的圆的半径也应该是易于管理的
    3. 对于此半径内的像素,您需要每个图像对象的中心,但这只是对象像素所有位置的平均值。如果您是物理学家,那么您知道几个点质量的质心。这是等价的。
    4. 现在您计算每个对象的每个像素到其中心的距离,并检查它是否小于圆半径。将这两个数字相除,即可得到内部像素和外部像素的分数。
  4. 取分数最高的对象。注意:只有一个像素的对象将获得 1 的值。因此,您应该设置一个大小阈值,并且只采用更大的对象,例如 10 像素。

要查看自动二值化应该起作用,以下是阈值非常低和非常高的结果:

在此处输入图像描述 在此处输入图像描述

更新组件标签

组件标签的选择对您的应用并不重要。我建议,如果您必须自己实现它,请使用一种非常简单的方法。Wikipedia 网站上的一次性版本非常简单。基本上你遍历你的二进制图像,当你遇到一个白色且尚未标记的像素时,你使用一个新标签来标记这个对象并从这个像素开始。

用标签标记这个对象的过程基本上类似于洪水填充。这是 Wikipedia-site 算法中的内部步骤 1-4。你从这个带标签的像素开始,把它的所有邻居放在一个堆栈上(他们使用了一个向量)。对于堆栈上的像素,您检查它是否是前景并且尚未标记。如果你必须给它贴标签,你再把它的所有邻居都放在堆栈上。这样做直到你的堆栈为空。

然后继续扫描图像。与 Wiki 站点上的描述不同,您不必从原始图像中删除像素,当您的标签图像中的值不同于 0 时,您只需跳过。

一些想法:

  1. 根据边缘强度的密度过滤掉边缘。使用圆形内核的近似值,找到平均边缘强度(或其他一些度量)。通过等于或高于阈值的任何边缘,将低于阈值的任何边缘设置为黑色。
  2. 使用形态学“关闭”操作(先膨胀后腐蚀)清理图像,然后使用区域标记算法(又名连通分量,blob)查找所有 blob。根据大小、长轴与短轴的比率等过滤 blob 数据。
  3. 尝试高斯模糊,找到一个二值化阈值以从黑暗中分割光,然后按照上面步骤 2 中的描述过滤 blob。(为了快速近似高斯模糊,请紧闭眼睑并眯着眼睛看图像。)
  4. 在 Photoshop 或 GIMP 中尝试一些滤镜。

编辑:在你的中值过滤步骤之后,你大部分时间都在那里。好工作!我在上面建议的第 2 项(关闭,然后是区域标记)是一种技术,可以带你走完剩下的路。

您可以尝试活动轮廓。虽然它可能很慢,但它可以处理这样的复杂情况。

或者你可以使用一些先验知识来处理这个图像。例如,您知道 blob 事物是“大”和“连接”的。因此,当您计算每个连接区域的数量时,您可以找到它。