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

news2024/11/15 9:55:52

🎀个人主页: 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.初始化U
    u = np.random.dirichlet(np.ones(k), row*col).T  # 形状(k, col*rol),任意一列元素和=1
    #  for s in range(50):
    while 1:
        times += 1
        print('循环:', times)
        # 2.簇心update
        for 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:
            break
    return u, goal_j, goal_u
 
 
if __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'] = False
    plt.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.coloradmin.cn/o/1617062.html

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

相关文章

免 Administrator 权限安装软件

以欧路词典为例, 从官网下载的安装包 https://www.eudic.net/v4/en/app/download 直接运行会弹出 UAC 提示需要管理员权限. 一个词典而已, 为啥要管理员权限呢? 答案是安装程序默认使用的安装路径是 C:\Program Files\ 这就不难理解了. 对于这种不需要其他额外权限的软件, 可以…

zabbix自动发现和自动注册

一、zabbix自动发现 1.1 确保客户端上的zabbix-agent2服务器状态正常 1.2 在web页面删除原有的客户端主机 1.3 在服务端和客户端上配置hosts 1.4 web端配置自动发现 二、zabbix自动注册 2.1 环境配置 2.2 修改zabbix-agent2配置文件 过滤非#或非&#xffe5;开头的内容 2.3 we…

Qt 跨平台开发的一丢丢总结

