遥感图像语义分割——从原始图像开始制作自己的数据集(以高分二号为例)

文章目录

  • 遥感图像语义分割——从原始图像开始制作自己的数据集(以高分二号为例)
    • 1.遥感影像获取
    • 2.遥感数据预处理(影像融合)
    • 3.遥感影像批量裁剪
    • 4.栅格格式影像转JPG格式
    • 5.用labelme制作图像标签
    • 6.制作txt文档(统计训练集、验证集的图片名)
      • 批量修改图片的文件名
      • 读取文件名到txt文档

这篇文章分享一下遥感影像语义分割数据集的制作。从原始图像开始,经过影像融合等一系列步骤,生成自己的原图+标签形式的数据集。


1.遥感影像获取

​ 本文中数据下载自中中国资源卫星应用中心(本文的高分数据不共享),网站内含有付费和部分免费的数据共大家下载,具有高分系列卫星、资源系列卫星等遥感影像数据。

2.遥感数据预处理(影像融合)

​ 以高分系列为例,影像数据压缩包内有高分辨率影像和多光谱影像。可以融合形成高分辨率多光谱的影像。具有较高的空间分辨率也具有多光谱的特征。利用ENVI进行图像融合的方法如下所示:

融合方法 适用范围
IHS 变换 纹理改善,空间保持较好。光谱信息损失较大大,受波段限制。
Brovey 变换 光谱信息保持较好,受波段限制。
乘积运算 对大的地貌类型效果好,同时可用于多光谱与高光谱的融合。
PCA 变换 无波段限制,光谱保持好。第一主成分信息高度集中,色调发生较大变化。
GS 改进了 PCA 中信息过分集中的问题,不受波段限制,较好的保持空间纹理信息,尤其能高保真保持光谱特征。专为最新高空间分辨率影像设计,能较好保持影像的纹理和光谱信息。

​ 具体方法:

  1. 在ENVI的Toolbox中打开Image Sharpening/Gram-Schmidt Pan Sharpening,选择自己的高分辨率影像和低分辨率影像(多光谱),单击OK。
  2. 在 Pan Sharpening Parameters 面板中,选择传感器类型(Sensor):Unknown,重采样方法(Resampling):Cubic Convolution,以及输出格式。

3.遥感影像批量裁剪

​ 在制作遥感影像数据集中,必不可少的就是遥感影像的批量裁剪到统一的尺寸。本文中的方法是从栅格影像(tif格式)的裁剪具体代码如下:

import gdal
import os
def read_img(filename):dataset = gdal.Open(filename)  # 打开文件im_width = dataset.RasterXSize  # 栅格矩阵的列数im_height = dataset.RasterYSize  # 栅格矩阵的行数im_geotrans = dataset.GetGeoTransform()  # 仿射矩阵im_proj = dataset.GetProjection()  # 地图投影信息im_data = dataset.ReadAsArray(0, 0, im_width, im_height)  # 将数据写成数组,对应栅格矩阵del datasetreturn im_proj, im_geotrans, im_datadef write_img(filename, im_geotrans, im_data):# gdal数据类型包括# gdal.GDT_Byte,# gdal .GDT_UInt16, gdal.GDT_Int16, gdal.GDT_UInt32, gdal.GDT_Int32,# gdal.GDT_Float32, gdal.GDT_Float64# 判断栅格数据的数据类型if 'int8' in im_data.dtype.name:datatype = gdal.GDT_Byteelif 'int16' in im_data.dtype.name:datatype = gdal.GDT_UInt16else:datatype = gdal.GDT_Float32# 判读数组维数if len(im_data.shape) == 3:im_bands, im_height, im_width = im_data.shapeelse:im_bands, (im_height, im_width) = 1, im_data.shape# 创建文件driver = gdal.GetDriverByName("GTiff")  # 数据类型必须有,因为要计算需要多大内存空间dataset = driver.Create(filename, im_width, im_height, im_bands, datatype)dataset.SetGeoTransform(im_geotrans)  # 写入仿射变换参数if im_bands == 1:dataset.GetRasterBand(1).WriteArray(im_data)  # 写入数组数据else:for i in range(im_bands):dataset.GetRasterBand(i + 1).WriteArray(im_data[i])del dataset# 有两个文件夹bj-5 bj-dx
# 每个文件夹下有4副影像
# 遍历每个影像
# 按需修改
area_list = ['bj-5','bj-dx']
index_list = ['01','02','03','04']
for m in area_list:for k in index_list:#图片的路径p = "/home/kun/tif/" + m + "/" +  k +".tif"#读取图片im_proj,im_geotrans,im_data = read_img(p)#获取图片的宽、高、通道channel,width,height = im_data.shapefor i in range(width//451):       #451修改为自己需要的宽for j in range(height//451):     #451修改为自己需要的高cur_img = im_data[:,i*451:(i+1)*451,j*451:(j+1)*451]#保存图片的命名格式(可以自己修改write_img('/home/kun/cup-end/{}/{}_{}_{}.tif'.format(m,k,i,j), im_geotrans, cur_img)

