File size: 2,559 Bytes
2590409
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3228ab0
 
 
 
 
 
 
 
 
 
2590409
 
 
 
3228ab0
 
 
 
 
 
 
 
 
 
2590409
 
 
 
 
 
 
 
 
 
 
 
3228ab0
 
 
 
2590409
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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):
    """
    Extract features from the image and detection result.
    
    Args:
        image: PIL Image
        detection_result: Dictionary containing detection results
        
    Returns:
        Dictionary of features
    """
    np_image = np.array(image)
    amplitude = calculate_amplitude(np_image)
    amplitude_class = classify_amplitude(amplitude)

    # Handle box calculation
    if detection_result and 'boxes' in detection_result and len(detection_result['boxes']) > 0:
        box = detection_result['boxes'][0]
        if not isinstance(box, list):
            box = box.tolist()
        distribution_range = calculate_distribution_range(box)
        distribution_class = classify_distribution_range(distribution_range)
    else:
        distribution_range = 0
        distribution_class = "小"

    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,
        "振幅值": float(amplitude),
        "分布范围值": float(distribution_range),
        "衰减速度值": float(attenuation_rate),
        "反射次数值": int(reflection_count)
    }