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