python:计算索引类算法
import numpy as np # Class implemented to calculus the index class IndexCalculation: def __init__(self, red=None, green=None, blue=None, redEdge=None, nir=None): # print("Numpy version: " np.__version__) self.setMatrices(red=red, green=green, blue=blue, redEdge=redEdge, nir=nir) def setMatrices(self, red=None, green=None, blue=None, redEdge=None, nir=None): if red is not None: self.red = red if green is not None: self.green = green if blue is not None: self.blue = blue if redEdge is not None: self.redEdge = redEdge if nir is not None: self.nir = nir return True def calculation( self, index="" red=None, green=None, blue=None, redEdge=None, nir=None
):
""" performs the calculation of the index with the values instantiated in the class :str index: abbreviation of index name to perform """
self.setMatrices(red=red, green=green, blue=blue, redEdge=redEdge, nir=nir)
funcs = {
"ARVI2": self.ARVI2,
"CCCI": self.CCCI,
"CVI": self.CVI,
"GLI": self.GLI,
"NDVI": self.NDVI,
"BNDVI": self.BNDVI,
"redEdgeNDVI": self.redEdgeNDVI,
"GNDVI": self.GNDVI,
"GBNDVI": self.GBNDVI,
"GRNDVI": self.GRNDVI,
"RBNDVI": self.RBNDVI,
"PNDVI": self.PNDVI,
"ATSAVI": self.ATSAVI,
"BWDRVI": self.BWDRVI,
"CIgreen": self.CIgreen,
"CIrededge": self.CIrededge,
"CI": self.CI,
"CTVI": self.CTVI,
"GDVI": self.GDVI,
"EVI": self.EVI,
"GEMI": self.GEMI,
"GOSAVI": self.GOSAVI,
"GSAVI": self.GSAVI,
"Hue": self.Hue,
"IVI": self.IVI,
"IPVI": self.IPVI,
"I": self.I,
"RVI": self.RVI,
"MRVI": self.MRVI,
"MSAVI": self.MSAVI,
"NormG": self.NormG,
"NormNIR": self.NormNIR,
"NormR": self.NormR,
"NGRDI": self.NGRDI,
"RI": self.RI,
"S": self.S,
"IF": self.IF,
"DVI": self.DVI,
"TVI": self.TVI,
"NDRE": self.NDRE,
}
try:
return funcs[index]()
except KeyError:
print("Index not in the list!")
return False
def ARVI2(self):
""" Atmospherically Resistant Vegetation Index 2 https://www.indexdatabase.de/db/i-single.php?id=396 :return: index −0.18+1.17*(self.nir−self.red)/(self.nir+self.red) """
return -0.18 + (1.17 * ((self.nir - self.red) / (self.nir + self.red)))
def CCCI(self):
""" Canopy Chlorophyll Content Index https://www.indexdatabase.de/db/i-single.php?id=224 :return: index """
return ((self.nir - self.redEdge) / (self.nir + self.redEdge)) / (
(self.nir - self.red) / (self.nir + self.red)
)
def CVI(self):
""" Chlorophyll vegetation index https://www.indexdatabase.de/db/i-single.php?id=391 :return: index """
return self.nir * (self.red / (self.green**2))
def GLI(self):
""" self.green leaf index https://www.indexdatabase.de/db/i-single.php?id=375 :return: index """
return (2 * self.green - self.red - self.blue) / (
2 * self.green + self.red + self.blue
)
def NDVI(self):
""" Normalized Difference self.nir/self.red Normalized Difference Vegetation Index, Calibrated NDVI - CDVI https://www.indexdatabase.de/db/i-single.php?id=58 :return: index """
return (self.nir - self.red) / (self.nir + self.red)
def BNDVI(self):
""" Normalized Difference self.nir/self.blue self.blue-normalized difference vegetation index https://www.indexdatabase.de/db/i-single.php?id=135 :return: index """
return (self.nir - self.blue) / (self.nir + self.blue)
def redEdgeNDVI(self):
""" Normalized Difference self.rededge/self.red https://www.indexdatabase.de/db/i-single.php?id=235 :return: index """
return (self.redEdge - self.red) / (self.redEdge + self.red)
def GNDVI(self):
""" Normalized Difference self.nir/self.green self.green NDVI https://www.indexdatabase.de/db/i-single.php?id=401 :return: index """
return (self.nir - self.green) / (self.nir + self.green)
def GBNDVI(self):
""" self.green-self.blue NDVI https://www.indexdatabase.de/db/i-single.php?id=186 :return: index """
return (self.nir - (self.green + self.blue)) / (
self.nir + (self.green + self.blue)
)
def GRNDVI(self):
""" self.green-self.red NDVI https://www.indexdatabase.de/db/i-single.php?id=185 :return: index """
return (self.nir - (self.green + self.red)) / (
self.nir + (self.green + self.red)
)
def RBNDVI(self):
""" self.red-self.blue NDVI https://www.indexdatabase.de/db/i-single.php?id=187 :return: index """
return (self.nir - (self.blue + self.red)) / (self.nir + (self.blue + self.red))
def PNDVI(self):
""" Pan NDVI https://www.indexdatabase.de/db/i-single.php?id=188 :return: index """
return (self.nir - (self.green + self.red + self.blue)) / (
self.nir + (self.green + self.red + self.blue)
)
def ATSAVI(self, X=0.08, a=1.22, b=0.03):
""" Adjusted transformed soil-adjusted VI https://www.indexdatabase.de/db/i-single.php?id=209 :return: index """
return a * (
(self.nir - a * self.red - b)
/ (a * self.nir + self.red - a * b + X * (1 + a**2))
)
def BWDRVI(self):
""" self.blue-wide dynamic range vegetation index https://www.indexdatabase.de/db/i-single.php?id=136 :return: index """
return (0.1 * self.nir - self.blue) / (0.1 * self.nir + self.blue)
def CIgreen(self):
""" Chlorophyll Index self.green https://www.indexdatabase.de/db/i-single.php?id=128 :return: index """
return (self.nir / self.green) - 1
def CIrededge(self):
""" Chlorophyll Index self.redEdge https://www.indexdatabase.de/db/i-single.php?id=131 :return: index """
return (self.nir / self.redEdge) - 1
def CI(self):
""" Coloration Index https://www.indexdatabase.de/db/i-single.php?id=11 :return: index """
return (self.red - self.blue) / self.red
def CTVI(self):
""" Corrected Transformed Vegetation Index https://www.indexdatabase.de/db/i-single.php?id=244 :return: index """
ndvi = self.NDVI()
return ((ndvi + 0.5) / (abs(ndvi + 0.5))) * (abs(ndvi + 0.5) ** (1 / 2))
def GDVI(self):
""" Difference self.nir/self.green self.green Difference Vegetation Index https://www.indexdatabase.de/db/i-single.php?id=27 :return: index """
return self.nir - self.green
def EVI(self):
""" Enhanced Vegetation Index https://www.indexdatabase.de/db/i-single.php?id=16 :return: index """
return 2.5 * (
(self.nir - self.red) / (self.nir + 6 * self.red - 7.5 * self.blue + 1)
)
def GEMI(self):
""" Global Environment Monitoring Index https://www.indexdatabase.de/db/i-single.php?id=25 :return: index """
n = (2 * (self.nir**2 - self.red**2) + 1.5 * self.nir + 0.5 * self.red) / (
self.nir + self.red + 0.5
)
return n * (1 - 0.25 * n) - (self.red - 0.125) / (1 - self.red)
def GOSAVI(self, Y=0.16):
""" self.green Optimized Soil Adjusted Vegetation Index https://www.indexdatabase.de/db/i-single.php?id=29 mit Y = 0,16 :return: index """
return (self.nir - self.green) / (self.nir + self.green + Y)
def GSAVI(self, L=0.5):
""" self.green Soil Adjusted Vegetation Index https://www.indexdatabase.de/db/i-single.php?id=31 mit L = 0,5 :return: index """
return ((self.nir - self.green) / (self.nir + self.green + L)) * (1 + L)
def Hue(self):
""" Hue https://www.indexdatabase.de/db/i-single.php?id=34 :return: index """
return np.arctan(
((2 * self.red - self.green - self.blue) / 30.5) * (self.green - self.blue)
)
def IVI(self, a=None, b=None):
""" Ideal vegetation index https://www.indexdatabase.de/db/i-single.php?id=276 b=intercept of vegetation line a=soil line slope :return: index """
return (self.nir - b) / (a * self.red)
def IPVI(self):
""" Infraself.red percentage vegetation index https://www.indexdatabase.de/db/i-single.php?id=35 :return: index """
return (self.nir / ((self.nir + self.red) / 2)) * (self.NDVI() + 1)
def I(self): # noqa: E741,E743
""" Intensity https://www.indexdatabase.de/db/i-single.php?id=36 :return: index """
return (self.red + self.green + self.blue) / 30.5
def RVI(self):
""" Ratio-Vegetation-Index http://www.seos-project.eu/modules/remotesensing/remotesensing-c03-s01-p01.html :return: index """
return self.nir / self.red
def MRVI(self):
""" Modified Normalized Difference Vegetation Index RVI https://www.indexdatabase.de/db/i-single.php?id=275 :return: index """
return (self.RVI() - 1) / (self.RVI() + 1)
def MSAVI(self):
""" Modified Soil Adjusted Vegetation Index https://www.indexdatabase.de/db/i-single.php?id=44 :return: index """
return (
(2 * self.nir + 1)
- ((2 * self.nir + 1) ** 2 - 8 * (self.nir - self.red)) ** (1 / 2)
) / 2
def NormG(self):
""" Norm G https://www.indexdatabase.de/db/i-single.php?id=50 :return: index """
return self.green / (self.nir + self.red + self.green)
def NormNIR(self):
""" Norm self.nir https://www.indexdatabase.de/db/i-single.php?id=51 :return: index """
return self.nir / (self.nir + self.red + self.green)
def NormR(self):
""" Norm R https://www.indexdatabase.de/db/i-single.php?id=52 :return: index """
return self.red / (self.nir + self.red + self.green)
def NGRDI(self):
""" Normalized Difference self.green/self.red Normalized self.green self.red difference index, Visible Atmospherically Resistant Indices self.green (VIself.green) https://www.indexdatabase.de/db/i-single.php?id=390 :return: index """
return (self.green - self.red) / (self.green + self.red)
def RI(self):
""" Normalized Difference self.red/self.green self.redness Index https://www.indexdatabase.de/db/i-single.php?id=74 :return: index """
return (self.red - self.green) / (self.red + self.green)
def S(self):
""" Saturation https://www.indexdatabase.de/db/i-single.php?id=77 :return: index """
max = np.max([np.max(self.red), np.max(self.green), np.max(self.blue)])
min = np.min([np.min(self.red), np.min(self.green), np.min(self.blue)])
return (max - min) / max
def IF(self):
""" Shape Index https://www.indexdatabase.de/db/i-single.php?id=79 :return: index """
return (2 * self.red - self.green - self.blue) / (self.green - self.blue)
def DVI(self):
""" Simple Ratio self.nir/self.red Difference Vegetation Index, Vegetation Index Number (VIN) https://www.indexdatabase.de/db/i-single.php?id=12 :return: index """
return self.nir / self.red
def TVI(self):
""" Transformed Vegetation Index https://www.indexdatabase.de/db/i-single.php?id=98 :return: index """
return (self.NDVI() + 0.5) ** (1 / 2)
def NDRE(self):
return (self.nir - self.redEdge) / (self.nir + self.redEdge)