fix: 修复工作目录与步骤名不对应、回归预测虚数报错、模型加载及预处理名称转换问题,重构可视化并修正勾选联动

This commit is contained in:
2026-04-14 17:41:38 +08:00
parent b0a94ba1e7
commit 9b7bcfadd1
17 changed files with 12470 additions and 3113 deletions

View File

@ -16,78 +16,46 @@ except ImportError:
def get_wavelengths_from_bil_header(bil_file):
"""
从BIL文件的头文件中读取波长信息
从BIL文件的头文件中读取波长信息使用spectral库
参数:
bil_file: str - BIL文件路径
bil_file: str - BIL文件路径
返回:
list - 波长列表如果无法获取则返回None
list - 波长列表如果无法获取则返回None
"""
try:
# 获取头文件路径通常与BIL文件同目录后缀为.hdr
# 获取头文件路径
header_file = os.path.splitext(bil_file)[0] + ".hdr"
if not os.path.exists(header_file):
print(f"警告: 找不到头文件 {header_file}")
return None
wavelengths = []
# 使用spectral库读取头文件
import spectral.io.envi as envi
header = envi.read_envi_header(header_file)
with open(header_file, 'r', encoding='utf-8') as f:
lines = f.readlines()
# 获取波长信息
wavelengths = header.get('wavelength', None)
if wavelengths is not None:
# 确保是列表形式
if isinstance(wavelengths, str):
# 如果是字符串,解析为列表
wavelengths = wavelengths.strip('{}').replace(',', ' ').split()
wavelengths = [float(w.strip()) for w in wavelengths if w.strip()]
# 查找包含波长信息的行
wavelength_lines = []
in_wavelength_block = False
# 过滤掉0值和无效值
wavelengths = [float(w) for w in wavelengths if float(w) > 0]
for line in lines:
stripped_line = line.strip()
# 检测波长块的开始(精确匹配 wavelength =
if stripped_line.startswith('wavelength ='):
in_wavelength_block = True
# 提取第一行的波长信息
wavelength_str = stripped_line.replace('wavelength =', '').strip()
if wavelength_str.startswith('{'):
wavelength_str = wavelength_str[1:].strip()
wavelength_lines.append(wavelength_str)
# 检测波长块的中间行
elif in_wavelength_block:
if '}' in stripped_line:
# 波长块结束
end_str = stripped_line.replace('}', '').strip()
if end_str:
wavelength_lines.append(end_str)
in_wavelength_block = False
else:
wavelength_lines.append(stripped_line)
print(f"从头文件读取到 {len(wavelengths)} 个波长值")
print(f"波长范围: {min(wavelengths):.2f} ~ {max(wavelengths):.2f}")
return wavelengths
else:
print("警告: 头文件中未找到波长信息")
return None
if wavelength_lines:
# 合并所有波长行
combined_wavelengths = ' '.join(wavelength_lines)
# 移除所有花括号和逗号
combined_wavelengths = combined_wavelengths.replace('{', '').replace('}', '').strip()
# 分割波长值(支持逗号和空格分隔)
wavelength_values = []
for part in combined_wavelengths.split(','):
part = part.strip()
if part:
# 处理可能的多值情况(空格分隔)
for value in part.split():
if value.strip():
try:
wavelength_values.append(float(value.strip()))
except ValueError:
continue
print(f"从头文件读取到 {len(wavelength_values)} 个波长值")
return wavelength_values
else:
print("警告: 头文件中未找到波长信息")
return None
except Exception as e:
print(f"读取头文件波长信息时发生错误: {str(e)}")
return None
@ -1021,10 +989,10 @@ def get_coor_base_interval(water_mask, severe_glint=None, output_csvpath=None, i
# 使用示例
if __name__ == "__main__":
# 新功能使用示例
bil_file = r"D:\BaiduNetdiskDownload\yaobao\result3.bsq"
water_mask_shp = r"D:\BaiduNetdiskDownload\yaobao\roi\roi.shp"
severe_glint = r"D:\BaiduNetdiskDownload\yaobao\find_glint\result3_glint_otsu"
output_csvpath = r"D:\BaiduNetdiskDownload\yaobao\csv\spectral_sampling_results.csv"
bil_file = r"E:\wq_gui_test\3_deglint\deglint_goodman.bsq"
water_mask_shp = r"E:\wq_gui_test\1_water_mask\water_mask_from_shp.dat"
severe_glint = r"E:\wq_gui_test\2_glint\severe_glint_area.dat"
output_csvpath = r"E:\wq_gui_test\10_sampling\sampling_spectra.csv"
# 设置参数
interval = 50 # 基础采样点间隔像元数当use_adaptive_sampling=False时使用