编程实现基于 NDVI 的植被变化检测

说明

编程实现植被变化检测的四个关键环节:

影像的显示(432 波段组合, 16bit 变为 8bit)

影像的相对配准

NDVI 计算及专题图生成

植被变化区域 显示及变化面积统计


关键

1:envi格式影像读取显示,灰度拉伸以增强显示效果,网上查找到的enviread函数读取,稍加修改,依据辅助文件来读取影像信息。

2.相对配准同名点获取:

自动提取:sift或者orb等特征提取,优质影像对可以提取提取很多同名点,质量不好提取很少。

IMG1=im2double(img1_8bit);
IMG2=im2double(img2_8bit);
A1=detectSIFTFeatures(img1_8bit(:,:,4));
A2=detectSIFTFeatures(img2_8bit(:,:,4));
[B1,A1]=extractFeatures(img1_8bit(:,:,4),A1);
[B2,A2]=extractFeatures(img2_8bit(:,:,4),A2);
boxPairs = matchFeatures(B1, B2);
movingPoints=A1(boxPairs(:,1),:);
fixedPoints=A2(boxPairs(:,2),:);

手动提取,人工刺点cpselect函数

代码

clear all;
clc;
%% 数据读取
[img1,info1]=enviread('Q1','Q1.HDR');
[img2,info2]=enviread('SV1_5','SV1_5.HDR');
%% 图像显示
%16位图像转8位图
%quickbird
img1_guiyi=mat2gray(img1);
img1_8bit=im2uint8(img1_guiyi);
%SV1
img2_guiyi=mat2gray(img2);
img2_8bit=im2uint8(img2_guiyi);
%直方图均衡化,便于展示
img1_junhenghua=histeq(img1_guiyi);
img1_show=im2uint8(img1_junhenghua);
img2_junhenghua=histeq(img2_guiyi);
img2_show=im2uint8(img2_junhenghua);
%quickbird
figure(1)
imgmul1=cat(3,img1_show(:,:,4),img1_show(:,:,3),img1_show(:,:,2));%合成3维矩阵
imshow(imgmul1);
title('Quickbird后三个波段组合图像');
%SV1
figure(2)
imgmul2=cat(3,img2_show(:,:,4),img2_show(:,:,3),img2_show(:,:,2));%合成3维矩阵
imshow(imgmul2);
title('SV1后三个波段组合图像');
%% 相对配准
% 选择匹配点对
[fixedPoints, movingPoints] = cpselect(img1_8bit(:,:,4), img2_8bit(:,:,4), 'Wait', true);
% 使用fitgeotrans函数得到二次多项式变换矩阵Tpoly
Tpoly = fitgeotrans(movingPoints, fixedPoints, 'polynomial', 2);
% 利用变换矩阵Tpoly进行图像配准
movingRegisteredPoly = imwarp(img2_8bit, Tpoly, 'OutputView', imref2d(size(img1_8bit(:,:,1))));
% 显示结果
%直方图均衡化,便于展示
movingRegisteredPoly_guiyi=mat2gray(movingRegisteredPoly);
movingRegisteredPoly_junhenghua=histeq(movingRegisteredPoly_guiyi);
movingRegisteredPoly_show=im2uint8(movingRegisteredPoly_junhenghua);
figure(3)
imshowpair(img1_show(:,:,4:-1:2), movingRegisteredPoly_show(:,:,4:-1:2))
title('二次多项式纠正叠加图')
figure(4)
imshow(movingRegisteredPoly_show(:,:,4:-1:2))
title('二次多项式纠正结果图')
%精度评定
%内精度
f1=transformPointsInverse(Tpoly,fixedPoints);
Vx=f1(:,1)-movingPoints(:,1);
Vy=f1(:,2)-movingPoints(:,2);
dx1=sqrt(sum(Vx.^2)/(7-6));
dy1=sqrt(sum(Vy.^2)/(7-6));
%外精度
% 刺新的点做精度评定
[fixedPoints_jc, movingPoints_jc] = cpselect(img1_8bit(:,:,4), img2_8bit(:,:,4), 'Wait', true);
f2=transformPointsInverse(Tpoly,fixedPoints_jc);
dx=movingPoints_jc(:,1)-f2(:,1);
dy=movingPoints_jc(:,2)-f2(:,2);
%% NDVI 专题图
img1_double=im2double(img1_8bit);
img2_double=im2double(movingRegisteredPoly);
for i=1:size(img1_8bit(:,:,1),1)
    for j=1:size(img1_8bit(:,:,1),2)
        NDVI1(i,j)=(img1_double(i,j,4)-img1_double(i,j,3))/(img1_double(i,j,4)+img1_double(i,j,3));
        NDVI2(i,j)=(img2_double(i,j,4)-img2_double(i,j,3))/(img2_double(i,j,4)+img2_double(i,j,3));
        %quickbird
        if NDVI1(i,j)<=0.1%非植被覆盖区,黑色表示
            I1(i,j,1)=0;I1(i,j,2)=0;I1(i,j,3)=0;
        end
        if NDVI1(i,j)>0.1&&NDVI1(i,j)<=0.25%低植被覆盖区,红色
            I1(i,j,1)=255;I1(i,j,2)=0;I1(i,j,3)=0;
        end
        if NDVI1(i,j)>0.25&&NDVI1(i,j)<=0.4%中植被覆盖区,蓝色
            I1(i,j,1)=0;I1(i,j,2)=0;I1(i,j,3)=255;
        end
        if NDVI1(i,j)>0.4%高植被覆盖区,绿色
            I1(i,j,1)=0;I1(i,j,2)=255;I1(i,j,3)=0;
        end
        %SV1
        if NDVI2(i,j)<=0.1%非植被覆盖区,黑色表示
            I2(i,j,1)=0;I2(i,j,2)=0;I2(i,j,3)=0;
        end
        if NDVI2(i,j)>0.1&&NDVI2(i,j)<=0.25%低植被覆盖区,红色
            I2(i,j,1)=255;I2(i,j,2)=0;I2(i,j,3)=0;
        end
        if NDVI2(i,j)>0.25&&NDVI2(i,j)<=0.4%中植被覆盖区,蓝色
            I2(i,j,1)=0;I2(i,j,2)=0;I2(i,j,3)=255;
        end
        if NDVI2(i,j)>0.4%高植被覆盖区,绿色
            I2(i,j,1)=0;I2(i,j,2)=255;I2(i,j,3)=0;
        end
    end