4.栅格格式影像转JPG格式

​ 裁剪完的影像格式仍为栅格格式,语义分割需要的是JPG格式的图像。具体的转换代码如下:

import numpy as np
import os
from PIL import Image
from osgeo import gdaldef readTif(imgPath, bandsOrder=[3, 2, 1]):"""读取GEO tif影像的前三个波段值,并按照R.G.B顺序存储到形状为【原长*原宽*3】的数组中:param imgPath: 图像存储全路径:param bandsOrder: RGB对应的波段顺序,如高分二号多光谱包含蓝,绿,红,近红外四个波段,RGB对应的波段为3,2,1:return: R.G.B三维数组"""dataset = gdal.Open(imgPath, gdal.GA_ReadOnly)cols = dataset.RasterXSizerows = dataset.RasterYSizedata = np.empty([rows, cols, 3], dtype=float)for i in range(3):band = dataset.GetRasterBand(bandsOrder[i])oneband_data = band.ReadAsArray()data[:, :, i] = oneband_datareturn datadef stretchImg(imgPath, resultPath, lower_percent=0.5, higher_percent=99.5):"""#将光谱DN值映射至0-255,并保存:param imgPath: 需要转换的tif影像路径(***.tif):param resultPath: 转换后的文件存储路径(***.jpg):param lower_percent: 低值拉伸比率:param higher_percent: 高值拉伸比率:return: 无返回参数,直接输出图片"""RGB_Array = readTif(imgPath)band_Num = RGB_Array.shape[2]JPG_Array = np.zeros_like(RGB_Array, dtype=np.uint8)for i in range(band_Num):minValue = 0maxValue = 255# 获取数组RGB_Array某个百分比分位上的值low_value = np.percentile(RGB_Array[:, :, i], lower_percent)high_value = np.percentile(RGB_Array[:, :, i], higher_percent)temp_value = minValue + (RGB_Array[:, :, i] - low_value) * (maxValue - minValue) / (high_value - low_value)temp_value[temp_value < minValue] = minValuetemp_value[temp_value > maxValue] = maxValueJPG_Array[:, :, i] = temp_valueoutputImg = Image.fromarray(np.uint8(JPG_Array))outputImg.save(resultPath)def Batch_Convert_tif_to_jpg(imgdir, savedir):# 获取文件夹下所有tif文件名称,并存入列表file_name_list = os.listdir(imgdir)for name in file_name_list:# 获取图片文件全路径img_path = os.path.join(imgdir, name)# 获取文件名,不包含扩展名filename = os.path.splitext(name)[0]savefilename = filename + ".jpg"# 文件存储全路径savepath = os.path.join(savedir, savefilename)stretchImg(img_path, savepath)print("图片:【", filename, "】完成转换")print("完成所有图片转换!")# 主函数,首先调用
if __name__ == '__main__':area_list = ['bj-5','bj-dx','pds-and-jn']for i in area_list:imgdir = r"/home/kun/cup-end/" + i # tif文件所在的【文件夹】savedir = r"/home/kun/cup-end-jpg/" + i  # 转为jpg后存储的【文件夹】Batch_Convert_tif_to_jpg(imgdir, savedir)

5.用labelme制作图像标签

​ 众所周知,应用很广泛的一所标注工具叫做labelme,接下来介绍labelme环境搭建以及labelme的使用。

首先需要安装并配置好anaconda。打开anaconda prompt(Anaconda命令行)。输入以下指令:

conda create -n labelme python=3.6

待创建完成后,激活labelme环境

conda activate labelme

安装labelme环境

pip install labelme

安装完成后,在labelme环境下输入

labelme

即可打开labelme标注工具。具体的标注、json格式文件的转换等操作参考:labelme使用教程。

6.制作txt文档(统计训练集、验证集的图片名)

批量修改图片的文件名

具体修改代码如下:

import os
import re
import sys# 图片的路径
file_list = os.listdir('/home/qun/json_jpg')
#用于命名
k=0
currentpath = os.getcwd()
os.chdir('/home/qun/json_jpg')
for i in range(0,len(file_list)):if(file_list[i][-4:] == 'json'):last_name  = file_list[i]# 千张图片%04 万张图片%05....os.rename(file_list[i],str(("%04d" % (i)))  + '.json')for k in range(0,len(file_list)):if ((file_list[k][-3:] == 'jpg') & (file_list[k][0:-4] == last_name[0:-5])):os.rename(file_list[k],str(("%04d" % (i)))  + '.jpg')print(file_list[k] + 'finsh')print(file_list[i]+ 'finsh')
os.chdir(currentpath)
sys.stdin.flush()

读取文件名到txt文档

import os# 图片的路径
file_path = '/home/qun/torch-deeplabv3/pytorch-deeplab-xception-master/Waste2021/JPEGImages'list = os.listdir(file_path)path_name = []
for i in list:path_name.append(i.split('.')[0])
for j in range(0,len(path_name)):# txt文档的路径with open('/home/qun/torch-deeplabv3/pytorch-deeplab-xception-master/Waste2021/ImageSets/Segmentation/trainval.txt','a') as f:f.write(path_name[j] + '\n')print(path_name[j])f.close()

