
一句话介绍: 这套 MATLAB 程序以 bacteria.jpg 为当前实际输入,先转为灰度图并加入密度为 0.02 的椒盐噪声,再分别使用传统 FCM 和引入局部邻域信息的 FLICM 完成二类聚类分割;FLICM 通过 3×3 邻域、空间距离和邻域隶属度构造模糊因子,使单个像素的分类不再只由自身灰度决定。
普通 FCM 用在灰度图像分割时,可以把每个像素看成一个样本,再根据像素灰度与聚类中心之间的距离进行模糊聚类。
问题在于:
图像不是一堆彼此独立的像素。
一个像素通常与周围像素具有明显的空间连续性。如果图像中出现椒盐噪声,某个原本属于暗背景的像素可能突然变成极亮值,或者一个亮目标像素突然变成极暗值。只按照这个像素自身的灰度判断,很容易受到孤立噪声干扰。
当前程序因此同时做两条处理链:
带噪灰度图 → FCM → 最大隶属度判决 → FCM 分割结果
带噪灰度图 → 建立局部邻域 → FLICM 迭代 → 最大隶属度判决 → FLICM 分割结果
两种方法使用的是同一幅带噪图像、同样的二分类设置,区别主要在于:
FCM 只使用像素自身信息,而 FLICM 进一步把周围像素的信息纳入当前像素的聚类判断。
1. 当前程序实际处理的是哪幅图像?
程序使用 rgb2gray 将 RGB 图像转换成灰度图,所以最终参与聚类的数据规模为:
150 × 150 = 22500 个灰度像素
随后通过 g(:) 把二维图像展开成一个 22500 × 1 的一维样本向量。
对于这个程序来说,每一个样本只有一个特征:
灰度值。
当前设置 k = 2,因此程序要把全部像素划分成两个灰度簇。结合当前细菌图像的亮暗结构,可以把它理解为对亮区域和暗区域进行二类分离,但源码本身并没有把“簇 1”“簇 2”固定命名为菌体或背景。
2. 程序到底给图像加入了什么噪声?
当前源码使用:
imnoise(I,'salt & pepper',0.02)
因此实际加入的是:
椒盐噪声,噪声密度为 0.02。
也就是名义上约有 2% 的像素受到随机脉冲噪声干扰。
这里有一个值得注意的源码细节:当前注释和显示标题中写的是“高斯噪声”,但真正调用的 imnoise 类型明确是 'salt & pepper'。
因此理解实验时应以实际函数调用为准:
当前程序比较的是 FCM 与 FLICM 在椒盐噪声条件下的图像聚类分割,而不是高斯噪声实验。
另外,源码没有固定随机种子。
这意味着每次调用 imnoise 时,被污染的具体像素位置可能不同,后面的模糊聚类初始化也存在随机性,因此不同运行之间的聚类中心、迭代次数、目标函数以及局部标签编号都可能存在变化。
3. 传统 FCM 在这里是怎样完成图像分割的?
程序首先把 FCM 作为对照方法。
输入为:g(:)
聚类数为:k = 2
随后直接调用 MATLAB 的 fcm:
[O,U,obj_fcn1] = fcm(g(:), k);
其中:
O:两个聚类中心;
U:每个像素对两个簇的隶属度;
obj_fcn1:FCM 迭代过程中的目标函数值。
FCM 并不会一开始就强制某个像素只能属于一个类别。
例如一个灰度像素可能同时具有:
对簇 1 的隶属度;对簇 2 的隶属度。
程序最后取每个像素的最大隶属度:
maxU = max(U);
哪个簇的隶属度最大,就把该像素最终标记成哪个类别。
因此当前 FCM 支路实际上完成的是:
灰度像素 → 模糊隶属度 → 最大隶属度硬判决 → 二类标签图
它能够利用灰度差异完成聚类,但没有使用像素在二维图像中的空间关系。
4. 为什么只用 FCM 容易受到椒盐噪声影响?
FCM 判断一个像素属于哪个簇,核心依据是:
这个像素的灰度值距离哪个聚类中心更近。
这对于普通聚类很自然,但图像中的椒盐噪声恰好会制造极端灰度。
假设一片背景区域整体比较暗,其中某个像素突然被椒盐噪声变成很亮。
传统 FCM 看到的是:“这个像素现在很亮。”
它并不知道:“这个像素周围其实几乎全是暗背景。”
因此孤立的异常灰度可能直接影响分类。
而在真实图像中,空间邻域往往提供了额外信息:
周围像素是什么类别,本身就是判断当前像素的重要依据。
FLICM 正是利用了这一点。
5. FLICM 比普通 FCM 多加入了什么信息?
FLICM 的关键不是换掉整个模糊 C 均值框架,而是在原有灰度距离之外增加一个:
局部模糊因子 G。
对于第 i 个像素属于第 k 个簇的情况,当前代码中的局部项可以概括为:
Gₖᵢ = Σⱼ∈Nᵢ [(1-uₖⱼ)ᵐ · ‖xⱼ-vₖ‖² / (dᵢⱼ+1)]
这里真正需要理解的是四件事:
Nᵢ:当前像素周围的邻域像素;
uₖⱼ:邻域像素 j 对第 k 个簇的隶属度;
‖xⱼ-vₖ‖²:邻域像素灰度与第 k 个聚类中心之间的平方距离;
dᵢⱼ:当前像素与邻域像素之间的空间距离。
当前模糊指数默认:m = 2
如果一个邻域像素本身就非常符合第 k 个簇,那么 1-uₖⱼ 会比较小,它产生的惩罚也较小。
反过来,如果周围很多像素都不支持当前像素属于这个簇,局部模糊因子就会对这一分类产生更明显的约束。
空间距离还会进一步调节这种影响:
离当前像素越近的邻域位置,对局部判断的作用越强。
因此 FLICM 不再只问:
“这个像素的灰度像哪个簇?”
而是进一步问:
“它周围的局部结构是否也支持这个判断?”
6. 3×3 邻域是怎样建立起来的?当前主程序设置:r = 3
这里的 r 表示局部窗口的边长,因此使用的是:3 × 3 邻域窗口。
FLICM_find_neighbor.m 首先给整幅图像的每个像素建立位置编号,再在边界处进行镜像式扩展,然后为每一个像素提取对应的 3×3 位置窗口。
3×3 一共有 9 个位置。
程序随后删除中心像素自身,因此每个像素最终保留:8 个邻域位置。
所以对于当前 150×150 图像,neighbor_pos 实际描述的是:
22500 个像素各自对应的 8 个邻域位置。
程序还同时计算邻域中的空间距离 window_d。
在 3×3 窗口中:上、下、左、右距离为 1;四个对角邻居距离为 √2。
FLICM 中又使用 1/(d+1) 对邻域贡献进行调节,因此距离更近的位置获得更大的局部权重。
这个邻域表只需要在进入 FLICM 前建立一次,后续每一轮迭代都可以重复使用。
7. FLICM 每轮迭代具体更新什么?
FLICM.m 先通过 initfcm 随机初始化模糊隶属度矩阵 U,然后不断调用 FLICM_step.m。
一轮更新的主线可以压缩成:
当前隶属度 U → 更新聚类中心 → 计算灰度距离 → 计算邻域模糊因子 G → 更新隶属度 U → 判断是否收敛
首先对隶属度进行指数加权:mf = Uᵐ
然后根据模糊权重更新聚类中心。
由于当前输入只有一个灰度特征,所以两个聚类中心本质上就是两个经过隶属度加权的灰度中心。
接着 distfcm 计算每个像素与两个聚类中心之间的距离。
FLICM 再把:
像素自身距离 + 邻域模糊因子
组合起来。
可以定义:
Qₖᵢ = (‖xᵢ-vₖ‖² + Gₖᵢ)^(1/(m-1))
新的隶属度就是:
uₖᵢ = (1/Qₖᵢ) / Σ_c(1/Q_cᵢ)
这一步最关键的变化是:
某个像素即使灰度上很接近某个聚类中心,只要它的局部邻域明显不支持这个类别,最终隶属度也会受到 G 的修正。
这就是 FLICM 相比普通 FCM 更适合处理局部噪声干扰的核心机制。
8. 当前 FLICM 使用什么停止条件?
FLICM.m 给出的默认参数为:
参数 | 当前值 | 作用 |
|---|---|---|
模糊指数 expo | 2 | 控制隶属度的模糊程度 |
最大迭代次数 | 300 | 防止迭代无限持续 |
最小改进量 | 1e-5 | 用于判断隶属度是否已经稳定 |
迭代信息显示 | 0 | 默认不逐轮打印信息 |
程序不是直接根据目标函数变化停止,而是比较连续两轮隶属度矩阵:
‖U_old - U_new‖ 的 Frobenius 范数 < 1e-5
满足条件就提前结束。
否则最多执行:300 次迭代。
目标函数 obj_fcn 会把实际执行轮数对应的数据保留下来,其余预分配位置被删除。
当前程序还通过 cputime 单独记录 FLICM 计算时间,保存为:
time_FLICM
不过 FCM 支路没有做相同的计时,因此源码目前并没有形成严格的 FCM/FLICM 运行时间对比实验。
9. FLICM 最后怎样重新变回一幅分割图?
FLICM 返回的 U10 仍然是模糊隶属度矩阵。
程序和 FCM 使用完全相同的后处理方式:
对每个像素寻找最大隶属度 → 记录对应簇编号 → reshape 回原图尺寸
最终得到:labels10
尺寸仍然是:150 × 150
因此算法内部处理的是 22500×1 的样本向量,最后又恢复成与原图一一对应的二维标签图。
这里还要注意一个模糊聚类的常见现象:
簇编号本身没有固定语义。
由于初始化是随机的,一次运行中亮区域可能对应标签 1,另一次也可能对应标签 2。
因此判断分割是否一致时,应关注:
哪些像素被划到同一类以及区域结构是否一致
而不是把“类别 1”永久理解成背景或目标。
10. 当前程序能不能直接证明 FLICM 一定优于 FCM?
当前程序具备一个很清楚的比较条件:
同一幅图 → 同一次椒盐噪声污染 → 同样 k=2 → 分别执行 FCM 与 FLICM
所以它非常适合观察:
加入局部空间信息前后,分割结果会发生什么变化。
从算法机制看,FLICM 明确使用了 8 邻域信息,而 FCM 没有,因此当图像中出现孤立椒盐噪点时,FLICM 具备抑制这种局部异常影响的机制基础。
但当前工程没有计算:
分割准确率;
Dice;IoU;PSNR;与人工真值的误差;
多次随机实验的平均结果。
同时也没有保存一个固定随机种子。
因此依据当前源码,适合得出的结论是:
FLICM 在当前实现中增加了明确的局部邻域约束,可以直接与普通 FCM 做抗局部噪声机制和分割效果对照;但工程没有提供定量评价指标,不能凭空给出固定精度或“提升多少百分比”的结论。
11. 当前程序最终能够得到什么?
这套程序的主要技术输出包括:
FCM 的两个聚类中心 O;FCM 隶属度矩阵 U;
FCM 目标函数序列 obj_fcn1;FCM 二类标签图 fcm_result;
FLICM 的聚类中心 O10;FLICM 隶属度矩阵 U10;
FLICM 目标函数序列 obj_fcn10;
FLICM 二类标签图 labels10;FLICM 的 CPU 计时 time_FLICM。
从程序结构上看,它不是一个训练模型,也不需要提前准备标签。
输入就是图像本身,算法直接根据:
灰度差异 + 模糊隶属度 + 局部空间关系
完成无监督聚类分割。
当前工程也没有把分割结果自动保存到文件,结果主要通过 MATLAB 工作区变量和图像显示进行观察。
12. 它适合用在哪里?
程序同时保留了标准 fcm 和自定义 FLICM 两条路径,非常适合观察:
普通 FCM → 加入局部信息后的 FLICM
到底改变了哪一部分计算。
尤其是 FLICM_step.m 把聚类中心、灰度距离、局部模糊因子和隶属度更新集中在一起,比较适合算法学习和课程实验。
当前主程序主动向图像加入椒盐噪声,再进行二类聚类,所以适合研究:
局部空间信息对脉冲噪声干扰的抑制作用。
这类实验更适合离线算法验证,而不是直接当作在线图像处理系统。
两种算法使用完全相同的带噪输入,因此可以进一步扩展:
改变噪声密度;改变邻域尺寸;改变聚类数;记录目标函数;增加定量分割指标;
用来分析局部信息加入以后对聚类行为的影响。
当前默认 k=2,并且样例图像具有比较明显的亮暗区域,因此适合作为:
目标/背景二类灰度分割
的基础实验。
如果要处理多类别彩色图像、复杂纹理、监督语义分割或实时视频,当前程序还需要进一步扩展,不能直接把这套单图像 Demo 等同于完整视觉系统。
13. 哪些参数最值得修改?
当前程序里真正会明显改变实验行为的参数主要有下面几个。
参数 | 当前值 | 为什么值得改 | 调整后的主要影响 |
|---|---|---|---|
k | 2 | 直接决定聚类类别数量 | 增大后可尝试多区域聚类,但结果解释也更复杂 |
r | 3 | 决定 FLICM 使用多大的局部邻域 | 增大可纳入更大范围空间信息,同时计算量明显增加 |
椒盐噪声密度 | 0.02 | 直接控制实验中的噪声强度 | 增大后可以进一步测试算法对随机脉冲噪声的稳定性 |
expo | 2 | 决定隶属度的模糊程度 | 改变后会影响聚类边界与隶属度分布 |
min_impro | 1e-5 | 决定迭代停止精度 | 更小通常要求更严格收敛,也可能增加迭代时间 |
其中最有实验价值的通常是:
噪声密度 + 邻域尺寸r。
前者改变问题难度,后者改变 FLICM 可以利用多少局部空间信息,两者结合起来最容易观察算法机制。
14. 怎么运行?
按当前源码直接执行时,程序实际分析 bacteria.jpg。
运行环境需要能够调用图像处理相关函数:
rgb2gray、imnoise、imshow
同时需要能够调用模糊聚类相关函数:
fcm、initfcm、distfcm
因此按当前源码运行,需要相应 MATLAB 图像处理和模糊逻辑函数可用。
如果希望改成处理 romantic.jpg,不能只修改第一条 imread,因为它后面仍会被 bacteria.jpg 覆盖。应删除、注释或修改第二条读图语句,使最终保留下来的 I 就是希望处理的图像。
如果准备换成自己的图像,最小修改入口同样是:
I = imread(...)
当前程序随后会统一转灰度,因此更适合直接用于二维灰度聚类实验。
还需要注意两点:
当前实际噪声类型是 'salt & pepper',不是源码标题中写的高斯噪声;
当前没有固定随机种子,如果需要严格复现实验,应在加噪声和初始化聚类之前固定 MATLAB 随机数状态。
15. 一句话看懂这个项目
这是一个FCM/FLICM 图像聚类分割程序:当前源码实际读取 150×150 的bacteria.jpg,转成灰度图后加入密度 0.02 的椒盐噪声,把 22500 个像素灰度分别送入二类 FCM 和 FLICM;其中 FLICM 使用 3×3 窗口产生每像素 8 个邻域位置,把邻域隶属度、邻域灰度到聚类中心的距离以及空间距离共同构造成局部模糊因子,再迭代更新聚类中心与隶属度,最终恢复为二类标签图。它最适合用于 FCM/FLICM 算法教学、椒盐噪声下的离线图像分割和局部空间信息抗噪机制对照实验;当前工程没有固定随机种子和定量分割评价指标,因此不应把某一次视觉结果写成固定精度结论。