基于K-means和FCM算法的合成纹理图像及SAR图像的分割

🎀个人主页: https://zhangxiaoshu.blog.csdn.net
📢欢迎大家:关注🔍+点赞👍+评论📝+收藏⭐️,如有错误敬请指正!
💕未来很长,值得我们全力奔赴更美好的生活!

前言

合成纹理图像和SAR(Synthetic Aperture Radar,合成孔径雷达)图像的分割任务在遥感图像处理和计算机视觉领域中具有重要的应用价值。例如对于环境监测、资源管理、灾害应对、国防安全等方面。本文主要介绍基于K均值和模糊C均值算法的合成纹理图像及SAR图像的分割小实例。


文章目录

  • 前言
  • 介绍
    • 1. 合成纹理图像
    • 2. 分割任务
  • 一、K均值算法以及模糊C均值算法
    • 1. K均值算法
    • 2. 模糊C均值算法
  • 二、K均值算法以及模糊C均值算法分割实验
    • 1. K均值算法分割实验
    • 2. 模糊C均值算法分割实验


介绍

1. 合成纹理图像

  1. 合成纹理图像通常是通过人工合成或利用纹理合成算法生成的图像。它们具有多样的纹理特征,用于模拟真实场景中的各种地物表面,如土地覆盖、植被类型等。合成纹理图像在图像分割任务中可以用作训练数据,用于模型的训练和验证。
    SAR图像:

  2. 合成孔径雷达(SAR)是一种主动遥感技术,利用雷达系统发射脉冲信号,接收反射回来的信号,并利用回波数据生成图像。SAR图像通常具有独特的特征,例如对地物形态、材质和湿度等的敏感性,因此在土地利用、资源管理、环境监测等领域具有广泛的应用。SAR图像分割任务的目的是将图像中的不同地物区域进行有效地分割和识别。

2. 分割任务

图像分割任务旨在将图像中的像素划分为不同的类别或区域,使得每个区域具有相似的特征或语义含义。在合成纹理图像和SAR图像的分割任务中,目标是将图像中的不同地物或地物类型进行分割,以实现对地物的识别和定量分析。

  1. 合成纹理图像分割任务:旨在将合成纹理图像中的不同地物区域(如建筑、水体、植被等)进行分割,从而实现对地物的识别和分类。

  2. SAR图像分割任务:旨在将SAR图像中的不同地物区域(如建筑、道路、植被等)进行分割,以实现对地物的识别和监测。

这些分割任务的结果可以为地理信息系统(GIS)、环境监测、城市规划等应用提供重要的数据支持,有助于对地表覆盖类型、土地利用情况、环境变化等进行定量分析和监测。因此,合成纹理图像和SAR图像的分割任务在地学、地理信息科学、遥感技术和环境科学等领域具有广泛的应用前景。

一、K均值算法以及模糊C均值算法

1. K均值算法

K均值(K-means)算法是一种经典的聚类算法,用于将数据集分成K个不同的组(簇),使得每个数据点都属于与其最近的簇中心所对应的簇。K均值算法的步骤如下:
在这里插入图片描述

  • 初始化:随机选择K个初始的簇中心(centroid),可以是数据集中的随机样本或者随机生成的点。

  • 分配:对于每个数据点,计算其与K个簇中心的距离,并将其分配给距离最近的簇中心所对应的簇。

  • 更新:对于每个簇,计算其所有数据点的均值,并将该均值作为新的簇中心。

  • 重复:重复步骤2和步骤3,直到簇中心不再发生变化或者达到最大迭代次数。

  • 收敛:当簇中心不再发生变化时,算法收敛,得到最终的簇划分结果。

2. 模糊C均值算法

模糊C均值(FCM,Fuzzy C-means)算法是K均值算法的一种扩展,它允许数据点属于多个簇的可能性,而不是强制将每个数据点分配给一个唯一的簇。这使得FCM算法对于某些数据集的聚类更加灵活和鲁棒。

算法步骤:

  • 初始化:随机初始化K个簇中心,并为每个数据点分配一个隶属度(membership degree)向量,表示数据点属于每个簇的可能性。

  • 计算簇中心:对于每个簇,计算其簇中心,作为该簇中所有数据点的加权平均值,其中权重由数据点与簇中心的距离以及隶属度来决定。

  • 更新隶属度:根据数据点与各个簇中心之间的距离以及指定的模糊参数m,更新每个数据点的隶属度向量。

  • 检查停止条件:如果隶属度向量的变化小于预先指定的阈值,或者达到最大迭代次数,则停止迭代;否则返回步骤2。

  • 收敛:当满足停止条件时,算法收敛,得到最终的簇中心和每个数据点的隶属度向量。

二、K均值算法以及模糊C均值算法分割实验

1. K均值算法分割实验

算法代码如下所示:

