VS+GDAL+openCV的遥感图像K均值算法的实现和植被指数的计算Word格式文档下载.docx
- 文档编号:15754935
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:13
- 大小:4.57MB
VS+GDAL+openCV的遥感图像K均值算法的实现和植被指数的计算Word格式文档下载.docx
《VS+GDAL+openCV的遥感图像K均值算法的实现和植被指数的计算Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《VS+GDAL+openCV的遥感图像K均值算法的实现和植被指数的计算Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
该算法的主要过程为:
(1)任选K个聚类中心:
,程序中可以以默认的前K个样本作为初始聚类中心。
聚类中心的选择是任意的。
如果迭代收敛,则与初始聚类中心的选择无关。
(2)逐个将样本集{x}的每一个样本按照最小距离原则分配给K个聚类中心,形成K类。
在第m次迭代中,若:
则
,这里
表示第m次迭代时,以第j个聚类中心为代表的聚类域。
(3)由步骤
(2)重新计算积累中心,即:
表示第i个聚类域中的样本个数。
其均值向量作为新的聚类中心。
(4)如果在第m+1次迭代和第m次迭代过程中,两次的K个迭代中心均相等,则计算完毕,输出迭代结果,否则返回步骤
(2)。
1.3植被指数
植被指数是指利用卫星不同波段探测数据组合而成的,能反映植物生长状况的指数。
已用植被指数评估植被情况的基本原理是植物叶面在可见光红光波段有很强的吸收特性,在近红外波段有很强的反射特性,可以利用在这些波段附近的多光谱影像的波段间的四则运算来消除一些辐射影响,同时增强有用信息。
常用的植被指数有归一化差分植被指数(NDNI),比值植被指数(RVI),土壤调节植被指数(SAVI),差值环境植被指数(DVI),垂直植被指数(PVI)等。
各种植被指数的计算方法为:
(1)NDVI=(NIR-R)/(NIR+R)。
用于检测植被生长状态、植被覆盖度和消除部分辐射误差,可使植被从水和土中分离出来。
NIR是近红外波段,R为红外波段。
NDVI的值在[-1,1]之间,负值表示地面覆盖为云、水、雪等,对可见光高反射;
0表示有岩石或裸土等,NIR和R近似相等;
正值,表示有植被覆盖,且随覆盖度增大而增大。
在进行计算时,可以利用这一特性,将不同NDVI值的结果赋以不同灰度值,可以直观的得出植被覆盖情况分布图。
(2)RVI=NIR/R。
该植被指数能够充分表现植被在红光和近红外波段反射率的差异,能增强植被与土壤背景之间的差异,但其对大气状况很敏感,而且当植被覆盖率低于50%时,它的分辨能力显著下降。
(3)SAVI=((NIR-R)/(NIR+R+L))(1+L)。
其中,L是随着植被密度变化的参数,取值范围从0-1,当植被覆盖度很高时为0,很低时为1。
很明显,如果L=0,SAVI=NDVI。
有研究表明,L取0.5时SAVI消除土壤反射率的效果较好。
故在本次实习中计算SAVI时取L=0.5。
(4)DVI=NIR-R。
该植被指数对土壤背景的变化极为敏感,有利于植被生态环境的监测,故又被称为环境植被指数(EVI)。
(5)PVI=((SR-VR)^2+(SNIR-VNIR)^2)^(1/2)。
S是土壤反射率,V是植被反射率。
PVI较好地消除了土壤背景的影响,对大气的敏感度小于其他VI。
2实现方法与过程
首先构建单文档框架,使用一个悬浮窗口(非模态对话框)以方便直接对图像进行算法前后的操作:
2.1各种格式图像的读取及显示
实习采用的遥感图像格式包括ErdasImagineImages(*.img)格式和*.bmp格式等,使用GDAL工具声明数据集对象指针读取数据:
GDALDataset*poDataset;
//数据集对象指针
GDALAllRegister();
//驱动注册
CPLSetConfigOption("
GDAL_FILENAME_IS_UTF8"
"
NO"
);
//支持中文路径
poDataset=(GDALDataset*)GDALOpen((constchar*)FileName,GA_ReadOnly);
for(inti=0;
i<
m_bandCount;
i++)//获取每个波段数据
{
BYTE*pSrcData=newBYTE[m_width*m_height*m_depth/8];
pRasterBand[i]=poDataset->
GetRasterBand(i+1);
pRasterBand[i]->
RasterIO(GF_Read,0,0,m_width,m_height,
pSrcData,m_width,m_height,iDataType,0,0);
…
}
可以获取图像的长宽、波段数(通道数)、图像格式、数据类型、图像位数深度、每个波段(通道)的数据域,以及对有地理信息的图像可以获取图像投影信息(*.img格式)、图像分辨率、图像左上角的坐标等。
获取到图像所有的基本信息之后,将多波段或单波段图像的每一个波段分别存储在使用openCV申明的IplImage*类型的矩阵之中,选择一个波段或三个波段进行显示,并使用CvvImage类绘制在视图中:
ASSERT_VALID(pDoc);
if(!
pDoc)return;
CvvImage&
img=pDoc->
m_img;
CRectrc;
GetClientRect(&
rc);
img.DrawToHDC(pDC->
GetSafeHdc(),&
即所有格式的图像均由GDAL读出,保存在IplImage*矩阵中并显示出来。
后续对各个波段进行聚类分析以及植被指数的计算中,可以方便直接的对存储在矩阵中的各波段数据进行操作。
针对不同数据类型的图像,对每一个波段,采用最大最小值拉伸的方法将其像素值线型化到[0,255]上:
doublemm[2]={0.0};
//最大最小值
cvMinMaxLoc(image_in[i],&
mm[0],&
mm[1]);
//求得最小最大值
cvConvertScale(image_in[i],image_out[i],255.0f/(mm[1]-mm[0]),(255.0f-mm[0])/(mm[1]-mm[0]));
//拉伸到[0,255]
2.2K均值算法的实现
K均值算法支持对多波段、不同类型数据进行聚类分析。
首先由读取过程中将像素值进行最大最小值拉伸到[0,255]上,再创建样本矩阵,将所有波段的影像作为样本存储在该样本矩阵中,每一个波段为一列,行数为影像的长宽之积。
同时定义整型样本标识矩阵,矩阵大小为样本矩阵的一列。
构造如下函数:
:
imgKMeans(CvMat*sample,IplImage*pResult,intnClusters)
Sample为样本矩阵,pResult,clusters为输出的聚类结果,nClusters为聚类数。
采用openCV工具的cvKmeans2()函数可以实现K均值聚类:
cvKMeans2(sample,nClusters,clusters,cvTermCriteria(CV_TERMCRIT_ITER,20,1.0));
cvTermCriteria(CV_TERMCRIT_ITER,20,1.0)为迭代终止规则,表示迭代次数与迭代精度的控制。
分类类数可以控制在[2,20]之间,分类太少没有意义,分类数太多往往将同类地物分开,效果不好。
不同分类数的K均值聚类结果如图4。
2.3植被指数的计算
本次实习中实现了四中植被指数的计算过程,包括归一化差分植被指数(NDNI),比值植被指数(RVI),土壤调节植被指数(SAVI)和差值环境植被指数(DVI)。
各植被指数的计算公式如上文所述。
在进行计算前,已经将各个波段的数据一次存在一个指针数组之中,计算哪几个波段就将哪几个波段的数据读出即可。
2.3.1计算NDVI指数
依次进行矩阵元素级减法,加法和除法运算:
cvSub(image[3],image[2],res1);
//减法
cvAdd(image[3],image[2],res2);
//加法
cvDiv(res1,res2,res);
//除法
image[3]表示图像的近红外波段,image[2]表示图像的红光波段。
得出的res值的大小即为NDVI指数。
为了直观的显示NDVI指数的效果,结合NDVI不同值所表示的植被覆盖情况:
A.-1<
=NDVI<
0表示地面覆盖为云、水、雪等,对可见光高反射;
B.NDVI=0表示有岩石或裸土等,NIR和R近似相等;
C.0<
NDVI<
=1表示有植被覆盖,且随覆盖度增大而增大。
则可以对大于0值的NDVI对应的区域按照NDVI值的大小在绿色通道上赋不同大小的像素值,得到NDVI图像特征:
所有绿色区域为植被覆盖区域,灰色区域没有植被覆盖;
绿色越亮的区域植被覆盖越茂密,绿色越暗的区域植被覆盖度越低。
分类结果见图5。
2.3.2计算RVI
RVI的计算方法为图像的近红外波段与红光波段的比值。
RVI值的范围仍然在原图的像素范围之内。
计算比较简单:
cvDiv(image[3],image[2],res);
由于植被的RVI通常大于2,即RVI>
=2为植被覆盖区域,设为绿色,同NDVI,绿色越亮的区域植被覆盖越茂密,绿色越暗的区域植被覆盖度越低;
其他区域为灰度。
2.3.3计算SAVI
SAVI=((NIR-R)/(NIR+R+L))(1+L)。
L是随着植被密度变化的参数,取值范围从0到1,当植被覆盖度很高时L值为0,很低时L值为1。
很明显L=0时,SAVI=NDVI。
但对某幅图像进行植被指数计算时并不知道其植被覆盖度如何,故采用L=0.5:
//相减
//相加
CvScalarnplus;
nplus.val[0]=0.5f;
cvAddS(res2,nplus,res2);
//加0.5
doubles=cvGetReal2D(res,i,j);
s=s*1.5f;
//每个像素值乘以1.5
其计算过程类似于NDVI,故显示方法同NDVI指数。
2.3.4计算DVI
DVI=NIR-R。
即近红外波段减去红光波段的值:
cvSub(image[3],image[2],res);
相减之后得出的值就是DVI指数,为了直观显示和可视化分析,也将DVI指数拉伸到[0,255]并显示出来:
CvScalarps;
doubles=cvGetReal2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VS GDAL openCV 遥感 图像 均值 算法 实现 植被 指数 计算
链接地址:https://www.bdocx.com/doc/15754935.html