import numpy as np from scipy import signal from config import AMPLITUDE_THRESHOLD, DISTRIBUTION_THRESHOLD, ATTENUATION_THRESHOLD, REFLECTION_THRESHOLD def calculate_amplitude(image): return np.max(image) def classify_amplitude(amplitude): return "强" if amplitude > AMPLITUDE_THRESHOLD else "弱" def calculate_distribution_range(box): width, height = box[2] - box[0], box[3] - box[1] return width * height def classify_distribution_range(area): return "大" if area > DISTRIBUTION_THRESHOLD else "小" def calculate_attenuation_rate(image): gradient = np.gradient(np.array(image).mean(axis=2)) return np.mean(np.abs(gradient)) def classify_attenuation_rate(rate): return "快" if rate > ATTENUATION_THRESHOLD else "慢" def count_reflections(image, prominence=10): gray = np.mean(np.array(image), axis=2) peaks, _ = signal.find_peaks(np.mean(gray, axis=1), prominence=prominence) return len(peaks) def classify_reflections(count): return "多次反射" if count >= REFLECTION_THRESHOLD else "单次反射" def extract_features(image, detection_result): np_image = np.array(image) amplitude = calculate_amplitude(np_image) amplitude_class = classify_amplitude(amplitude) box = detection_result['boxes'][0].tolist() distribution_range = calculate_distribution_range(box) distribution_class = classify_distribution_range(distribution_range) attenuation_rate = calculate_attenuation_rate(np_image) attenuation_class = classify_attenuation_rate(attenuation_rate) reflection_count = count_reflections(np_image) reflection_class = classify_reflections(reflection_count) return { "振幅": amplitude_class, "分布范围": distribution_class, "衰减速度": attenuation_class, "反射次数": reflection_class, "振幅值": amplitude, "分布范围值": distribution_range, "衰减速度值": attenuation_rate, "反射次数值": reflection_count }