GF-2遥感影像深度学习样本制作

一、数据预处理

1.GF-2数据预处理

首先将GF-2影像进行辐射定标 、大气校正、辐射校正等处理,这部分看其他人的教程,最后将GF-2数据导出为包含B,G,R波段的tif影像,然后将该影像在在arcmap中导出png格式,下面红色框的部分一定要确保选中了,其他保持默认状态,Nodata部分我没改,可以直接删了也没事。

 2.标签数据预处理

首先将影像加载到易康中进行多尺度分割,我的分割尺度为200,紧致度因子与形状因子保持默认也可以,我调成0.8,和0.1,只要能贴合你的目标物即可。

然后我创建0(背景)和1(目标)两个类别,简便的办法是你先将1类别分完,然后在利用assign class算法将未分类的对象归为0.

 assign算法

 然后将分好的0和1导出。下面的图我还没有运行assign class算法,忽略。

 然后将这个tif图在ENVI中打开,进行灰度分割(new raster color slice ),然后将这个灰度分割后的影像导出为tif格式。

 

 转换格式:方式一:用上面介绍的arcmap中进行格式转换。方式二:将刚才导出的tiff格式图片利用python进行格式转换,这样png格式的标签文件就制作好了。

from PIL import Image

def tif_to_png(input_path, output_path):
    try:
        Image.MAX_IMAGE_PIXELS = None  # 解除图像大小限制
        image = Image.open(input_path)
        image.save(output_path, "PNG")
        print("转换成功!")
    except Exception as e:
        print("转换失败:", str(e))

# 调用示例
input_path = "I:\yuanyang\gaofen2_deeplearningtiff2\labeltif_all\label_slice.tif"   # 输入的TIF图像路径
output_path = "G:\Terrece_deeplearning\mask_all\label_all.png" # 输出的PNG图像路径
tif_to_png(input_path, output_path)

 2.裁剪

接下来就可以将影像和标签文件进行裁剪了,下面需要改一下输出输入路径即可, 我设置的重复率为0.6(为扩充样本),裁剪的高与宽的像素大小为512,您可以根据自己的需求进行调整。

from PIL import Image
import os
from PIL import Image, ImageFile

# 修改PIL的像素限制
ImageFile.LOAD_TRUNCATED_IMAGES = True
Image.MAX_IMAGE_PIXELS = None

def batch_crop_images(input_dir, output_dir, overlap_ratio=0.6):
    # 获取目标文件夹中的所有文件
    image_files = os.listdir(input_dir)

    for file_name in image_files:
        # 如果文件不是PNG格式则跳过
        if not file_name.lower().endswith('.png'):
            continue

        # 打开图片文件
        image_path = os.path.join(input_dir, file_name)
        image = Image.open(image_path)

        # 获取图片的宽和高
        width, height = image.size

        # 计算需要裁剪的行数和列数
        num_rows = int(height // (512 * (1 - overlap_ratio))) + 1
        num_cols = int(width // (512 * (1 - overlap_ratio))) + 1

        # 利用数字命名裁剪后的图像
        count = 0
        for row in range(num_rows):
            for col in range(num_cols):
                # 计算裁剪的区域
                left = int(col * 512 * (1 - overlap_ratio))
                top = int(row * 512 * (1 - overlap_ratio))
                right = int(left + 512)
                bottom = int(top + 512)

                # 裁剪图片
                cropped_image = image.crop((left, top, right, bottom))

                # 生成文件名并保存裁剪后的图片
                output_file_name = f'{count}.png'
                output_path = os.path.join(output_dir, output_file_name)
                cropped_image.save(output_path)

                count += 1

        # 关闭图片文件
        image.close()

# 调用函数进行批量裁剪
input_directory = 'G:\Terrece_deeplearning\mask_all'
output_directory = 'G:\Terrece_deeplearning\label_clip_0.6'
overlap_ratio = 0.6
batch_crop_images(input_directory, output_directory, overlap_ratio)

影像:

标签:

3.删除无效样本代码:

方式一:首先在标签文件夹中将全是背景样本的图片删除,最后根据for循环判断标签文件夹中的图片名称是否等于影像文件夹中的名称,将不等于的标签文件进行删除。

import os

folder_a = 'G:\Terrece_deeplearning\label_clip_0.6'  # 指定A文件夹路径
folder_b = 'G:\Terrece_deeplearning\image_clip_0.6'  # 指定B文件夹路径

files_a = set(os.listdir(folder_a))  # 获取A文件夹中的所有文件
files_b = set(os.listdir(folder_b))  # 获取B文件夹中的所有文件

for file in files_b:
    if file.endswith('.png') and file not in files_a:
        file_path = os.path.join(folder_b, file)  # 获取文件完整路径
        os.remove(file_path)  # 删除文件

方式二:同时访问两个文件(影像文件和标签文件),通过名称进行删除。但是建议用方式一,方式二费手,累得很。

import os

folder_patha = 'G:\Terrece_deeplearning\label_clip_0.6'  # 文件夹路径
file_names =  ["20457.png","13335.png","13356.png","5901.png"
]  # 要删除的文件名列表

for file_name in file_names:
    file_patha = os.path.join(folder_patha, file_name)  # 文件路径

    if os.path.exists(file_patha):
        os.remove(file_patha)
        print(f"文件a '{file_name}' 已成功删除.")
    else:
        print(f"文件a '{file_name}' 不存在.")

folder_pathb = 'G:\Terrece_deeplearning\image_clip_0.6'  # 文件夹路径

for file_name in file_names:
    file_pathb = os.path.join(folder_pathb, file_name)  # 文件路径

    if os.path.exists(file_pathb):
        os.remove(file_pathb)
        print(f"文件b '{file_name}' 已成功删除.")
    else:
        print(f"文件b '{file_name}' 不存在.")



folder_path1 = 'G:\Terrece_deeplearning\label_clip_0.6'  # 文件夹路径
start_num = 2128# 起始文件名编号
end_num = 21282# 结束文件名编号
#label
for num in range(start_num, end_num + 1):
    file_name = str(num) + '.png'  # 构造文件名
    file_path1 = os.path.join(folder_path1, file_name)  # 文件路径

    if os.path.exists(file_path1):
        os.remove(file_path1)
        print(f"文件1中 '{file_name}' 已成功删除.")
    else:
        print(f"文件1中 '{file_name}' 不存在.")

#image
folder_path2 = 'G:\Terrece_deeplearning\image_clip_0.6'
for num in range(start_num, end_num + 1):
    file_name = str(num) + '.png'  # 构造文件名
    file_path2 = os.path.join(folder_path2, file_name)  # 文件路径

    if os.path.exists(file_path2):
        os.remove(file_path2)
        print(f"文件2中 '{file_name}' 已成功删除.")
    else:
        print(f"文件2中 '{file_name}' 不存在.")

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值