背景:
我试图通过计算随后成对的图像的立体视差来检测一系列航拍图像上的树木。这就是差距的样子。白点是树木:
接下来,我在视差图上定位轮廓并获得以下图像:
从这里我想检测树木。


我现在正在做的事情:
首先,我正在做侵蚀:
kernel = np.ones(shape=(5, 5),
dtype=np.uint8)
image= cv2.erode(image,
kernel=kernel,
iterations=14)
为了分离那些重叠的轮廓,我这次做膨胀:
image= cv2.dilate(image,
kernel=kernel,
iterations=12)
image= cv2.erode(image,
kernel=kernel,
iterations=7)

行!更好的!但是..所有这些过程似乎都是一个肮脏的解决方法..此外,这不适用于其他一些图像(忽略左侧的噪音,我应该添加裁剪):

问题:
- 我如何确保不重叠树木的轮廓并且在扩张/侵蚀时不移除它们?
- 有没有比我现在正在做的更好的选择?
编辑:
可能对于全图我应该补充一点,在获得具有单独轮廓的良好图像后,我使用:
disparity, contours, hierarchy = cv2.findContours(image,
mode=cv2.RETR_LIST,
method=cv2.CHAIN_APPROX_SIMPLE)
编辑 Nº2:
添加视差图的横截面。原始数据可从此处获得
阴谋:
结果更新:
我尝试了@A_A 建议的中值过滤器,并且很好地将树木与地面分开:
ground = medfilt(disparity, kernel_size=125)
trees = disparity - ground
boolean_mask = (trees > 2.) & (trees < 15.)
plt.imshow(boolean_mask, cmap='gray')
这个过滤器的问题是速度。
scipy.signal.medfilt我花了 20 多分钟来计算一切。但scipy也有一个scipy.ndimage.filters.median_filter。我不知道它们之间有什么区别,但我从中得到的结果几乎是相同的,除了靠近图像边界的一些区域,它需要 2 到 5 分钟。