end
%显示
figure(5)
imshow(I1)
title('quickbird的NDVI图')
figure(6)
imshow(I2)
title('SV1的NDVI图')
%% 植被变化结果图
sum_up=0;
sum_down=0;
sum_un=0;
sum_no=0;
for i=1:size(img1_8bit(:,:,1),1)
    for j=1:size(img1_8bit(:,:,1),2)
        if NDVI1(i,j)>0.1||NDVI2(i,j)>0.1
              NDVI_change(i,j)=NDVI2(i,j)-NDVI1(i,j);
              if NDVI_change(i,j)<-0.1%减少,红
                  I_change(i,j,1)=1;I_change(i,j,2)=0;I_change(i,j,3)=0;
                  sum_down=sum_down+1;
              end
              if NDVI_change(i,j)<=0.1&&NDVI_change(i,j)>=-0.1%不变,深绿
                  I_change(i,j,1)=0;I_change(i,j,2)=0.5;I_change(i,j,3)=0;
                  sum_un=sum_un+1;
              end
              if NDVI_change(i,j)>0.1%增加,浅绿
                  I_change(i,j,1)=0.2;I_change(i,j,2)=0.8;I_change(i,j,3)=0.2;
                  sum_up=sum_up+1;
              end
        else %非植被区,灰色
            I_change(i,j,1)=0.37;I_change(i,j,2)=0.37;I_change(i,j,3)=0.37;
            sum_no=sum_no+1;
        end
    end
end
%面积
area_up=0.25*sum_up;
area_down=0.25*sum_down;
area_un=0.25*sum_un;
area_no=0.25*sum_no;
% 画图
figure(7)
Img_change=im2uint8(I_change);
imshow(Img_change)
title('变化图')

NDVI(Normalized Difference Vegetation Index)是一种用于评估植被覆盖度和生长状况的指数。基于NDVI植被变化检测可以通过比较两个时间点的NDVI图像来检测植被的变化。以下是一个简单的基于NDVI植被变化检测的流程: 1. 读取两个时间点的红光和近红外波段的图像。 2. 计算每个时间点的NDVI图像。NDVI计算公式为:(NIR - RED) / (NIR + RED)。 3. 将两个时间点的NDVI图像相减,得到NDVI变化图像。 4. 对NDVI变化图像进行阈值分割,得到植被变化区域。 以下是一个基于Python和OpenCV的示例代码: ```python import cv2 import numpy as np # 读取红光和近红外波段的图像 red1 = cv2.imread('path/to/red1.tif', cv2.IMREAD_GRAYSCALE).astype(np.float32) nir1 = cv2.imread('path/to/nir1.tif', cv2.IMREAD_GRAYSCALE).astype(np.float32) red2 = cv2.imread('path/to/red2.tif', cv2.IMREAD_GRAYSCALE).astype(np.float32) nir2 = cv2.imread('path/to/nir2.tif', cv2.IMREAD_GRAYSCALE).astype(np.float32) # 计算NDVI图像 ndvi1 = (nir1 - red1) / (nir1 + red1) ndvi2 = (nir2 - red2) / (nir2 + red2) # 计算NDVI变化图像 ndvi_diff = ndvi2 - ndvi1 # 对NDVI变化图像进行阈值分割 thresh = cv2.threshold(ndvi_diff, 0.1, 1, cv2.THRESH_BINARY)[1] # 显示植被变化区域 cv2.imshow('Vegetation Change', thresh) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个例子中,我们使用`cv2.imread`函数读取红光和近红外波段的图像,并使用`astype`函数将像素值转换为浮点数。然后,我们计算每个时间点的NDVI图像,并将它们相减得到NDVI变化图像。最后,我们使用`cv2.threshold`函数对NDVI变化图像进行阈值分割,并使用`cv2.imshow`函数显示植被变化区域。请注意,这个例子仅适用于灰度图像。如果您要读取彩色图像,请使用`cv2.imread`函数读取图像,并使用`cv2.cvtColor`函数将其转换为灰度图像。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

crazy小疯子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值