import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('D:/VSCode/Task_python/lab/homework/Mosaic1_new.tif') 
#img = cv2.imread('D:/VSCode/Task_python/lab/homework/river_2.bmp')
data = img.reshape((-1,3))
data = np.float32(data)#定义中心 (type,max_iter,epsilon)
criteria = (cv2.TERM_CRITERIA_EPS +cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
#设置标签
flags = cv2.KMEANS_RANDOM_CENTERS
#K-Means聚类 聚集成2类
compactness, labels2, centers2 = cv2.kmeans(data, 2, None, criteria, 10, flags)#图像转换回uint8二维类型
centers2 = np.uint8(centers2)
res = centers2[labels2.flatten()]
dst2 = res.reshape((img.shape))
#图像转换为gray显示
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst2 = cv2.cvtColor(dst2, cv2.COLOR_BGR2GRAY)
#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
#显示图像
titles = [u'原始图像', u'kmeans聚类图像 K=2'] 
images = [img, dst2] for i in range(2): plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray'), plt.title(titles[i]) plt.xticks([]),plt.yticks([]) 
plt.savefig('D:/VSCode/Task_python/lab/homework/kmeans_1.jpg')
plt.show()

结果如下图所示:
在这里插入图片描述
在这里插入图片描述

2. 模糊C均值算法分割实验

算法代码如下所示:

import numpy as np
import matplotlib.pyplot as plt
import time
import cv2
star = time.time()  # 计时
#img = cv2.imread('D:/VSCode/Task_python/lab/homework/Mosaic1_new.tif')  # 读取图片信息,存储在一个三维数组中
img = cv2.imread('D:/VSCode/Task_python/lab/homework/river_2.bmp')
row = img.shape[0]
col = img.shape[1]
plt.figure(1)
plt.figure(figsize=(9, 7))
plt.subplot(221)
plt.title('原始图像')
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, 2, 2)img_show = np.argmax(img_show, axis=0)#img_show = img_show.reshape((256,256,1))# 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]),cmap="gray")plt.title('FCM聚类图像(cluster_center=2)')end = time.time()print('用时:', end - star)plt.savefig('D:/VSCode/Task_python/lab/homework/FCM_2.jpg')plt.show()

结果如下图所示:

在这里插入图片描述
在这里插入图片描述


文中图片大多来自论文和网络,如有侵权,联系删除,文中有不对的地方欢迎指正、补充。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/2123.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF4 数据模板

数据模板 数据模板常用在3种类型的控件, 下图形式: 1.Grid这种列表表格中修改Cell的数据格式, CellTemplate可以修改单元格的展示数据的方式。 2.针对列表类型的控件, 例如树形控件&#xff0c;下拉列表&#xff0c;列表控件, 可以修改其中的ItemTemplate。 3.修改ContentT…

Python读取influxDB数据库(二)(influxDB2.X版本)

1. influxDB连接 首先在浏览器中输入influxDB的IP和端口&#xff0c;然后输入账号密码进入到influxDB数据库来进行数据的相关操作&#xff1a; 里面的bucket相当于sql中的数据库&#xff0c;_measurement相当于sql中的表 2. 获取influxDB数据库的token方法 3. 写查询语句来查询…

【C++学习】STL之空间配置器之一级空间配置器

文章目录 &#x1f4ca;什么是空间配置器✈STL 提供六大组件的了解&#x1f440;为什么需要空间配置器&#x1f44d;SGI-STL空间配置器实现原理&#x1f302;一级空间配置器的实现 &#x1f4ca;什么是空间配置器 空间配置器&#xff0c;顾名思义就是为各个容器高效的管理空间…

关于Developers网站的一些使用分享

Android Developers 官网使用分享 语音切换android studio 版本下载最新版本下载位置历史版本下载位置 android studio 版本和 AGP 对应关系API 和 android studio 版本和 AGP 对应关系android studio 版本android 版本API levelandroid.hardware.camera2 语音切换 Developers…

Vue3引入高德地图js API 2.0

文章目录 前言一、地图加载1.本文准备环境2.引入库3.加载地图4.加载地图控件 二、POI搜索1.什么是poi搜索2.如何使用 三、绘制点标记与信息窗体1.场景描述2.案例3.信息窗体-链接路由跳转4.进阶-通过Marker自动触发标记点&#xff08;非鼠标手动点击&#xff09; 四、jsApi地图事…

SQL-DML数据操纵语言(Oracle)

