File size: 1,587 Bytes
ba6a669
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import numpy as np
import pandas as pd
from sklearn.utils import estimator_html_repr
from PIL import Image
import requests
import rasterio
import tensorflow as tf
import io
from io import BytesIO
from scipy.stats.mstats import winsorize

def preprocess_tabular_data(df_tabular, preprocessor):
    
    # Winsorize outliers
    outlier_columns = ['avg_rainfall', 'max_rainfall', 'avg_temperature',
                       'elevation', 'slope', 'soil_moisture']
    for col in outlier_columns:
        df_tabular[col] = winsorize(df_tabular[col], limits=[0.01, 0.01])

    # Transform with pre-fitted preprocessor
    X_processed = preprocessor.transform(df_tabular)
    return X_processed

def load_image_as_array(image_url, target_size=(128, 128)):
    # Download gambar dari URL dan baca pakai rasterio dari buffer
    response = requests.get(image_url)
    response.raise_for_status()
    file_bytes = io.BytesIO(response.content)

    with rasterio.MemoryFile(file_bytes) as memfile:
        with memfile.open() as src:
            img = src.read([1, 2, 3])  # Ambil channel RGB
            img = np.nan_to_num(img, nan=0.0).astype(np.float32)

            # Normalisasi tiap channel (min-max)
            img_min, img_max = img.min(), img.max()
            img = (img - img_min) / (img_max - img_min + 1e-6)

            img = np.transpose(img, (1, 2, 0))  # (H, W, C)

    # Resize pakai TensorFlow ke target_size (default 128x128)
    img = tf.image.resize(img, target_size).numpy()

    # Tambahkan batch dimension (1, H, W, C)
    img = np.expand_dims(img, axis=0)
    return img