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

Posted

技术标签:

【中文标题】在卫星图像上使用 opencv 检测植被【英文标题】:Detect vegetation using opencv on satellite images 【发布时间】:2021-10-30 04:09:33 【问题描述】:

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

为此,我通过 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 函数可以做到这一点?

【问题讨论】:

【参考方案1】:

您可以考虑使用高斯模糊,然后像这样使用 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)

【讨论】:

非常感谢!这正是我想要的

以上是关于在卫星图像上使用 opencv 检测植被的主要内容,如果未能解决你的问题,请参考以下文章

有没有人在 OpenCV 中使用 MSER 来检测区域?

OpenCV与EmguCV中的图像轮廓提取

检测图像中的一团颜色

基于Sentinel-2(哨兵2)遥感卫星的植被覆盖度提取

利用时间序列高分辨率卫星影像监测葡萄茎水势

从 Python 访问 OpenCV CUDA 函数(无 PyCUDA)