文章目录 DML数据操纵语言常见的字段属性字符型字段属性char(n)varchar2(n)/varchar(n) 数值型字段属性number([p],[s]int 日期型字段属性DATEtimestamp 如何查看字段属性增加数据INSERT快捷插入 删除数据DELETE修改数据UPDATE DML数据操纵语言 定义 是针对数据做处理&#xf…

vscode 解决无法创建临时文件。

报错&#xff1a; Fatal error: cant create C:\Users???y\AppData\Local\Temp\ccqkCS9j.o: No such file or directory 右击此 电脑 -> 属性 打开 系统信息 -> 高级系统设置 系统属性 -> 高级 -> 环境变量 将temp 和 tmp 改为其它英文路径 只更改用户变量…

docker-MySQL 8 主从搭建

一.目录结构&#xff1a; 我是在/home目录下&#xff0c;建立个sql文件夹&#xff1a; 二、配置文件 1.mysql配置 mysql-master下.conf文件配置 ###### [mysqld] server-id1 # 启用二进制日志 log-binmaster-bin # 指定需要复制的数据库 binlog-do-dbtest_db # 指定二进制日…

【STM32+HAL+Proteus】系列学习教程---RS485总线(收发仿真实现)

实现目标 1、掌握UART/USART/RS485等几个常见概念的区别 2、掌握RS485的逻辑电平、硬件接线等基础知识 3、具体实现目标&#xff1a;1、利用两个单片机组成RS485通信网络&#xff1b;2、两个单片机之间能实现正常收发数据。 一、串口、RS485等之间的关系 串口&#xff1a;是…

Redis入门到通关之数据结构解析-ZipList

文章目录 ☃️概述☃️ZipListEntry☃️Encoding编码☃️ZipList的连锁更新问题☃️总结 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与…

Leetcode 118 杨辉三角

目录 一、问题描述二、示例及约束三、代码方法一&#xff1a;数学 四、总结 一、问题描述 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。   在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 二、示例及约束 示例 1&#xff1a…

python中开发页面的两种方法:Qt Designer(PyQt图形化界面拖拽开发App界面)以及Django(开发Web应用框架)

一、开发独立的窗口&#xff0c;App的那种&#xff0c;可使用tkinter或者PyQt 使用PyQt时&#xff0c;里面有个工具Qt Designer&#xff0c;是一个可视化的界面设计工具&#xff0c;可以通过拖拽等方式来设计界面。下面就是Qt Designer的操作界面&#xff1a; 参考链接如下&am…

跨境电商测评攻略:如何安全有效地提升业绩?

跨境电商做久了&#xff0c;卖家都会陷入一个困境&#xff0c;到底是该坚持慢慢做好&#xff0c;还是要测评? 有卖家表示&#xff0c;美客多基本的操作如果熟练了之后&#xff0c;就不用在运营上费太多功夫 这时候要好好规划一下测评的事情&#xff0c;做美客多到最后你会发…

力扣数据库题库学习(4.22日)

577. 员工奖金 问题链接 思路分析 Employee表与Bonus表通过empId字段可以连接&#xff0c;需求是查出奖金少于1000的员工名和奖金值。 这里奖金少于1000的情况就是没有奖金有奖金但少于1000 这里我给出的解决方案就是使用左连接&#xff0c;将Employee表作为左表&#xff…

arm架构,django4.2.7适配达梦8数据库

【Python相关包版本信息】 Django 4.2.7 django-dmPython 3.1.7 dmPython 2.5.5 【达梦数据库版本】 DM Database Server 64 V8 DB Version: 0x7000c 适配过程中发现的问题如下&#xff1a; 错误一&#xff1a;d…

解决IDEA调试方法进不去与数据看不到的问题

问题场景&#xff1a; 最近使用IDEA调试的时候&#xff0c;发现JDK有些方法**步进(F7)**无法进入&#xff0c;有些类的字段值也看不到。 原因分析&#xff1a; 提示&#xff1a;IDEA为了提升调试效率&#xff0c;以及突出调试数据的显示效果&#xff0c;会默认帮我们做一些筛选…

PAT——1007素数对猜想(C++)

问题描述&#xff1a; 让我们定义为&#xff1a;​&#xff0c;其中​是第i个素数。显然有d1​1&#xff0c;且对于n>1有​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数 N (<10^5)&#xff0c;请计算不超过 N 的满足猜想的素数对的个…

# 从浅入深 学习 SpringCloud 微服务架构(四)Ribbon

从浅入深 学习 SpringCloud 微服务架构&#xff08;四&#xff09;Ribbon 段子手168 一、ribbon 概述以及基于 ribbon 的远程调用。 1、ribbon 概述&#xff1a; Ribbon 是 Netflixfa 发布的一个负载均衡器,有助于控制 HTTP 和 TCP客户端行为。 在 SpringCloud 中 Eureka …

Flutter 插件站新升级: 加入优秀 GitHub 开源项目

Flutter 插件站新升级: 加入优秀 GitHub 开源项目 视频 https://youtu.be/qa49W6FaDGs https://www.bilibili.com/video/BV1L1421o7fV/ 前言 原文 https://ducafecat.com/blog/flutter-awesome-github-repo-download 这几天晚上抽空把 Flutter 插件站升级&#xff0c;现在支…

qt实现不定数量的按钮向前向后移动展示

按钮模拟移动 引言示例代码第一种思路开发环境代码结构实现代码第二种思路开发环境实现代码第三种思路开发环境实现代码总结引言 此文主要记录用qt实现按钮的移动,具体效果如下: 模拟按钮移动效果 示例代码 本文记录了三种实现方式。 第一种 思路 用动态数组vector存放创…