基于模糊C均值聚类(FCM)的图像分割原理+python代码详解
一、模糊
“模糊”:一个元素可以不同程度的属于某几个子集,也就是说元素对于集合的隶属度可以在[0,1]上取连续值。
二、步骤
2.1步骤
翻译一下:
S1:初始化参数:加权指数m,簇心数目C,以及迭代停止阈值ε。
S2:随机初始化隶属度矩阵U,注意满足式(2-2)。
S3:式(2-3)更新簇心c。
S4:式(2-4)更新隶属度矩阵U
S5:如果隶属度矩阵U满足式(2-5)则返回U并结束算法,否则转到S2
各种式如下:
2.2流程图
流程图比步骤多的一项是计算目标函数J,这一步可有可无,为了观察目标函数的变化趋势,我们在流程图和代码里都加上了计算目标函数这一步。
三、代码
import numpy as np
import matplotlib.pyplot as plt
import time
star = time.time() # 计时
img = plt.imread('1.jpg') # 读取图片信息,存储在一个三维数组中
row = img.shape[0]
col = img.shape[1]
plt.figure(1)
plt.subplot(221)
plt.imshow(img)def fcm(data, threshold, k, m):# 0.初始化data = data.reshape(-1, 3)cluster_center = np.zeros([k, 3]) # 簇心distance = np.zeros([k, row*col]) # 欧氏距离times = 0 # 迭代次数goal_j = np.array([]) # 迭代终止条件:目标函数goal_u = np.array([]) # 迭代终止条件:隶属度矩阵元素最大变化量# 1.初始化Uu = np.random.dirichlet(np.ones(k), row*col).T # 形状(k, col*rol),任意一列元素和=1# for s in range(50):while 1:times += 1print('循环:', times)# 2.簇心updatefor i in range(k):cluster_center[i] = np.sum((np.tile(u[i] ** m, (3, 1))).T * data, axis=0) / np.sum(u[i] ** m)# 3.U update# 3.1欧拉距离for i in range(k):distance[i] = np.sqrt(np.sum((data - np.tile(cluster_center[i], (row * col, 1))) ** 2, axis=1))# 3.2目标函数goal_j = np.append(goal_j, np.sum((u**m)*distance**2))# 3.3 更新隶属度矩阵oldu = u.copy() # 记录上一次隶属度矩阵u = np.zeros([k, row * col])for i in range(k):for j in range(k):u[i] += (distance[i] / distance[j]) ** (2 / (m - 1))u[i] = 1/u[i]goal_u = np.append(goal_u, np.max(u - oldu)) # 隶属度元素最大变化量print('隶属度元素最大变化量', np.max(u - oldu), '目标函数', np.sum((u**m)*distance**2))# 4.判断:隶属度矩阵元素最大变化量是否小于阈值if np.max(u - oldu) <= threshold:breakreturn u, goal_j, goal_uif __name__ == '__main__':img_show, goal1_j, goal2_u = fcm(img, 1e-09, 5, 2)img_show = np.argmax(img_show, axis=0)# plt.figure(2)plt.subplot(223)plt.plot(goal1_j)plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.title('目标函数变化曲线')plt.xlabel('迭代次数')plt.ylabel('目标函数')# plt.figure(3)plt.subplot(224)plt.plot(goal2_u)plt.title('隶属度矩阵相邻两次迭代的元素最大变化量变化曲线')plt.xlabel('迭代次数')plt.ylabel('隶属度矩阵相邻两次迭代的元素最大变化量')# plt.figure(1)plt.subplot(222)plt.imshow(img_show.reshape([row, col]))end = time.time()print('用时:', end - star)plt.show()
四、代码怎么用?
第一步,需要把待分割图片放入项目文件,like this:
第二步 ,代码的第5行:'img = plt.imread()',在括号里加入图片路径:“图片名.文件格式”,比如,1.jpeg、2.bmp等等。
五、运行结果
1.迭代终止条件的阈值:1e-09;簇总数:5;m=2,迭代了114次
2. 迭代终止条件:1e-09;簇总数:2;m=2,迭代了16次
3.迭代终止条件:1e-09;簇总数:5;m=2,迭代了170次,用时2306s
六、终止条件为目标函数变化值小于阈值:
6.1步骤
S1:初始化参数:加权指数m,簇心数目C,以及迭代停止阈值ε 。
S2:随机初始化隶属度矩阵U,注意满足式(2-2)。
S3:式(2-3)更新簇心c。
S4:式(2-1)计算目标函数,如果变化值小于阈值,则返回U并结束算法,否则转到S2
S5:式(2-4)更新隶属度矩阵U
6.2 流程图
七、代码详解
7.1产生和为1的随机数
7.1.1德雷克分布
产生(m ,n)的二维数组,每行元素和=1
import numpy as np
x = np.random.dirichlet(np.ones(n), size=m)
7.1.2返回值
形状:(1, 20),二维数组。
转换为向量:x=x[0]
类型:ndarray
7.2三维数组
7.2.1三维和二维
形状(k, m, n)的三维数组,相对于k个形状(m, n)的二维数组
7.2.2索引二维数组
三维数组arr,形状(k,m,n)。arr第1个二维数组为arr[0]
7.3未知形状数组加入新值
7.3.1应用场景
在某一循环内,在循环的总次数不清楚的情况下,需要记录每次循环的结果。即需要给一个不清楚长度数组加入元素。
比如,在代码中,每次循环都记录目标函数的值,但是循环的总次数每次都不确定。
7.3.2实现
先定义x是一个空数组,再通过x.append()加入新值。
x = np.array([])
for i in range(n):…x.append(data)
还有一些关于语法的解释,可以看下面这篇,虽然是kmeans算法但是编程上原理差不多。
基于K-means的图像分割(python代码详解)_白菜想出去转转的博客-CSDN博客
基于模糊C均值聚类(FCM)的图像分割原理+python代码详解相关推荐
- 基于模糊C均值聚类(FCM)的图像分割原理
基于模糊C均值聚类(FCM)的图像分割原理 图像分割概述 图像分割就是把图像细分为构成它的对象或子区域,这些区域是互不相交的,每个区域都满足特定区域的一致性.分割的程度主要取决于人们想要解决的问题,当 ...
- 【论文必用】模糊C均值聚类的简单介绍、复现及Python代码详解、聚类可视化图的绘制过程详解!
详解模糊C均值聚类 一.聚类 二.模糊C均值聚类 三.模糊C均值聚类的Python实现 四.参考链接 一.聚类 聚类的定义: 将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类.由聚类 ...
- 基于RK3399ESP8285自动售货柜项目—MP08开发板端代码详解
基于RK3399&ESP8285自动售货柜项目-②MP08开发板端代码详解 本系列文章将详细讲解该基于RK3399及ESP8285自动售货柜的完整实现方法,从硬件连接到网络通信再到软件实现,本 ...
- 谱聚类Python代码详解
谱聚类算法步骤 整体来说,谱聚类算法要做的就是先求出相似性矩阵,然后对该矩阵归一化运算,之后求前个特征向量,最后运用K-means算法分类. 实际上,谱聚类要做的事情其实就是将高维度的数据,以特征向量 ...
- 【图像分割】基于模糊C均值聚类算法CGFFCM实现彩色图像分割附matlab代码
1 简介 The fuzzy c-means (FCM) algorithm is a popular method for data clustering and image segmentatio ...
- K均值(K-means)聚类算法原理与代码详解
0. 算法原理: 上述过程简单描述: a: 初始数据 b: 选择质点 c: 根据质点划分 d: 求均值,更新质心点 e: 划分 f: 更新质心点 1. 代码实现: # K means 教程# 0. 引 ...
- 图像分割评测指标MIOU之python代码详解
Pixel Accuracy(PA,像素精度):这是最简单的度量,为标记正确的像素占总像素的比例. Mean Pixel Accuracy(MPA,均像素精度):是PA的一种简单提升,计算每个类内被正 ...
- 基于 xilinx vivado 的PCIE ip核设置与例程代码详解
1.概述 本文是用于总结PCIE ip例程的学习成果.主要是从ip的设置,ip核的例程代码构成及其来源两方面介绍pcie的使用情况. 2.参考文档 <pg054-7series-pcie> ...
- JavaWeb项目——基于Servlet实现的在线OJ平台 (项目问答+代码详解)
文章目录 项目演示 预先知识 请问 在处理用户同时提交代码时是 多进程处理还是 多线程处理? 你是如何创建多进程的逻辑的 如何获取到编译与运行后的结果? 编译运行模块 子进程之间如何并发? 文件读写操 ...
最新文章
- Linux shell脚本基础学习详细介绍(完整版)
- symbian 中自动寻找cmwap连接点,通杀uiq 2nd 3nd和s60 2nd 3nd 5nd
- 轻操作动作休闲单机游戏《狂斩三国2》评测
- 一个女算法程序媛的日常
- Python写一个服务
- 戴尔DCS两周年庆 推新型数据中心设备
- 将keras的模型封装成可转换为tensorlow的.pb格式,并生成.pbtxt文件
- 考研数学数学二有手就行系列之多元函数微分学(六)
- Android自定义dialog对话框悬浮在界面上
- dnf大区服务器位置,dnf河北一区是跨几
- 子进程及时知道父进程已经退出的最简单方案
- java图形界面UI设计——简单的计算器
- 网络工程师必备测试网络软件,网络工程师都知道的几款网络故障诊断工具
- 【Flink源码篇】Flink 1.15.0源码编译
- 服务器维护 志愿填报时间顺延,因系统维护 西藏高考志愿填报截止时间顺延两日...
- 港澳联考数学可以用计算机吗,2017年港澳台联考数学试卷.doc
- OpenCV3.X 编译 ——libpng库问题相关解决方法
- 杀猪盘、杀鸟盘、杀鱼盘...网络诈骗为何如此难以防范?
- 国外存储器专利筑起高墙?大陆半导体怎么破
- java保存字符串到缓存_冰尘乀:JAVA字符串缓存器