65 lines
1.7 KiB
Python
65 lines
1.7 KiB
Python
import os
|
||
|
||
|
||
def expand_bbox(label_path, k=1.1):
|
||
"""
|
||
扩大YOLO标签的边界框
|
||
:param label_path: 标签文件路径(.txt)
|
||
:param k: 扩大系数(k>1)
|
||
"""
|
||
with open(label_path, 'r') as f:
|
||
lines = f.readlines()
|
||
|
||
new_lines = []
|
||
for line in lines:
|
||
line = line.strip()
|
||
if not line:
|
||
continue
|
||
# 解析标签
|
||
class_id, xc, yc, w, h = line.split()
|
||
xc = float(xc)
|
||
yc = float(yc)
|
||
w = float(w)
|
||
h = float(h)
|
||
|
||
# 计算新宽高
|
||
new_w = w * k
|
||
new_h = h * k
|
||
|
||
# 计算边界
|
||
x1 = xc - new_w / 2
|
||
y1 = yc - new_h / 2
|
||
x2 = xc + new_w / 2
|
||
y2 = yc + new_h / 2
|
||
|
||
# 截断超出图像的部分(0~1范围)
|
||
x1 = max(0.0, x1)
|
||
y1 = max(0.0, y1)
|
||
x2 = min(1.0, x2)
|
||
y2 = min(1.0, y2)
|
||
|
||
# 重新计算中心和宽高
|
||
new_xc = (x1 + x2) / 2
|
||
new_yc = (y1 + y2) / 2
|
||
new_w = x2 - x1
|
||
new_h = y2 - y1
|
||
|
||
# 保留6位小数,拼接新标签
|
||
new_line = f"{class_id} {new_xc:.6f} {new_yc:.6f} {new_w:.6f} {new_h:.6f}\n"
|
||
new_lines.append(new_line)
|
||
|
||
# 写入新标签(覆盖原文件,或改为新路径)
|
||
with open(label_path, 'w') as f:
|
||
f.writelines(new_lines)
|
||
|
||
|
||
# 批量处理文件夹中的所有标签
|
||
label_dir = r"D:\DataPreHandler\yuanshi_data\images\val\labels" # 替换为你的标签文件夹路径
|
||
k = 1.25 # 扩大系数,根据需求调整
|
||
|
||
for filename in os.listdir(label_dir):
|
||
if filename.endswith('.txt'):
|
||
label_path = os.path.join(label_dir, filename)
|
||
expand_bbox(label_path, k)
|
||
|
||
print("处理完成!") |