Module 6 (RGB Vegetation Condition Analysis) merupakan komponen analitik citra udara drone pada platform Lambdasz Aerial Analytics. Modul ini dirancang untuk mengevaluasi tingkat kesehatan, vigoritas, dan kondisi visual kanopi vegetasi secara kuantitatif berbasis data spektral RGB tampak standar (tanpa memerlukan sensor Near-Infrared/NIR atau kamera multispektral yang mahal).
Secara arsitektural, Modul 6 memproses area kanopi vegetasi yang telah diisolasi dari latar belakang non-vegetasi (seperti tanah terbuka, aspal, air, dan atap bangunan). Untuk memastikan eksekusi eksperimen yang mandiri (decoupled), modul ini dilengkapi dengan adapter Mock Module 4 berbasis algoritma Excess Green (
Implementasi algoritma pada modul ini berakar kuat pada temuan empiris literatur ilmiah remote sensing berikut:
-
Coswosk et al. (2024) — Remote Sensing:
- Indeks VARI (Visible Atmospherically Resistant Index)
$\frac{G - R}{G + R - B}$ terbukti memiliki korelasi linear tertinggi ($r = 0.99$ ) terhadap biomassa hijau dan aktivitas fotosintesis kanopi di bawah pencahayaan alami drone. - Sudut Hue (
$H$ ) pada ruang warna HSL ($r = 0.97\text{--}0.99$ ) dan komponen ruang warna CIELab merupakan pemisah spektral paling stabil terhadap variasi intensitas cahaya. - Gejala klorosis atau penuaan dini kanopi diidentifikasi melalui transisi sudut Hue dari hijau ke kuning (
$50^\circ \le H \le 75^\circ$ ).
- Indeks VARI (Visible Atmospherically Resistant Index)
-
Peticilă et al. (2025) — AgriEngineering:
- Menghitung indeks vegetasi langsung pada citra tanpa segmentasi kanopi menimbulkan distorsi spektral akibat pantulan tanah terbuka (soil background) dan seresah kering.
- Pre-masking kanopi wajib dilakukan sebelum kalkulasi indeks kondisi.
-
Matyukira & Mhangara (2024/2025) — Geocarto International:
- Peringatan multikolinearitas (Variance Inflation Factor tinggi): pemilihan indeks dibatasi pada metrik non-redundan.
- Indeks RBVI (Red-Blue Vegetation Index)
$\frac{R - B}{R + B}$ dan rasio reflektansi merah dominan ($R > 0.90 \times G$ ) terbukti paling responsif dalam mendeteksi stres berat, daun terbakar matahari, dehidrasi, dan nekrosis (browning).
Seluruh logika komputasi analitik dibangun mematuhi aturan pemrograman fungsional murni:
-
Immutability (Ketidakberubahan): Tidak ada mutasi array citra secara in-place (dilarang menggunakan
img[mask] = ...atau operasi mutasi internal). Setiap transformasi menghasilkan array atau struktur data baru (np.where, slicing immutabel, pure transforms). - Referential Transparency & Deterministic: Output fungsi hanya bergantung secara deterministik pada argumen input tanpa membaca atau menulis global state.
- Separation of Concerns (Pemisahan I/O): Komputasi matematis/matriks dipisahkan secara tegas dari operasi input/output berkas ke disk.
-
Numerical Stability: Seluruh formula pembagian ditambahkan konstanta regularisasi
$\epsilon = 10^{-6}$ pada penyebut untuk mengeliminasi potensiZeroDivisionError,NaN, atauInf.
def mock_detect_vegetation(rgb_float: np.ndarray) -> np.ndarray- Fungsi: Mensimulasikan isolasi kanopi Modul 4.
-
Formula:
$$r = \frac{R}{R + G + B + \epsilon}, \quad g = \frac{G}{R + G + B + \epsilon}, \quad b = \frac{B}{R + G + B + \epsilon}$$ $$ExG = 2g - r - b$$ -
Kriteria Kanopi Aktif:
$$ExG > 0.04 \quad \land \quad G > R \quad \land \quad 0.08 < \text{Brightness} < 0.95$$ Menyaring lapangan pasir, jalan aspal, badan air, dan atap bangunan.
def calculate_green_intensity(rgb_img: np.ndarray, mask: np.ndarray, method: str = "VARI") -> np.ndarray-
Fungsi: Menghitung grid intensitas vigoritas kontinu bounded pada interval
$[-1.0, 1.0]$ . -
Formula VARI:
$$\text{VARI} = \frac{G - R}{G + R - B + \epsilon}$$ -
Keluaran: Nilai VARI untuk piksel kanopi (
mask == True), dan0.0untuk piksel non-vegetasi.
def analyze_color_characteristics(rgb_img: np.ndarray, mask: np.ndarray) -> Dict[str, float]- Fungsi: Mengekstrak distribusi fotometrik dan metrik warna kanopi murni.
-
Metrik:
- Mean & Standard Deviation kanal
$R, G, B$ . - Mean Sudut Hue HSL (
$0^\circ\text{--}360^\circ$ ). - Mean Saturasi HSL (
$0.0\text{--}1.0$ ).
- Mean & Standard Deviation kanal
def classify_vegetation_condition(vari_grid: np.ndarray, mask: np.ndarray, thresholds: dict = None) -> Tuple[np.ndarray, Dict[str, Any]]-
Tingkat Kondisi (3-Tier Physiological States):
-
Class 3 (Vigorous):
$\text{VARI} \ge 0.25$ -
Class 2 (Moderate Stress):
$0.05 \le \text{VARI} < 0.25$ -
Class 1 (Severe Stress):
$\text{VARI} < 0.05$ - Class 0 (Non-vegetation): Piksel latar belakang non-kanopi.
-
Class 3 (Vigorous):
-
Keluaran: Array klasifikasi diskrit (
uint8) dan statistik persentase luasan kanopi per kelas.
def detect_yellowing(rgb_img: np.ndarray, mask: np.ndarray) -> Tuple[np.ndarray, float]- Fungsi: Mengisolasi degradasi klorofil daun pada kanopi aktif.
-
Kriteria Spektral:
$$\text{mask} \quad \land \quad 50^\circ \le \text{Hue} \le 75^\circ \quad \land \quad \text{Saturation} > 0.20$$ - Keluaran: Binary mask piksel menguning dan persentase luasannya terhadap kanopi aktif.
def detect_browning(rgb_img: np.ndarray, mask: np.ndarray) -> Tuple[np.ndarray, float]- Fungsi: Mengidentifikasi jaringan daun mati/kering kecokelatan (browning / necrosis).
-
Formula & Kriteria:
$$\text{RBVI} = \frac{R - B}{R + B + \epsilon} > 0.15 \quad \land \quad R > 0.90 \times G$$ - Keluaran: Binary mask piksel nekrosis dan persentase luasannya terhadap kanopi aktif.
Untuk memaksimalkan readability, maintainability, dan kemudahan integrasi tim pengembang, seluruh fungsionalitas Modul 6 telah dipisahkan ke dalam modul/berkas terpisah di dalam paket module6/:
Module-6-Experiment/
├── assets/ # Citra drone masukan (input samples)
│ ├── IMG_SAMPLE_1.jpeg
│ ├── IMG_SAMPLE_2.jpeg
│ ├── IMG_SAMPLE_3.jpeg
│ ├── IMG_SAMPLE_4.jpeg
│ └── IMG_SAMPLE_5.jpeg
├── module6/ # Paket Inti Module 6 (Modular Architecture)
│ ├── __init__.py # Re-export API publik, versioning, package metadata
│ ├── constants.py # Konstanta numerik (EPSILON) & ambang batas default
│ ├── types.py # Dataclass immutable (VegetationAnalysisResult)
│ ├── color.py # Konversi ruang warna HSL murni tervektorisasi
│ ├── adapter.py # Mock Module 4 adapter (mock_detect_vegetation via ExG)
│ ├── greenness.py # Submodul M6.1: calculate_green_intensity (VARI)
│ ├── spectral.py # Submodul M6.2: analyze_color_characteristics (RGB/HSL)
│ ├── condition.py # Submodul M6.3: classify_vegetation_condition (3-Tier)
│ ├── yellowing.py # Submodul M6.4: detect_yellowing (Klorosis / Senescence)
│ ├── browning.py # Submodul M6.5: detect_browning (Nekrosis / RBVI)
│ ├── pipeline.py # Orkestrator alur analitik murni (analyze_vegetation_image)
│ └── io.py # Pemisahan I/O (loader citra, discovery, plot, CSV)
├── experiment_results/ # Direktori luaran otomatis
│ ├── IMG_SAMPLE_1_module6_analysis.png # Panel visual multi-komparatif (200 DPI)
│ ├── IMG_SAMPLE_2_module6_analysis.png
│ ├── IMG_SAMPLE_3_module6_analysis.png
│ ├── IMG_SAMPLE_4_module6_analysis.png
│ ├── IMG_SAMPLE_5_module6_analysis.png
│ └── module6_experiment_summary.csv # Tabel rekapitulasi data statistik
├── run_experiment_module6.py # Runner skrip eksperimen mandiri
└── README.md # Dokumentasi teknis & panduan modul
Setiap fungsi dan kelas pada seluruh berkas di dalam paket module6 telah didokumentasikan secara komprehensif mengikuti standar docstring PEP 257 / Google Style. Anggota tim developer lain dapat membaca dokumentasi ini secara langsung menggunakan antarmuka bawaan Python pydoc.
Untuk membaca dokumentasi paket utama atau submodul tertentu di terminal:
# Membaca dokumentasi menyeluruh paket module6
python -m pydoc module6
# Membaca dokumentasi submodul M6.1 (Greenness / VARI)
python -m pydoc module6.greenness.calculate_green_intensity
# Membaca dokumentasi submodul M6.3 (Condition Classification)
python -m pydoc module6.condition.classify_vegetation_condition
# Membaca dokumentasi submodul M6.4 (Yellowing / Chlorosis)
python -m pydoc module6.yellowing.detect_yellowing
# Membaca dokumentasi submodul M6.5 (Browning / Necrosis)
python -m pydoc module6.browning.detect_browning
# Membaca dokumentasi submodul M6.2 (Spectral Characteristics)
python -m pydoc module6.spectral.analyze_color_characteristics
# Membaca dokumentasi Adapter Mock M4
python -m pydoc module6.adapter.mock_detect_vegetationDeveloper dapat membuka server dokumentasi lokal interaktif di browser web:
python -m pydoc -bPerintah ini akan secara otomatis membuka antarmuka web interaktif yang menampilkan hierarki dokumentasi seluruh modul.
Untuk menghasilkan berkas HTML statis yang dapat dibagikan kepada tim pengembang:
python -m pydoc -w module6Perintah ini akan membuat berkas module6.html yang dapat dibuka di peramban web apa pun tanpa memerlukan server aktif.
Anggota tim pengembang dapat mengimpor fungsi secara langsung sesuai kebutuhan:
import numpy as np
from module6.greenness import calculate_green_intensity
from module6.condition import classify_vegetation_condition
from module6.yellowing import detect_yellowing
from module6.browning import detect_browning
# Contoh pemanggilan fungsional murni
vari_grid = calculate_green_intensity(rgb_image, vegetation_mask, method="VARI")
classified_grid, stats = classify_vegetation_condition(vari_grid, vegetation_mask)
yellow_mask, yellow_pct = detect_yellowing(rgb_image, vegetation_mask)
brown_mask, brown_pct = detect_browning(rgb_image, vegetation_mask)Pastikan lingkungan kerja telah terpasang Python 3.9+ (telah diverifikasi pada Python 3.13.0).
Paket pustaka yang diperlukan:
-
numpy($\ge 1.22.0$ ) — Operasi array numerik vektor murni. -
opencv-python($\ge 4.5.0$ ) — Pembacaan format citra masukan. -
matplotlib($\ge 3.5.0$ ) — Pembangkitan visualisasi multi-panel beresolusi tinggi.
Instalasi dependensi via pip:
pip install numpy opencv-python matplotlibSkrip run_experiment_module6.py dilengkapi dengan fitur Dynamic Image Asset Discovery, yang secara otomatis memindai seluruh citra (.jpg, .jpeg, .png, .webp) dalam direktori kerja saat ini dan sub-direktorinya secara rekursif tanpa perlu melakukan hardcoding nama file.
Jalankan perintah berikut pada terminal:
python run_experiment_module6.pyPada sistem berbasis Unix / Linux / macOS:
python3 run_experiment_module6.pySetelah proses selesai, modul menghasilkan:
Tersimpan di ./experiment_results/<nama_citra>_module6_analysis.png dengan 6 panel:
- Original Aerial RGB Imagery: Citra asli tampak atas dari drone.
- Mock M4 Vegetation Canopy Mask: Overlay kanopi aktif (hijau zamrud) terhadap latar belakang desaturasi.
- M6.1 VARI Greenness Intensity Map: Peta panas nilai indeks VARI dengan colormap RdYlGn.
- M6.3 Canopy Condition Classification Map: Peta diskrit 3 kelas (Hijau = Vigorous, Kuning = Moderate Stress, Merah = Severe Stress, Abu-abu = Non-vegetation).
- M6.4 Foliar Chlorosis / Yellowing Mask: Deteksi daun menguning/klorosis (highlight kuning terang).
- M6.5 Necrosis / Browning Mask: Deteksi daun terbakar/kering/mati (highlight cokelat bata).
Tersimpan di ./experiment_results/module6_experiment_summary.csv dengan kolom:
| Kolom CSV | Definisi |
|---|---|
image_name |
Nama berkas citra drone |
total_pixels |
Total resolusi piksel citra ( |
vegetation_pixels |
Jumlah piksel kanopi vegetasi aktif terdeteksi |
vegetation_coverage_pct |
Persentase tutupan kanopi terhadap total area citra |
mean_vari |
Rata-rata nilai VARI pada kanopi aktif |
mean_hue_deg |
Rata-rata derajat sudut Hue HSL pada kanopi ( |
vigorous_pct |
Persentase kanopi dalam kondisi prima ( |
moderate_stress_pct |
Persentase kanopi dalam stres moderat ( |
severe_stress_pct |
Persentase kanopi dalam stres berat ( |
yellowing_pct |
Persentase kanopi yang mengalami klorosis/menguning |
browning_pct |
Persentase kanopi yang mengalami nekrosis/daun kering |
Hasil eksekusi pada 5 dataset sampel citra udara drone:
| Asset Name | Total Pixels | Canopy Pixels | Coverage | Mean VARI | Mean Hue | Vigorous | Mod. Stress | Sev. Stress | Yellowing | Browning |
|---|---|---|---|---|---|---|---|---|---|---|
| IMG_SAMPLE_1.jpeg | 1,920,000 | 289,420 | 15.07% | 0.1231 | 90.79° | 6.21% | 69.18% | 24.61% | 2.21% | 3.95% |
| IMG_SAMPLE_2.jpeg | 1,228,800 | 357,580 | 29.10% | 0.0671 | 76.40° | 0.92% | 53.40% | 45.68% | 27.21% | 23.18% |
| IMG_SAMPLE_3.jpeg | 1,228,800 | 153,623 | 12.50% | 0.0839 | 76.75° | 1.42% | 65.56% | 33.02% | 33.68% | 32.21% |
| IMG_SAMPLE_4.jpeg | 1,228,800 | 117,802 | 9.59% | 0.0755 | 80.30° | 0.70% | 62.85% | 36.45% | 18.54% | 21.29% |
| IMG_SAMPLE_5.jpeg | 1,228,800 | 276,008 | 22.46% | 0.0980 | 91.70° | 3.50% | 68.86% | 27.64% | 2.96% | 5.76% |
-
Sampel 1 & 5: Menunjukkan kondisi kanopi yang sehat dengan sudut Hue dominan hijau (
$>90^\circ$ ) dan tingkat degradasi sangat rendah (klorosis$\le 3%$ , nekrosis$\le 5.8%$ ). -
Sampel 2 & 3: Menunjukkan kanopi yang mengalami stres berat hingga penuaan/klorosis akut (klorosis mencapai
$27.2%\text{--}33.7%$ , nekrosis$23.2%\text{--}32.2%$ , dan sudut Hue bergeser ke$76.4^\circ\text{--}76.8^\circ$ ).
-
Coswosk, G. G., et al. (2024).
Utilizing Visible Band Vegetation Indices from Unmanned Aerial Vehicle Images for Maize Phenotyping.
Remote Sensing, 16(16), 3015.
DOI: 10.3390/rs16163015 | Tautan: MDPI Open Access -
Peticilă, A., Iliescu, P. G., Dinca, L., Popa, A.-Ș., & Murariu, G. (2025).
Vegetation Indices from UAV Imagery: Emerging Tools for Precision Agriculture and Forest Management.
AgriEngineering, 7(12), 431.
DOI: 10.3390/agriengineering7120431 | Tautan: MDPI Open Access -
Matyukira, C., Mhangara, P., Gidey, E., & Hussein, J. (2025).
Assessing environmental drivers of vegetation health using enhanced vegetation index and principal component analysis: a case study of the Cradle Nature Reserve, Gauteng province, South Africa.
Geocarto International, 40(1), 2509873.
DOI: 10.1080/10106049.2025.2509873 | Tautan: Taylor & Francis