照明对matlab中图像分割的影响

effect of ligting on image segmentation in matllab

我正在尝试对下图进行分割任务。

我正在使用带有一些最小预处理的模糊 c 均值。分割将有 3 classes:背景(蓝色区域)、肉类(红色区域)和脂肪(白色区域)。背景分割效果很好。然而,照片左侧的肉和脂肪分割将大量肉组织映射为脂肪。最后的肉面膜是这样的:

我怀疑这是因为光照条件使左侧更亮,因此算法 class将该区域确定为胖 class。此外,我认为如果我能以某种方式使表面更光滑,可能会有一些改进。我使用了一个 6x6 中值滤波器,它工作正常,但我愿意接受新的建议。有什么建议可以解决这个问题吗?可能是某种平滑? 谢谢:)

编辑 1: 脂肪区域大致标记在下面的照片中。顶部区域是模棱两可的,但正如 rayryeng 在评论中提到的那样,如果它对我作为一个人来说是模棱两可的,那么算法也可以错误 class 化它。但左边的部分显然全是肉,算法将其中很大一部分指定为脂肪。

分割的第一个规则是"try to describe how you (as a human being) were able to do the segmentation"。一旦你这样做了,算法就变得清晰了。 换句话说,您必须执行以下 2 个任务:

  1. 确定每个分割部分的独特特征(在您的情况下 - 脂肪和肉有什么区别)。
  2. 选择最适合您的分类器(C 均值、神经网络、SVM、决策树、Boosted 分类器等)。该分类器将对步骤 1 中选择的特征进行操作

看来你跳过了第1步,那是你算法的问题。

以下是我的观察:

  1. 像素的亮度不区分肉和脂肪。它主要取决于照明、组织角度和镜面反射。所以必须去掉亮度
  2. 好像胖了点"yellow"。换句话说,肉类的红色/绿色比例比脂肪高得多。这是我将开始实施的功能。为了获得该功能,将您的 RGB 图像转换为 YUV or HSV 颜色 space。如果你使用 YUV 完全丢弃 Y 和 运行 你在 V 平面上的分类器。在 HSV 运行 它在 H 平面上。这样您将丢弃亮度并仅处理颜色(主要是红色和绿色分量)。我还建议使用这些颜色 spaces 进行背景分离。
  3. 下一步 - 您应该向分类器添加更多功能,因为颜色不够用。另一个观察结果是,肉是一种更柔韧的组织,因此它上面会有更多皱纹,而且脂肪往往更光滑。您可以搜索边并将边的绝对数量作为另一个特征插入到您的分类器中。
  4. 继续观察你的结果,找出分类器在哪里出错,并尝试提出其他新特征来更好地分离两种纹理。在您的情况下可能非常好的功能示例:HOG、图像金字塔上的 LBP、MCT 功能、三个补丁 lbp、(x,y) 投影。我的直觉告诉我 three-patch-lbp 对你的帮助最大,但我很难解释为什么。
  5. 个人建议:不知道Matlab实现了哪些功能。但是您应该从已经存在的功能开始,以节省编写大量新代码的时间。例如,我知道 HAAR 功能已经在 matlab 中实现,但它们本身可能不足以描述您的情况。结合几种类型的特征以获得最强的结果并避免使用重叠特征(捕获图像中几乎相同信息的两种不同特征)。例如 - 如果您使用 MCT,请不要使用 LBP。

有关更多信息,您可以阅读我关于纹理相似性的回答 here。你有一个反向问题(而不是测量相似性,你想训练一个区分非相似纹理的分类器)。但解决方案的框架是相同的。识别区分纹理的重要特征,将特征连接到向量和 运行 分类器。您可以 运行 每个像素或小区域图像块(比如 5x5 像素)上的分类器。您期望的结果是训练这样一个智能分类器,对于图像中的每个补丁,它都可以告诉您它更像一块肉还是一块脂肪

如果您没有输出标签,则需要应用无监督学习算法进行分类。 对于许多图像,人眼并不是进行分类的完美工具。这就是我们使用计算机的原因 :D 因为它可以向我们展示强度的分布并提供不同的 类。 一种替代方法是使用连接组件来识别和分离肥肉和 BG 类,因为它们具有完全不同的强度,除了均值和脂肪之间的边缘。

您可以看到我使用不同参数进行基于阈值的分割的输出。请让我知道这是否是您想要的,以便我可以为您提供代码支持。 最佳