到此为止,制作数据集大概步骤以及相关的python代码已经展示完毕。希望对大家有帮助

遥感图像语义分割——从原始图像开始制作自己的数据集(以高分二号为例)相关推荐

  1. 【论文阅读】SCAttNet:具有空间和通道注意机制的高分辨率遥感图像语义分割网络

    [论文阅读]SCAttNet:具有空间和通道注意机制的高分辨率遥感图像语义分割网络 文章目录 [论文阅读]SCAttNet:具有空间和通道注意机制的高分辨率遥感图像语义分割网络 一.总体介绍 二.概述 ...

  2. 学习笔记-基于全局和局部对比自监督学习的高分辨率遥感图像语义分割-day2

    高分辨率遥感图像语义分割-day2 摘要 一.引言 二.方法 2.1 对比学习 2.2 全局风格与局部匹配对比学习网络(GLCNet) 2.2.1 全局风格对比学习模块: 2.2.2局部匹配对比学习: ...

  3. 基于全局和局部对比自监督学习的高分辨率遥感图像语义分割day3 - 网络结构

    基于全局和局部对比自监督学习的高分辨率遥感图像语义分割day3 - 网络结构 前言 自监督学习部分 语义分割细调部分 总结 前言 想要学习一个网络,最重要的就是网络结构和损失函数,一个讲了网络是怎么学 ...

  4. 【论文阅读】Swin Transformer Embedding UNet用于遥感图像语义分割

    [论文阅读]Swin Transformer Embedding UNet用于遥感图像语义分割 文章目录 [论文阅读]Swin Transformer Embedding UNet用于遥感图像语义分割 ...

  5. 【Keras】基于SegNet和U-Net的遥感图像语义分割

    from:[Keras]基于SegNet和U-Net的遥感图像语义分割 上两个月参加了个比赛,做的是对遥感高清图像做语义分割,美其名曰"天空之眼".这两周数据挖掘课期末projec ...

  6. Keras】基于SegNet和U-Net的遥感图像语义分割

    from:[Keras]基于SegNet和U-Net的遥感图像语义分割 上两个月参加了个比赛,做的是对遥感高清图像做语义分割,美其名曰"天空之眼".这两周数据挖掘课期末projec ...

  7. 学习笔记-基于全局和局部对比自监督学习的高分辨率遥感图像语义分割-day1

    基于全局和局部对比自监督学习的高分辨率遥感图像语义分割-day1 摘要 一. 引言 摘要 最近,监督深度学习在遥感图像(RSI)语义分割中取得了巨大成功. 然而,监督学习进行语义分割需要大量的标记样本 ...

  8. 遥感图像语义分割各公开数据集

    遥感图像语义分割数据集 1. Gaofen Image Dataset(GID) 2. ISPRS Test Project on Urban Classification and 3D Buildi ...

  9. 无人机遥感图像语义分割数据集UAVid使用

    一.无人机遥感图像语义分割数据集UAVid UAVid数据集是用于针对城市场景的语义分割任务的UAV视频数据集.它具有几个特点: 语义分割 4K分辨率无人机视频 8种物体类别 街景环境 示例图像: 下 ...

最新文章

  1. 年薪百万是什么感觉?
  2. DDD+中台+微服务,yyds
  3. 如何转换VMware ESX虚拟机到Hyper-V格式?
  4. 30岁自学python找工作-程序员自学Python开发,20到30岁几乎决定了你的未来!
  5. #研发解决方案介绍#基于StatsD+Graphite的智能监控解决方案
  6. SSH中设置字符编码防止乱码
  7. 使用Genymotion模拟器
  8. 计蒜客挑战难题:整数转换成罗马数字
  9. 网页制作中点一张图片变成图片浏览式_如何建设响应式网站?
  10. 使用JS禁用浏览器后退按钮
  11. Android Multimedia框架总结(四)MediaPlayer从Java层到C++层类关系及prepare及之后其他过...
  12. 各种语言支持wasm的情况
  13. C#程序设计实践教程pdf
  14. MySQL OCP 认证考试你知道吗?
  15. 如何卸载 STEP 7-MicroWIN编程软件?
  16. 光伏发电与计算机控制,独立太阳能光伏发电系统的控制设计与实现
  17. Shadowmask
  18. C语言 - 学习实践
  19. JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!
  20. C语言分数相加并将最后结果化为最简分式(新手程序!!!)

热门文章

  1. java8 joda_Joda Time项目和java8时间api
  2. 《炬丰科技-半导体工艺》半导体的清洗过程
  3. 2023免费的API 接口站
  4. Win10电脑Microsoft Store打不开
  5. sentinel 时间窗口_Sentinel滑动窗口算法
  6. 修改注册表(修改键盘按键)
  7. 精易编程助手 v1.09官方版
  8. 显示器IPS屏和TN屏的优缺点及差异
  9. matlab读取、播放wav文件
  10. 学习笔记(2):H3CS-WLAN 无线工程师认证-WLAN技术背景知识1