在图像处理上,常常使用各种指数,例如:
归一化差分植被指数
归一化差分水体指数
如何通过MATLAB实现通过各类指数提取对应地物,是遥感图像处理中常见的问题。使用各类指数时,一般先对整幅图像求归一化差分指数,之后通过设定阈值来对目标与非目标进行区分。如果在已经知道经验阈值的前提下,可以直接使用循环嵌套来提取目标。
这里举例说明,以建筑物提取为例。在大面积遥感影像中,使用NDBI区分裸土与建筑略显困难,计算NDBI后效果如下图所示
与原图像进行对比:
很显然,提取不完美。这里使用NDISI进行计算,NDISI由徐涵秋等人在2016年提出,用以提取不透水面,其计算公式为:
其中,VIR为可见光波段,有时使用MNDWI代替之,如此即可计算图像的NDISI
clear
clc
Image = imread("文件路径");
Height = size(Image, 1);
Width = size(Image, 2);
MDNWI = zeros(Height, Width);
NDISI = zeros(Height, Width);
for i = 1:Height
for j = 1:Width
MNDWI(i, j) = (Image(i, j, 2) - Image(i, j, 5))/(Image(i, j, 2) + Image(i, j, 5));
Temp = (Image(i, j, 4) + Image(i, j, 5) + MNDWI(i, j))/3;
NDISI(i, j) = (Image(i, j, 6) - Temp)/(Image(i, j, 6) + Temp);
end
end
对于以上图片,区分不透水面的经验阈值为-0.32~-0.30。如此,利用循环嵌套即可得到提取出不透水面的二值图像,代码如下:
clear
clc
NDISI = imread("文件路径");
[Width,Height] = size(NDISI);
S = zeros(Width,Height);
for i=1:Width
for j=1:Height
if (NDISI(i,j)>-0.32)
S(i,j) = 1;
end
end
end
imshow(S)
对于变化检测,则需要多时相遥感数据。例如,使用某地2010、2015、2020三年的水体指数来做直方图统计,提取出水体的同时,同样使用循环嵌套实现直方图统计(注意,此处NDWI的经验阈值为0):
clear
clc
NDWI2010 = imread("文件路径");
NDWI2015 = imread("文件路径");
NDWI2020 = imread("文件路径");
[Height, Width] = size(NDWI2010);
Count2010 = 0;
Count2015 = 0;
Count2020 = 0;
for i=1:Height
for j=1:Width
if NDWI2010(i,j)>=0
Count2010=Count2010+1;
end
end
end
for i=1:Height
for j=1:Width
if NDWI2015(i,j)>=0
Count2015=Count2015+1;
end
end
end
for i=1:Height
for j=1:Width
if NDWI2020(i,j)>=0
Count2020=Count2020+1;
end
end
end
W = [Count2010, Count2015, Count2020];
Year = [2010, 2015, 2020];
bar(Year, W);
提取出的地物二值图像不仅仅可以用于变化检测,还可以辅助进行样本的选择。因为人眼无法观察红外波段,所以借助各类归一化差分指数将红外波段的差异可视化,才能更有效的辅助判读,以更好的进行难以直接通过人眼区别的地物的判读与归类。