一、数据预处理
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}' 不存在.")