我想标记图像中存在的树木。我尝试了许多基于颜色的分割方法,如RGB Vector space& HSI颜色空间,L a b *颜色空间,分水岭分割,NDVI方法,但大多数树区域都缺失。
有人知道更多的颜色检测(或)分割程序吗?
我只需要在MATLAB中开发算法..
答案 0 :(得分:3)
从遥感数据(如卫星或航空影像)中提取树木的基本方法是计算归一化差异植被指数(NDVI),然后对NDVI进行阈值处理。
为了说明,请考虑以下4-band color infrared image(警告160MB下载)。 NDVI提供了一种在-1:1范围内表达活绿色植被强度的方法。通常,这些值被拉伸(如附图中所示)以填充图像比特深度的整个范围(例如0-255)。一旦计算出NDVI,您可以通过基本上说“仅保留像素值> X”来阈值图像。输出是二进制图像,您可以使用它来分析每单位面积的冠层覆盖等指标。
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)