借鉴同事的代码,可读取高光谱数据,而且是一条一条运算的
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循