fix: 修复工作目录与步骤名不对应、回归预测虚数报错、模型加载及预处理名称转换问题,重构可视化并修正勾选联动
This commit is contained in:
@ -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时使用
|
||||
|
||||
Reference in New Issue
Block a user