Qt 跨平台开发 文章目录 Qt 跨平台开发摘要第一 \ & /第二 神奇{不能换行显示第三 预处理宏 关键字&#xff1a; Qt、 win、 linux、 lib、 MSVC 摘要 最近一直在琢磨Qt跨平台开发的问题&#xff0c;缘由有以下几个&#xff0c; 首先第一个&#xff0c;我们目前开发…

【剪映专业版】03立体自动翻页

【剪映专业版】立体自动翻页制作 1.导入素材&#xff0c;图片或视频均可 2.将素材2拖动至素材1的上方&#xff0c;点击蒙版&#xff0c;选择线性蒙版&#xff0c;并旋转为90度。 3.复制素材1&#xff0c;并拖动到素材2上方&#xff0c;分割并删除后半部分&#xff0c;点击蒙版…

Java进阶-Stream流

概述 在Java8中&#xff0c;得益于lambda所带来的函数式编程&#xff0c;引入了一个全新的Stream流的概念目的&#xff1a;用于简化集合和数组操作的api 案例 需求&#xff1a;创建一个集合存储多个字符串元素&#xff0c;将集合中所有以“z”开头的元素存储到新的集合中&am…

邀请全球创作者参与 The Sandbox 创作者训练营

作为首屈一指的元宇宙平台之一&#xff0c;The Sandbox 的使命是成为全球创作者的中心。随着我们对 Game Maker 的不断改进、旨在激发创作者灵感的定期 Game Jams、革命性的 "创作者挑战 "以及众多其他活动的开展&#xff0c;我们见证了大量个人加入我们充满活力的创…

C++ 虚表起源

本文会让看不见 摸不着的虚表(Vtable),虚指针(Vptr)彻底现行 本文涉及思想: C 面向对象 封装 继承 多态 中的 多态 概念解释: 虚表指针&#xff1a; 这是指向虚表&#xff08;vtable&#xff09;的指针&#xff0c;虚表中包含了该类的所有虚函数对应的地址。 虚表&#x…

每日一题 — 二分查找

704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 朴素二分查找模板&#xff1a; while(.......){//防止溢出int mid left(right - left)/2;if(........){right mid-1;}else if(......){left mid1;}else{return mid;}} 代码&#xff1a; public int search(int[] num…

十六、Qgis工具如何将shp转换geoJson类型文件

在使用GIS地图的时候线路图是非常重要的一个部分,根据以前的下载方法下载好了Qgis工具,那么如何将在openstreetmap下载下来的.shp文件转换为geoJson呢,下面就来说说。 准备工作 一、首先肯定是下载好了中国地图的全部的.shp包。里面包含全国的地图,包含shp,cpg,dbf类型的道…

软考 系统架构设计师系列知识点之大数据设计理论与实践(18)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之大数据设计理论与实践&#xff08;17&#xff09; 所属章节&#xff1a; 第19章. 大数据架构设计理论与实践 第5节 Lambda架构与Kappa架构的对比和设计选择 19.5.2 Lambda架构与Kappa架构的设计选择 根据Lambda与Kapp…

ArrayList与顺序表(2)

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x1…

FFmpeg源码编译

msys2 依赖环境安装 依赖环境安装编译X264编译 fdk-aac文件处理编译x265编译FFmpeg 依赖环境安装 编译X264 用于h264 AVC视频格式编码 CCcl ./configure --enable-shared #指定使用cl,编译成动态链接库 make -j32 #使用32线程进行编码 make install命令一 关于第一条命令执…

专注 APT 攻击与防御—工具介绍—Sqlmap

sqlmap参数详解&#xff1a; 由于Sqlmap 是常用工具之一&#xff0c;所以本篇的篇幅较长&#xff0c;详解一次所有参数。 1、Options&#xff08;选项&#xff09; Usage: python sqlmap.py [options]Options&#xff08;选项&#xff09;:-h, --help Show basic help messa…

Ultralytics YOLOv8 英伟达™ Jetson®处理器部署

系列文章目录 前言 本综合指南提供了在英伟达 Jetson设备上部署Ultralytics YOLOv8 的详细攻略。此外&#xff0c;它还展示了性能基准&#xff0c;以证明YOLOv8 在这些小巧而功能强大的设备上的性能。 备注 本指南使用Seeed Studio reComputer J4012进行测试&#xff0c;它基于…

金融风控信用评分卡建模(Kaggle give me credit数据集)

1 数据预处理数据 数据来源于Kaggle的Give Me Some Credit&#xff0c;包括25万条个人财务情况的样本数据 1.1 导包读数据 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.ensemble import RandomForestRegressor import seaborn as …

备考2024年上海初中生古诗文大会:单选题真题示例和独家解析

上海市中小学生的初中生古诗文大会——即上海中学生古诗文大会&#xff08;初中组&#xff09;和小学生古诗文大会&#xff08;比赛&#xff09;相比&#xff0c;除了题型更丰富之外&#xff0c;最主要的是考察的内容深度和广度不同。初中的题目中对于文言文的考察大幅增加&…

树莓派驱动RGB灯-rpi-ws281x库安装

1 树莓派的操作系统安装 1.1 操作系统选择 这个选择64位的操作的系统来驱动&#xff0c;一定不要选择32位的操作系统。笔者在这个地方浪费不少时间&#xff0c;具体原因不是很清楚。如果32位的操作系统&#xff0c;后面在rpi-ws281x的库时候会有报错。 1.2 操作系统链接如下…

嵌入式Linux八股(二)——Linux

二、Linux 01.Linux系统编程 01.Linux系统文件类型&#xff1a; 7/8 种 普通文件&#xff1a;- 目录文件&#xff1a;d 字符设备文件&#xff1a;c 块设备文件&#xff1a;b 软连接&#xff1a;l 管道文件&#xff1a;p 套接字&#xff1a;s 未知文件 文件权限说明 …

虚拟机中安装的CentOS7的桌面右上角没有网络图标解决方案

问题描述 今天在打开CentOS7后&#xff0c;发现右上角的网络图标不见了&#xff0c;然后命令行访问百度也不通。然后上网查了一些解决方法。 原因分析及解决方案&#xff1a; 上网查了许多解决方法&#xff0c;其中一种成功解决了我的问题&#xff1b;我的是配置文件的问题。…

探索 去中心化的Web3.0

随着区块链技术的日益成熟和普及&#xff0c;Web3&#xff08;Web 3.0&#xff09;已经成为一个无法忽视的趋势。Web3不仅仅是一个技术概念&#xff0c;更是一个去中心化、透明、用户数据拥有权归还给用户的互联网新时代。在这篇文章中&#xff0c;我们将深入探讨Web3技术的核心…