前言
发现这个好像和我之前写的程序重了,之前写考核的时候密度分割部分直接抄的课上的程序,这次看懂了,挺简单的 。
需求分析
这个代码有点太过简单了…不废话了,干活!
1.预定义颜色索引矩阵,读入近红和红数据,计算NDVI
dst = [[-1.0, 0.0, 255, 127, 36], $
[.0, 0.2, 255, 165, 79], $
[0.2, .4, 238, 216, 174], $
[ .4, .6, 193, 255, 193], $
[ .6, .7, 193, 255, 193], $
[ .7, .8, 0 , 139, 0]
b3file = 'C:\Users\黄\Desktop\te\red_subset.tif'
b4file = 'C:\Users\黄\Desktop\te\nir_subset.tif'
b3=READ_TIFF(b3file)
b4=READ_TIFF(b4file)
ndvi=(FLOAT(b4)-b3)/(FLOAT(b4)+b3)
首先定义一个矩阵,这个矩阵有5列,第一第二列是判断NDVI的范围,如果接下来我们要分割的NDVI矩阵的值介于这两个之间,那么我就将RGB中的R通道赋值为这个颜色索引矩阵的第3列,G通道赋值为颜色索引矩阵的第4列,B通道为颜色索引矩阵的第5列。因为RGB图像本身就是3个通道合成的图像,单个通道的话是灰度图像,所以我只要求3个分量然后合起来就行了。
注意点IDL创建矩阵的语法就行了,每一个行向量都需要括起来,$就是换行符的意思,表示没有完成整句话。
然后上面那段话就是计算NDVI的表达式,NDVI的表达式就不想写了,对应变量就好了,就是要注意用float类型加减否则会报除以0的错误。
2.求出索引矩阵的列,并做一些寻访赋值
sz = SIZE(dst)
nds = sz[2]
sz = SIZE(ndvi)
ncols = sz[1]
nrows = sz[2]
resultR = BYTARR(ncols, nrows)
resultG = BYTARR(ncols, nrows)
resultB = BYTARR(ncols, nrows)
FOR i=0, nds-1 DO BEGIN
w = WHERE(ndvi GE dst[0,i] AND ndvi LT dst[1, i], count)
IF count GT 0 THEN BEGIN
resultR[w] = dst[2, i]
resultG[w] = dst[3, i]
resultB[w] = dst[4, i]
ENDIF
ENDFOR
img = bytarr(3, ncols, nrows)
img[0, *, *] = resultR
img[1, *, *] = resultG
img[2, *, *] = resultB
ig = image(img,order=1)
首先size函数会返回dst的5个值,我们只要第3个值,即它有多少行,这个dst有6行就是我们要分割的区间。
后面的size我们要知道计算NDVI的图像的大小,即有多少列,多少行。size[1]就是返回的5个值的第2个值,即图像多少列,size[2]就是size返回的5个值中的第3个,即图像有多少行。
然后预定义3个通道的矩阵,RGB通道的3个值。
后面是for循环,这个循环从0开始,到这个分割区间-1次,其实就是分割区间的区间次的循环
where函数判断NDVI是否介于第一和第二之间,如果介于这两个之间那么我的RGB就赋值为那个索引矩阵的第3、4、5列,完成后就完成分量通道的计算
那么最后,把这三个通道合起来,就成了一幅彩色图像。
最后的最后,显示一下图像吧,记得加上order=1就行了。
OK了,就是那么个思路和语法。