File size: 2,462 Bytes
58c7472
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import cv2
import numpy as np
import xgboost as xgb
import os

def get_lab_stats(image_path):
    """Extracts LAB mean and std for each channel from the image."""
    img = cv2.imread(image_path)
    if img is None:
        raise FileNotFoundError(f"Image not found at: {image_path}")
    
    img = cv2.resize(img, (50, 50))  # Optional resize for consistency
    lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
    l, a, b = cv2.split(lab)

    return {
        "L_mean": np.mean(l), "A_mean": np.mean(a), "B_mean": np.mean(b),
        "L_std": np.std(l), "A_std": np.std(a), "B_std": np.std(b)
    }

def extract_features(c_path, t_path):
    """Computes final 15-dim feature vector based on LAB color stats."""
    c_feat = get_lab_stats(c_path)
    t_feat = get_lab_stats(t_path)

    # Ratios
    L_ratio = t_feat["L_mean"] / (c_feat["L_mean"] + 1e-6)
    A_ratio = t_feat["A_mean"] / (c_feat["A_mean"] + 1e-6)
    B_ratio = t_feat["B_mean"] / (c_feat["B_mean"] + 1e-6)

    # Differences
    L_diff = t_feat["L_mean"] - c_feat["L_mean"]
    A_diff = t_feat["A_mean"] - c_feat["A_mean"]
    B_diff = t_feat["B_mean"] - c_feat["B_mean"]

    # Std Ratios
    L_std_ratio = t_feat["L_std"] / (c_feat["L_std"] + 1e-6)
    A_std_ratio = t_feat["A_std"] / (c_feat["A_std"] + 1e-6)
    B_std_ratio = t_feat["B_std"] / (c_feat["B_std"] + 1e-6)

    # Include raw stds
    feature_vector = [
        L_ratio, A_ratio, B_ratio,
        L_diff, A_diff, B_diff,
        L_std_ratio, A_std_ratio, B_std_ratio,
        c_feat["L_std"], c_feat["A_std"], c_feat["B_std"],
        t_feat["L_std"], t_feat["A_std"], t_feat["B_std"]
    ]
    
    return np.array(feature_vector)

def quantitative_analysis(c_path, t_path, model_path="xgb_model.json"):
    """Predicts hCG concentration from C and T line image paths."""
    if not os.path.exists(model_path):
        raise FileNotFoundError(f"Model file not found at: {model_path}")
    
    # Load trained model
    booster = xgb.Booster()
    booster.load_model(model_path)

    # Extract features
    features = extract_features(c_path, t_path)
    dmatrix = xgb.DMatrix(features.reshape(1, -1))

    # Make prediction
    prediction = booster.predict(dmatrix)[0]
    return round(prediction, 2)

# 🔍 Example usage
# pred = quantitative_analysis("path_to_c_image.jpg", "path_to_t_image.jpg")
# print(f"Predicted hCG Concentration: {pred} mIU/mL")