You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于OpenCV的卫星图像植被检测与面积估算方法咨询

基于OpenCV实现植被区域密度区分与面积估算的方案

你可以结合以下OpenCV函数实现按像素密度区分植被区域的需求:

  • 首先用cv2.morphologyEx做形态学预处理:你当前生成的掩膜大概率存在零散的白色噪点、植被区域内部的黑色空洞,可以先通过开运算(先腐蚀再膨胀)清除孤立的小噪点,再通过闭运算(先膨胀再腐蚀)填补连片植被区域内的空隙,避免后续密度计算受干扰。
  • 用cv2.blur(均值滤波)计算局部像素密度:你可以自定义窗口大小(比如15*15,可根据实际效果调整)对二值掩膜做均值滤波,输出的每个像素值就对应当前窗口范围内白色植被像素的占比,也就是你需要的局部密度值。之后再设定一个合理的密度阈值做二值化,就能把密度达标的连片区域判定为植被区域,得到你预期的分割效果。
  • 面积计算可以用cv2.countNonZero:统计最终生成的植被掩膜中非零像素的总数量,再乘以单像素对应的实际地面面积(需要根据你所用卫星图像的比例尺换算),就能得到植被的总占地面积。
  • 如果需要单独拆分统计每块连片植被的面积,可以用cv2.connectedComponentsWithStats做连通域分析,直接输出每个连通植被区域的像素数、外接边框等信息,不需要手动统计。

参考实现代码如下,可在你现有代码基础上修改:

import numpy as np
import cv2

# 你原有读取图片、生成mask的代码保留
img = cv2.imread('staticmap.png')
upperbound = np.array([70, 255,255])
lowerbound = np.array([40, 40,40])
mask = cv2.inRange(img, lowerbound, upperbound)

# 第一步:形态学预处理,核大小可根据效果调整
kernel = np.ones((5,5), np.uint8)
# 开运算清除小噪点
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
# 闭运算填补植被区域内部空洞
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)

# 第二步:计算局部像素密度,窗口越大判断连片性越强,可自行调整
window_size = 15
density = cv2.blur(mask, (window_size, window_size)) / 255

# 第三步:设定密度阈值,阈值可根据实际效果调整,此处示例为30%密度判定为植被
density_threshold = 0.3
final_vegetation_mask = np.where(density > density_threshold, 255, 0).astype(np.uint8)

# 面积计算,单像素对应实际面积需根据卫星图比例尺替换
pixel_to_area = 0.2
total_vegetation_pixels = cv2.countNonZero(final_vegetation_mask)
total_area = total_vegetation_pixels * pixel_to_area
print(f"估算植被总面积:{total_area} 平方米")

# 结果可视化
cv2.imshow("原始卫星图", img)
cv2.imshow("密度筛选后植被区域", final_vegetation_mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

内容的提问来源于stack exchange,提问作者chambeeee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 21:18:03