按百分比对变化检测数据抓取
2026.3.9
import os
import shutil
from PIL import Image
import numpy as np
def white_area_ratio(image_path, threshold=200):
"""
计算图像中白色像素的比例。
:param image_path: 图像文件路径
:param threshold: 判断为白色的灰度阈值(默认200,像素值>threshold视为白色)
:return: 白色像素比例(0~1)
"""
try:
img = Image.open(image_path).convert('L') # 转为灰度图
img_array = np.array(img)
white_pixels = np.sum(img_array > threshold)
total_pixels = img_array.size
return white_pixels / total_pixels
except Exception as e:
print(f"无法处理图像 {image_path}: {e}")
return 0.0
def copy_img(source_folder, dest_folder, filename, pre_dir, post_dir):
# 源目录
# 改变到上级目录
parent_dir = os.path.abspath(os.path.join(source_folder, os.pardir))
os.chdir(parent_dir)
# 再次获取当前工作目录以确认已更改
new_dir = os.getcwd()
pre_A = os.path.join(new_dir, pre_dir)
pre_image_A = os.path.join(pre_A, filename)
pre_B = os.path.join(new_dir, post_dir)
pre_image_B = os.path.join(pre_B, filename)
# 目标路径
parent_dir_1 = os.path.abspath(os.path.join(dest_folder, os.pardir))
os.chdir(parent_dir_1)
new_dir_1 = os.getcwd()
post_A = os.path.join(new_dir_1, pre_dir)
post_image_A = os.path.join(post_A, filename)
post_B = os.path.join(new_dir_1, post_dir)
post_image_B = os.path.join(post_B, filename)
if not os.path.exists(post_A):
os.makedirs(post_A)
if not os.path.exists(post_B):
os.makedirs(post_B)
shutil.copy(pre_image_A, post_image_A)
shutil.copy(pre_image_B, post_image_B)
def main(source_folder, dest_folder, ratio_threshold=0.05, pre_dir=None, post_dir=None):
"""
主函数:筛选白色面积大于阈值的图像并复制。
:param post_dir:
:param pre_dir:
:param source_folder: 源文件夹路径
:param dest_folder: 目标文件夹路径
:param ratio_threshold: 白色比例阈值(默认0.05即5%)
"""
if not os.path.exists(dest_folder):
os.makedirs(dest_folder) # 创建目标文件夹(如果不存在)
# 支持的图像格式扩展名
image_extensions = {'.png', '.jpg', '.jpeg', '.bmp', '.tiff', '.tif'}
for filename in os.listdir(source_folder):
file_path = os.path.join(source_folder, filename)
if not os.path.isfile(file_path):
continue # 跳过子文件夹
# 检查文件扩展名
ext = os.path.splitext(filename)[1].lower()
if ext not in image_extensions:
continue
# 计算白色比例
ratio = white_area_ratio(file_path)
if ratio > ratio_threshold:
shutil.copy(file_path, os.path.join(dest_folder, filename))
copy_img(source_folder, dest_folder, filename, pre_dir, post_dir)
print(f"已复制: {filename} (白色占比 {ratio:.2%})")
else:
print(f"跳过: {filename} (白色占比 {ratio:.2%} <= {ratio_threshold:.2%})")
if __name__ == "__main__":
# 标签文件夹路径
source_dir = r"dataset_part_0009/labels" # 源路径
dest_dir = r"dataset_part_0009/labels" # 目标路径
# 影像文件夹路径
pre_img = "before"
post_img = "after"
date_ratio = 0.05
main(source_dir, dest_dir, date_ratio, pre_img, post_img)

