在卫星图像上使用 opencv 检测植被

Detect vegetation using opencv on satellite images

我正在尝试根据颜色估计卫星照片上的植被面积(以平方米为单位)。我没有训练数据集,因此无法进行机器学习。所以我知道结果不会很好,但我还是努力了。

为此,由于 cv2.inRange,我在颜色上应用了滤镜。

import numpy as np
import cv2

img = cv2.imread('staticmap.png')
upperbound = np.array([70, 255,255])
lowerbound = np.array([40, 40,40])
mask = cv2.inRange(img, lowerbound, upperbound)
imask = mask>0
white = np.full_like(img, [255,255,255], np.uint8)

result = np.zeros_like(img, np.uint8)
result[imask] = white[imask]

cv2.imshow(winname = 'satellite image', mat = img)
cv2.imshow('vegetation detection', result)

cv2.waitKey(0) 
cv2.destroyAllWindows() 

这给出了以下结果

看来检测还不错。 现在,我想根据白色像素的密度,检测有植被的区域和没有植被的区域。我想象这样的输出:

是否有任何开放的 cv 函数可以做到这一点?

您可以考虑使用高斯模糊,然后像这样进行 Otsu 阈值处理:

import cv2

# Load image as greyscale
im = cv2.imread('veg.jpg', cv2.IMREAD_GRAYSCALE)

# Apply blur
blur = cv2.GaussianBlur(im,(19,19),0)

# Otsu threshold
_,thr = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)