变化检测Google-CD数据集处理

1.Google-CD
包含20对图像,来源于Google Earth Map。图像分辨率为1006×1168 ~ 4936×5224像素。我们将图像裁剪成大小为256×256且没有重叠的小块,并将其随机分成三个部分:2504/313/313,分别用于训练/验证/测试。
2.数据集下载链接:
百度网盘:https://pan.baidu.com/s/19GNeHoZo1VfFli3N0jgxLA?pwd=4d6m
提取码:4d6m
3.数据集处理
三个文件夹(T1,T2,label)TIF格式、TIF格式和PNG格式,里面图片分别裁剪成大小为256×256且没有重叠的小块,每个文件夹得到3130个总数,生成的图片格式都是PNG。分别放入新的三个文件夹(A,B,label),并且三个文件夹以前对应相同名字的图片切割后名字也一样。
注意改一下文件路径。

import os
import random
from PIL import Image

def split_image(image_path, output_folder):

    # 打开图片
    img = Image.open(image_path)

    # 转换成PNG格式
    img = img.convert('RGB')

    # 计算分割后的小块数量
    width, height = img.size
    x_blocks = width // 256
    y_blocks = height // 256
    num_blocks = x_blocks * y_blocks

    # 分割图片
    for i in range(x_blocks):
        for j in range(y_blocks):
            box = (i*256, j*256, (i+1)*256, (j+1)*256)
            block = img.crop(box)

            # 保存分割后的小块
            filename = image_path.split('/')[-1][:-4] + '_' + str(i) + '_' + str(j) + '.png'
            block.save(os.path.join(output_folder, filename))

    return num_blocks

# 分割T1文件夹里的图片,并保存到1文件夹
T1_path = 'T1/'
output_path = 'A/'
if not os.path.exists(output_path):
    os.makedirs(output_path)

num_blocks = 0
for filename in os.listdir(T1_path):
    if filename.endswith('.tif'):
        image_path = os.path.join(T1_path, filename)
        num_blocks += split_image(image_path, output_path)
    elif filename.endswith('.tiff'):
        image_path = os.path.join(T1_path, filename)
        num_blocks += split_image(image_path, output_path)
    elif filename.endswith('.png'):
        image_path = os.path.join(T1_path, filename)
        num_blocks += split_image(image_path, output_path)

print(f'T1分割后得到{num_blocks}个小块')

# 分割T2文件夹里的图片,并保存到2文件夹
T2_path = 'T2/'
output_path = 'B/'
if not os.path.exists(output_path):
    os.makedirs(output_path)

num_blocks = 0
for filename in os.listdir(T2_path):
    if filename.endswith('.tif'):
        image_path = os.path.join(T2_path, filename)
        num_blocks += split_image(image_path, output_path)
    elif filename.endswith('.tiff'):
        image_path = os.path.join(T2_path, filename)
        num_blocks += split_image(image_path, output_path)
    elif filename.endswith('.png'):
        image_path = os.path.join(T2_path, filename)
        num_blocks += split_image(image_path, output_path)

print(f'T2分割后得到{num_blocks}个小块')

# 分割label文件夹里的图片,并保存到3文件夹
label_path = 'label/'
output_path = 'label/'
if not os.path.exists(output_path):
    os.makedirs(output_path)

num_blocks = 0
for filename in os.listdir(label_path):
    if filename.endswith('.tif'):
        image_path = os.path.join(label_path, filename)
        num_blocks += split_image(image_path, output_path)
    elif filename.endswith('.tiff'):
        image_path = os.path.join(label_path, filename)
        num_blocks += split_image(image_path, output_path)
    elif filename.endswith('.png'):
        image_path = os.path.join(label_path, filename)
        num_blocks += split_image(image_path, output_path)

print(f'label分割后得到{num_blocks}个小块')

4.划分训练集、验证集、测试集8:1:1
复制A文件夹,生成train,test, val文件夹

import os
import random
from PIL import Image

# 创建train、test、val文件夹
train_path = 'train/'
test_path = 'test/'
val_path = 'val/'
for path in [train_path, test_path, val_path]:
    if not os.path.exists(path):
        os.makedirs(path)

# 把A文件夹图片按8:1:1比例随机放入train、test、val文件夹
A_path = 'A1/'
image_paths = [os.path.join(A_path, filename) for filename in os.listdir(A_path) if filename.endswith('.png')]
random.shuffle(image_paths)
num_images = len(image_paths)
train_num = int(num_images * 0.8)
test_num = int(num_images * 0.1)
val_num = num_images - train_num - test_num
for i, path in enumerate(image_paths):
    if i < train_num:
        output_folder = train_path
    elif i < train_num + test_num:
        output_folder = test_path
    else:
        output_folder = val_path
    output_path = os.path.join(output_folder, path.split('/')[-1])
    os.rename(path, output_path) # 移动文件到新文件夹

5.生成list文件
读取文件夹图片名并生成.txt文件

import os

folder_path = '/test/'
with open('test.txt', 'w') as f:
    for filename in os.listdir(folder_path):
        if filename.endswith('.jpg') or filename.endswith('.png'):
            f.write(filename + '\n')

6. label RGB NO
报错:

ValueError: size shape must match input shape. Input is 2D, size is 4

(255,255,3)转为(255,255)

import os
import cv2
import numpy as np

# 输入文件夹路径
input_folder_path =  r'F:\label'

# 输出文件夹路径
output_folder_path =  r'F:\label1'

# 遍历所有图片并转换到灰度图像
for filename in os.listdir(input_folder_path):
    if filename.endswith(".png"):
        # 读入原始RGB图像
        img = cv2.imread(os.path.join(input_folder_path, filename))

        # 转换到灰度图像
        gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

        # 保存到指定路径
        cv2.imwrite(os.path.join(output_folder_path, filename), gray)

猜你喜欢

转载自blog.csdn.net/qq_40994007/article/details/131326400