kmeans高光谱分类

本文介绍了一种使用Python实现的kmeans高光谱分类方法,通过逐条处理数据,确保了代码的可读性。适用于在PyCharm环境中运行。
摘要由CSDN通过智能技术生成

借鉴同事的代码,可读取高光谱数据,而且是一条一条运算的

from PyQt5.QtWidgets import QWidget
# from UI.UnSupervisedModelClass import Ui_ModelClass
from PyQt5.QtCore import Qt
from PyQt5.QtCore import pyqtSignal
# from File.LoadSaveFile import LoadSaveFile
import numpy as np
import cv2
from PyQt5.QtGui import QColor, QImage, QPixmap
from tqdm import tqdm
# from ProcessImage.ProcessImage import ImageProcess
from read import *
from loadonelinedata import *

name = "newrawfile20220112145850610_refClip.raw"
hdr = LoadHdr(name)
sampels = hdr['samples']
lines = hdr['lines']
bands = hdr['bands']
firstPoint_y = np.random.randint(0, sampels)  # randint产生区间为[0,samples]的随机数
firstPoint_x = np.random.randint(0, lines)

# 选点,第一个点随机,其他点选择距离最远的点
# 当类别为i的时候,对该类别进行循环:将所有帧的数据遍历一遍,累加所有点到已确定中心点points的距离,获得一个sample*lines的距离矩阵,选取最大值为新的中心点。然后初始化分类矩阵
firstPoint = LoadPointWaves(name, hdr, firstPoint_x, firstPoint_y)  # bands*1的矩阵
points = [firstPoint]  # 建立中心点的集合

classNum = 3
for i in range(1, classNum):
    distance = np.zeros((sampels, lines))
    for j in range(lines):
        data = LoadOneLineData(name, hdr, j)  # samples * bands
        for point in points:  # 下一行的data-point就是samples * bands的矩阵一行一行的减1*bands的矩阵,然后将所有band的差值平方后再加和再开根号
            distance[:, j] = distance[:, j] + np.sqrt(np.sum(np.square(data - point), axis=1))  # sum设置axis=1,计算每一行的向量之和.distance[:,j]表示取第j列的所有行元素。
    newPoint = np.argmax(distance)  # 返回元素最大值所对应的索引值 #distance得出的是每个点到k个中心点的距离的和,距离最大的点就是第k+1个中心点
    points.append(LoadPointWaves(name, hdr, newPoint % lines,int(newPoint / lines)))  # append()函数添加的元素在列表的「末尾],功能:增加一个中心点
classes = np.ones((sampels, lines)) * (-1)  # 预先定义一个图片放每一个点的类别,初始化全是-1
LastClasses = np.ones((sampels, lines)) * (-1)  # LastClasses作用是储存上一循环的分类结果,以进行比较是否可以停止循环

# kmeans
# 第一个j循环:遍历所有lines的sample*bands与各个中心点的光谱尽心比对,形成sample*lines的初步分类矩阵,第二个i循
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值