卫星遥感图像处理——图像随机采样作为机器学习的训练样本和测试样本

1. 选择下载好的所有指数(假设为10个指数),保证所有的数据大小都是一致的,
假设是500*300,读取所有指数,形成500*300*10的数组。

import cv2       # opencv读取格式是BGR
import os
import numpy as np
import tifffile as tf         # tifffile是tiff文件的读取库
import random

def cv_show(name, img):    # 定义展示图片的函数
    cv2.namedWindow(name, 0)
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

data_path = 'H:\gee_image\mean'
img_list = os.listdir(data_path)        # img_list:所有指数的图像文件名
data_list = []        # 存放所有指数的图像的矩阵集合
data_array = np.zeros((8, 612, 609))      # 新建三维数组,且初始值为0,存放所有指数的图像的矩阵集合
index = -1
for img in img_list:      # img:一个图像文件名
    print(img)
    temp_tf = tf.imread(f'{data_path}//{img}')      # img:一个指数图像的矩阵
    temp_tf[np.isnan(temp_tf)] = 0      # 只要有一个nan,计算出来的就都是nan,此处将nan转为0
    print(temp_tf.shape)
    data_list.append(temp_tf)         # 将所有指数图像矩阵加入data_collection
    index = index + 1
    data_array[index] = temp_tf
    print(len(data_list))     # 加入一张图像矩阵打印一次集合长度,最后为图像总数

2. 读取对应范围的SPEI数据,得到500*300的数组。

spei_path = 'H:\gee_image\spei_hunan.tif'
spei_array = tf.imread(f'{spei_path}')      # img:一个指数图像的矩阵
spei_array[np.isnan(spei_array)] = 0      # 只要有一个nan,计算出来的就都是nan,此处将nan转为0
print('spei_hunan.tif')
print(spei_array.shape)

 

3. 随机生成10000个像素坐标,然后读取每个像素坐标上的指数的值,得到10000*10的数组,
然后读取SPEI数据上对应的10000个像素的值,得到10000*1的数组。形成训练样本。

4. 在剩下的位置随机生成20000个像素坐标,然后读取每个像素坐标上的指数的值,得到20000*10的数组,
然后读取SPEI数据上对应的20000个像素的值,得到20000*1的数组。形成测试样本。

# 利用random.sample()和range()函数,可以很方便的实现在指定范围内随机生成指定多个不重复数字。
# list_1 = random.sample(range(611), 300)    # 612行
# list_2 = random.sample(range(608), 300)    # 609列
# print(list_1, list_2)

data_train = np.zeros((8, 10000))   # 指数训练样本
spei_train = np.zeros((1, 10000))   # spei训练样本
data_test = np.zeros((8, 20000))    # 指数测试样本
spei_test = np.zeros((1, 20000))    # spei测试样本
flag = np.zeros_like(spei_array)
i = 0
while i < 30000:  # (0,29999)
    # 训练样本
    if i < 10000:  # (0,9999)
        x = random.randint(0, 611)  # 612行
        y = random.randint(0, 608)  # 609列
        if flag[x][y] == 0:  # 该坐标点没有取过标志0
            spei_train[0][i] = spei_array[x][y]
            for j in range(8):     # (0,7)八个指数的矩阵
                data_train[j][i] = data_array[j][x][y]
            i += 1
            flag[x][y] = 1  # 该坐标点有取过标志1
    # 测试样本
    elif i > 9999:  # (10000,29999)
        x = random.randint(0, 611)  # 612行
        y = random.randint(0, 608)  # 609列
        if flag[x][y] == 0:  # 该坐标点没有取过标志0
            spei_test[0][i - 10000] = spei_array[x][y]
            for j in range(8):     # (0,7)八个指数的矩阵
                data_test[j][i - 10000] = data_array[j][x][y]
            i += 1
            flag[x][y] = 1  # 该坐标点有取过标志1

# print(spei_train)
# print(spei_test)
# print(data_train)
# print(data_test)
# 测试是否取了30000个坐标点:
# count = 0
# for i in flag:
#     for j in i:
#         if j == 1:
#             count += 1
# print("取样点个数:" + str(count))
"""
1.np.save(‘a.npy’,a):save主要保存.npy文件
2.np.savez(‘a.npz’,ar0=a,ar1=b):savez主要保存.npz文件,但是它可以将多条数据同时压缩到一个.npz 文件中
  同样地,虽然savez可以保存多条数据,但是也不可追加数据
3.np.savetxt(‘a.txt’,a):savetxt只要将数据保存为txt文件,和前两个不同,它可以再次对文件操作,
  但是对已有数据的文件再次使用savetxt(),并不会将数据追加在后面,而是将之前数据覆盖。
4..npy文件追加数据:因为.npy 文件不能追加数据,所以如果有多条数据不同时的产生,而需要保存在同一个文件中,
  则可以将多条数据先保存到一个数组中,然后再保存。
"""
out_path = 'H:\gee_image\\trian_test\data_train.npz'
# 保存样本数据
np.savez(f'{out_path}', ar0=flag, ar1=data_train, ar2=data_test, ar3=spei_train, ar4=spei_test)  # 存入
# 读取保存的.npz样本文件
poem = np.load(out_path, allow_pickle=True)
print(poem.files)
flag = poem['ar0']
# 显示的值带省略号,要完全显示,执行:
# np.set_printoptions(threshold=np.inf)
# print(flag)

 

创建612*609的标志矩阵,避免取重复点,随机取样点置1:

训练样本:

测试样本:

查看取样点个数为30000并且不重复:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本程序主要对遥感图像实现三种处理:几何校正、图像增强和图像配准。这三种处理都可以独立实现,然而对于原始的遥感图像将这三种处理依次进行效果更佳。 具体操作步骤如下: 1.在主窗口打开图像1 2.选择【几何校正】菜单,打开【图像几何校正】对话框进行几何校正。在此对话框中,首先打开待校正图像2,然后点击【选取特正点】按钮,按照提示依次在待校正图像和基准图像中手动选取特征点,最后点击【校正图像】得到几何校正结果,如果达到预期效果,则点击【保存并在主窗口打开】按钮,保存此校正图片,并在主窗口打开。 3.选择【图像增强】菜单,打开【图像增强】对话框进行图像增强。在此对话框中,首先在相应的处理类别(如:直方图增强、灰度增强等)中选择具体方法(如:均衡化、规定化等),然后点击本类别的按钮。增强后的结果会在右侧显示,如果达到预期效果,则点击【保存并在主窗口打开】按钮,保存此增强后的图片,并在主窗口打开。 4.选择【图像配准】菜单,打开【图像配准】对话框进行图像配准。在此对话框中,首先打开待匹配图像3,然后选择“半自动”或“手动”方法并点击【选取特正点】按钮,按照提示依次在待配准图像和基准图像中半自动或手动选取特征点(如果在半自动选取中特征点对应错误,可以更改特征点),最后点击【匹配图像】得到图像配准结果,如果达到预期效果,则点击【保存并在主窗口打开】按钮,保存此校正图片,并在主窗口打开。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值