如何使用MATLAB从图像中检测树木?

时间:2013-12-10 04:33:36

标签: matlab design-patterns detection

enter image description here enter image description here

我想标记图像中存在的树木。我尝试了许多基于颜色的分割方法,如RGB Vector space& HSI颜色空间,L a b *颜色空间,分水岭分割,NDVI方法,但大多数树区域都缺失。

有人知道更多的颜色检测(或)分割程序吗?

我只需要在MATLAB中开发算法..

1 个答案:

答案 0 :(得分:3)

从遥感数据(如卫星或航空影像)中提取树木的基本方法是计算归一化差异植被指数(NDVI),然后对NDVI进行阈值处理。

为了说明,请考虑以下4-band color infrared image(警告160MB下载)。 NDVI提供了一种在-1:1范围内表达活绿色植被强度的方法。通常,这些值被拉伸(如附图中所示)以填充图像比特深度的整个范围(例如0-255)。一旦计算出NDVI,您可以通过基本上说“仅保留像素值> X”来阈值图像。输出是二进制图像,您可以使用它来分析每单位面积的冠层覆盖等指标。

enter image description here

file = 'D:\path\to\doi1m2011_41111h4nw_usda.tif';
[I R] = geotiffread(file);
outputdir = 'D:\output\'

%% Calculate NDVI
NIR = im2single(I(:,:,4));
red = im2single(I(:,:,1));

ndvi = (NIR - red) ./ (NIR + red);
double(ndvi);
imshow(ndvi,'DisplayRange',[-1 1]);

%% Stretch to 0-255
ndvi = floor((ndvi + 1) * 128); % [-1 1] -> [0 256]
ndvi(ndvi < 0) = 0;             
ndvi(ndvi > 255) = 255;         
ndvi = uint8(ndvi);             

%% Threshold the NDVI
threshold = 100  % You may need to experiment with this value
i = (ndvi > threshold);
imshow(i)

%% Write output to disk
tiffdata = geotiffinfo(file);
outfilename = [outputdir 'threshold_image' '.tif'];  
geotiffwrite(outfilename, i, R, 'GeoKeyDirectoryTag', tiffdata.GeoTIFFTags.GeoKeyDirectoryTag)