Данные, которые анализирует ИИ-модуль
Параметр
ExG (Excess Green)
NDVI / GNDVI
Контуры рядков
Сегментация культур
Аномалии пикселей
Что означает
Уровень зелёности растений
Индексы вегетации и биомассы
Геометрическая структура посевов
Разделение почвы и растительности
Локальные отклонения в распределении зелёности
Как используется
Диагностика засухи и стресса
Точная оценка здоровья культур
Поиск разрывов и слабых зон в рядках
Корректный расчёт площади культур и масок анализа
Выявление болезней, вредителей и очаговых повреждений
Как работает система
Здесь мы базово описываем ключевые модули программного комплекса AgroScope — от обработки изображений до вычисления индексов растительности и построения карт риска.
Загрузка снимка и предварительная очистка
img = cv2.imread(image_path)
img = cv2.resize(img, (1920, 1080))
# подавление шума
blur = cv2.GaussianBlur(img, (5, 5), 0)
# перевод в HSV для последующей фильтрации по цвету
hsv = cv2.cvtColor(blur, cv2.COLOR_BGR2HSV)
# выделение диапазонов зелёных оттенков
lower = np.array([25, 40, 40])
upper = np.array([90, 255, 255])
mask_green = cv2.inRange(hsv, lower, upper)
Расчёт индекса зелёности и нормализация
B, G, R = cv2.split(img)
exg = 2 * G - R - B
# масштабирование значений в диапазон 0–255
exg_norm = cv2.normalize(exg, None, 0, 255, cv2.NORM_MINMAX)
exg_norm = exg_norm.astype("uint8")
# бинарная маска для областей со сниженной зелёностью
_, stress_mask = cv2.threshold(exg_norm, 70, 255, cv2.THRESH_BINARY_INV)
Построение карты засухи и тепловой визуализации
# тепловая карта для визуализации состояния поля
heatmap = cv2.applyColorMap(exg_norm, cv2.COLORMAP_JET)
# выделение контуров потенциальных проблемных зон
contours, _ = cv2.findContours(stress_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
area = cv2.contourArea(c)
if area > 500: # отбрасываем шум
cv2.drawContours(heatmap, [c], -1, (0, 0, 255), 2)
Выделение объектов и генерация итогового отчёта
results = []
for c in contours:
x, y, w, h = cv2.boundingRect(c)
severity = np.mean(exg_norm[y:y+h, x:x+w])
results.append({
"bbox": (x, y, w, h),
"severity": float(severity)
})
# экспорт отчёта
with open("report.json", "w") as f:
json.dump({"stress_zones": results}, f, indent=4)





