├── ColorClassificationMap.py ├── DroneNDVIQGISProto.py ├── NDVIQGISWithMapLegend.py ├── QGIS Before and After.docx ├── QGISContrastFilter.py ├── README.md ├── RGBContrastEnhancement.py └── evaluate mean and standard deviation constants.py /ColorClassificationMap.py: -------------------------------------------------------------------------------- 1 | from PyQt5.QtCore import * 2 | from PyQt5.QtGui import * 3 | 4 | layer = iface.activeLayer() 5 | 6 | renderer = layer.renderer() 7 | provider = layer.dataProvider() 8 | extent = layer.extent() 9 | 10 | ver = provider.hasStatistics(1, QgsRasterBandStats.All) 11 | 12 | stats = provider.bandStatistics(1, QgsRasterBandStats.All,extent, 0) 13 | 14 | if ver is not False: 15 | print("minimumValue = ", stats.minimumValue) 16 | 17 | print("maximumValue = ", stats.maximumValue) 18 | 19 | if (stats.minimumValue < 0): 20 | min = 0 21 | 22 | else: 23 | min= stats.minimumValue 24 | 25 | max = stats.maximumValue 26 | range = max - min 27 | add = range//2 28 | interval = min + add 29 | 30 | colDic = {'red':'#ff0000', 'yellow':'#ffff00','blue':'#0000ff'} 31 | 32 | valueList =[min, interval, max] 33 | 34 | lst = [ QgsColorRampShader.ColorRampItem(valueList[0], QColor(colDic['red'])), 35 | QgsColorRampShader.ColorRampItem(valueList[1], QColor(colDic['yellow'])), 36 | QgsColorRampShader.ColorRampItem(valueList[2], QColor(colDic['blue']))] 37 | 38 | myRasterShader = QgsRasterShader() 39 | myColorRamp = QgsColorRampShader() 40 | 41 | myColorRamp.setColorRampItemList(lst) 42 | myColorRamp.setClassificationMode(1) # this line doesn't work 43 | myRasterShader.setRasterShaderFunction(myColorRamp) 44 | 45 | myPseudoRenderer = QgsSingleBandPseudoColorRenderer(layer.dataProvider(), 46 | layer.type(), 47 | myRasterShader) 48 | 49 | layer.setRenderer(myPseudoRenderer) 50 | 51 | layer.triggerRepaint() -------------------------------------------------------------------------------- /DroneNDVIQGISProto.py: -------------------------------------------------------------------------------- 1 | # a prototype script that runs in the QGIS Python Console and Generates and NDVI and Key for TIF file orthomosaic drone images 2 | # Coding developed by MuonRay Enterprises Ireland For Drone-based Mapping and Geomatics Projects (2018-2020) 3 | # This work is Creative Commons and is Open to use for educational, non-commercial and NGO use. 4 | 5 | from PyQt5.QtGui import * 6 | 7 | from PyQt5.QtCore import * 8 | 9 | from qgis.analysis import * 10 | 11 | layer = iface.activeLayer() 12 | 13 | raster = layer 14 | 15 | ir = QgsRasterCalculatorEntry() 16 | 17 | r = QgsRasterCalculatorEntry() 18 | 19 | ir.raster = raster 20 | 21 | r.raster = raster 22 | 23 | ir.bandNumber = 1 24 | 25 | r.bandNumber = 3 26 | 27 | ir.ref = rasterName + "@1" 28 | 29 | r.ref = rasterName + "@3" 30 | 31 | references = (ir.ref, r.ref, ir.ref, r.ref) 32 | 33 | exp = "1.0 * (%s - %s) / 1.0 + (%s + %s)" % references 34 | output = "/qgis_data/rasters/ndvi.tif" 35 | 36 | e = raster.extent() 37 | 38 | w = raster.width() 39 | 40 | h = raster.height() 41 | 42 | entries = [ir,r] 43 | 44 | ndvi = QgsRasterCalculator(exp, output, "GTiff", e, w, h, entries) 45 | ndvi.processCalculation() 46 | 47 | lyr = QgsRasterLayer(output, "NDVI") 48 | 49 | #ContrastEnhancement = QgsContrastEnhancement.StretchToMinimumMaximum 50 | ContrastEnhancement = QgsContrastEnhancement.StretchAndClipToMinimumMaximum 51 | 52 | lyr.setContrastEnhancement(ContrastEnhancement,True) 53 | 54 | renderer = lyr.renderer() 55 | provider = lyr.dataProvider() 56 | extent = lyr.extent() 57 | 58 | ver = provider.hasStatistics(1, QgsRasterBandStats.All) 59 | 60 | stats = provider.bandStatistics(1, QgsRasterBandStats.All,extent, 0) 61 | 62 | if ver is not False: 63 | print("minimumValue = ", stats.minimumValue) 64 | 65 | print("maximumValue = ", stats.maximumValue) 66 | 67 | if (stats.minimumValue < 0): 68 | min = 0 69 | 70 | else: 71 | min= stats.minimumValue 72 | 73 | max = stats.maximumValue 74 | range = max - min 75 | add = range//2 76 | interval = min + add 77 | 78 | colDic = {'red':'#ff0000', 'green':'#00ff00', 'yellow':'#ffff00','blue':'#0000ff','white':'#ffffff','maroon':'#800000' } 79 | 80 | valueList =[min, interval, max] 81 | 82 | 83 | qri = QgsColorRampShader.ColorRampItem 84 | 85 | myRasterShader = QgsRasterShader() #s 86 | 87 | myColorRamp = QgsColorRampShader() #c 88 | 89 | i=[] 90 | 91 | i.append(qri(0, QColor(0,0,0,0), 'NODATA')) 92 | i.append(qri(100, QColor(120,69,25,255), 'Lowest Vegetation NDVI<0.1')) 93 | i.append(qri(130, QColor(255,178,74,255), 'Lower Vegetation NDVI<0.3')) 94 | i.append(qri(160, QColor(255,237, 166,255), 'Low Vegetation NDVI<0.5')) 95 | i.append(qri(190, QColor(173,232,94,255), 'Moderate Vegetation NDVI>0.5')) 96 | i.append(qri(220, QColor(135,181,64,255), 'High Vegetation NDVI>0.5')) 97 | i.append(qri(250, QColor(3,156,0,255), 'Higher Vegetation NDVI>0.7')) 98 | i.append(qri(280, QColor(1,100,0,255), 'Highest Vegetation NDVI>0.9')) 99 | 100 | myColorRamp.setColorRampItemList(i) #c 101 | myColorRamp.setClassificationMode(1) # this line doesn't work #c 102 | 103 | myRasterShader.setRasterShaderFunction(myColorRamp) #s 104 | myRasterShader.setRasterShaderFunction(myColorRamp) #s 105 | 106 | myPseudoRenderer = QgsSingleBandPseudoColorRenderer(lyr.dataProvider(), 107 | lyr.type(), 108 | myRasterShader) 109 | 110 | layer.setRenderer(myPseudoRenderer) 111 | 112 | layer.triggerRepaint() 113 | -------------------------------------------------------------------------------- /NDVIQGISWithMapLegend.py: -------------------------------------------------------------------------------- 1 | # a prototype script that runs in the QGIS Python Console and Generates and NDVI and Key for TIF file orthomosaic drone images 2 | # Coding developed by MuonRay Enterprises Ireland For Drone-based Mapping and Geomatics Projects (2018-2020) 3 | # This work is Creative Commons and is Open to use for educational, non-commercial and NGO use. 4 | 5 | from PyQt5.QtGui import * 6 | 7 | from PyQt5.QtCore import * 8 | 9 | from qgis.analysis import * 10 | 11 | layer = iface.activeLayer() 12 | 13 | raster = layer 14 | 15 | ir = QgsRasterCalculatorEntry() 16 | 17 | r = QgsRasterCalculatorEntry() 18 | 19 | ir.raster = raster 20 | 21 | r.raster = raster 22 | 23 | ir.bandNumber = 1 24 | 25 | r.bandNumber = 3 26 | 27 | ir.ref = rasterName + "@1" 28 | 29 | r.ref = rasterName + "@3" 30 | 31 | references = (ir.ref, r.ref, ir.ref, r.ref) 32 | 33 | exp = "1.0 * (%s - %s) / 1.0 + (%s + %s)" % references 34 | output = "/qgis_data/rasters/ndvi.tif" 35 | 36 | e = raster.extent() 37 | 38 | w = raster.width() 39 | 40 | h = raster.height() 41 | 42 | entries = [ir,r] 43 | 44 | ndvi = QgsRasterCalculator(exp, output, "GTiff", e, w, h, entries) 45 | ndvi.processCalculation() 46 | 47 | lyr = QgsRasterLayer(output, "NDVI") 48 | 49 | #ContrastEnhancement = QgsContrastEnhancement.StretchToMinimumMaximum 50 | ContrastEnhancement = QgsContrastEnhancement.StretchAndClipToMinimumMaximum 51 | 52 | lyr.setContrastEnhancement(ContrastEnhancement,True) 53 | 54 | renderer = lyr.renderer() 55 | provider = lyr.dataProvider() 56 | extent = lyr.extent() 57 | 58 | ver = provider.hasStatistics(1, QgsRasterBandStats.All) 59 | 60 | stats = provider.bandStatistics(1, QgsRasterBandStats.All,extent, 0) 61 | 62 | if ver is not False: 63 | print("minimumValue = ", stats.minimumValue) 64 | 65 | print("maximumValue = ", stats.maximumValue) 66 | 67 | if (stats.minimumValue < 0): 68 | min = 0 69 | 70 | else: 71 | min= stats.minimumValue 72 | 73 | max = stats.maximumValue 74 | range = max - min 75 | add = range//2 76 | interval = min + add 77 | 78 | colDic = {'red':'#ff0000', 'green':'#00ff00', 'yellow':'#ffff00','blue':'#0000ff','white':'#ffffff','maroon':'#800000' } 79 | 80 | valueList =[min, interval, max] 81 | 82 | 83 | qri = QgsColorRampShader.ColorRampItem 84 | 85 | myRasterShader = QgsRasterShader() #s 86 | 87 | myColorRamp = QgsColorRampShader() #c 88 | 89 | i=[] 90 | 91 | i.append(qri(0, QColor(0,0,0,0), 'NODATA')) 92 | i.append(qri(100, QColor(120,69,25,255), 'Lowest Vegetation NDVI<0.1')) 93 | i.append(qri(130, QColor(255,178,74,255), 'Lower Vegetation NDVI<0.3')) 94 | i.append(qri(160, QColor(255,237, 166,255), 'Low Vegetation NDVI<0.5')) 95 | i.append(qri(190, QColor(173,232,94,255), 'Moderate Vegetation NDVI>0.5')) 96 | i.append(qri(220, QColor(135,181,64,255), 'High Vegetation NDVI>0.5')) 97 | i.append(qri(250, QColor(3,156,0,255), 'Higher Vegetation NDVI>0.7')) 98 | i.append(qri(280, QColor(1,100,0,255), 'Highest Vegetation NDVI>0.9')) 99 | 100 | myColorRamp.setColorRampItemList(i) #c 101 | myColorRamp.setClassificationMode(1) # this line doesn't work #c 102 | 103 | myRasterShader.setRasterShaderFunction(myColorRamp) #s 104 | myRasterShader.setRasterShaderFunction(myColorRamp) #s 105 | 106 | myPseudoRenderer = QgsSingleBandPseudoColorRenderer(lyr.dataProvider(), 107 | lyr.type(), 108 | myRasterShader) 109 | 110 | layer.setRenderer(myPseudoRenderer) 111 | 112 | layer.triggerRepaint() 113 | -------------------------------------------------------------------------------- /QGIS Before and After.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MuonRay/QGISPython/957a27a6a429172800dcf53b2a58bbe6099bb5bf/QGIS Before and After.docx -------------------------------------------------------------------------------- /QGISContrastFilter.py: -------------------------------------------------------------------------------- 1 | # get the raster layer 2 | layer = iface.activeLayer() 3 | 4 | # define the filter 5 | contrastFilter = QgsBrightnessContrastFilter() 6 | contrastFilter.setContrast(50) 7 | 8 | # assign filter to raster pipe 9 | layer.pipe().set(contrastFilter) 10 | 11 | # apply changes 12 | layer.triggerRepaint() 13 | 14 | # to set contrast back, change properties of assigned filter. 15 | # DO NOT ASSIGN THIS OR ANOTHER QgsBrightnessContrastFilter AGAIN, QGIS WILL CRASH 16 | contrastFilter.setContrast(0) 17 | layer.triggerRepaint() -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # QGISPython 2 | A Collection of Python Codes that work in QGIS (Quantum GIS) that work on Orthomosaic Maps Generated by Aerial Photogrammetry Software such as DroneDeploy or PIX4D. The Goal of these codes is to create free to use classification and NDVI on orthomosaics generated using freeware or trial versions of software. 3 | Dual bandpass filters used on the modified DJI Mavic 2 Pro Full-Spectrum Hasselblad can be purchased here: Both Types of Filters for sale here: 4 | 5 | https://www.ebay.ie/itm/155859816325 6 | 7 | https://www.ebay.ie/itm/155859834544 8 | 9 | 10 | filter used in short video on using dual bandpass filter to image plants in NIR using an unmodified smartphone camera 📷 here: https://www.ebay.ie/itm/156189179840 11 | -------------------------------------------------------------------------------- /RGBContrastEnhancement.py: -------------------------------------------------------------------------------- 1 | layer = iface.activeLayer() 2 | renderer = layer.renderer() 3 | provider = layer.dataProvider() 4 | 5 | bands = renderer.usesBands() 6 | 7 | min = [provider.bandStatistics(band, QgsRasterBandStats.All).minimumValue 8 | for band in bands] 9 | 10 | max = [provider.bandStatistics(band, QgsRasterBandStats.All).maximumValue 11 | for band in bands] 12 | 13 | print(min) 14 | print(max) 15 | 16 | ContrastEnhancement = QgsContrastEnhancement.StretchToMinimumMaximum 17 | 18 | myRedBand = layer.renderer().redBand() 19 | myRedType = layer.renderer().dataType(myRedBand) 20 | myRedEnhancement = QgsContrastEnhancement(myRedType) 21 | myRedEnhancement.setContrastEnhancementAlgorithm(ContrastEnhancement,True) 22 | myRedEnhancement.setMinimumValue(70) 23 | myRedEnhancement.setMaximumValue(255) 24 | layer.renderer().setRedContrastEnhancement(myRedEnhancement) 25 | 26 | myGreenBand = layer.renderer().greenBand() 27 | myGreenType = layer.renderer().dataType(myGreenBand) 28 | myGreenEnhancement = QgsContrastEnhancement(myGreenType) 29 | myGreenEnhancement.setContrastEnhancementAlgorithm(ContrastEnhancement,True) 30 | myGreenEnhancement.setMinimumValue(89) 31 | myGreenEnhancement.setMaximumValue(255) 32 | layer.renderer().setGreenContrastEnhancement(myGreenEnhancement) 33 | 34 | myBlueBand = layer.renderer().blueBand() 35 | myBlueType = layer.renderer().dataType(myBlueBand) 36 | myBlueEnhancement = QgsContrastEnhancement(myBlueType) 37 | myBlueEnhancement.setContrastEnhancementAlgorithm(ContrastEnhancement,True) 38 | myBlueEnhancement.setMinimumValue(90) 39 | myBlueEnhancement.setMaximumValue(255) 40 | layer.renderer().setBlueContrastEnhancement(myBlueEnhancement) 41 | 42 | layer.triggerRepaint() -------------------------------------------------------------------------------- /evaluate mean and standard deviation constants.py: -------------------------------------------------------------------------------- 1 | from qgis.analysis import QgsRasterCalculator, QgsRasterCalculatorEntry 2 | 3 | layer = iface.activeLayer() 4 | entries = [] 5 | 6 | # Define band1 7 | band1 = QgsRasterCalculatorEntry() 8 | band1.ref = 'band@1' 9 | band1.raster = layer 10 | band1.bandNumber = 1 11 | entries.append( band1 ) 12 | 13 | renderer = layer.renderer() 14 | provider = layer.dataProvider() 15 | extent = layer.extent() 16 | 17 | stats = provider.bandStatistics(1, QgsRasterBandStats.All,extent, 0) 18 | 19 | myMean = stats.mean 20 | myStdDev = stats.stdDev 21 | 22 | myFormula = '(band@1 -' + str(myMean) +')/' + str(myStdDev) 23 | 24 | print("mean = ", myMean) 25 | 26 | print("stdev = ", myStdDev) 27 | 28 | # Process calculation with input extent and resolution 29 | calc = QgsRasterCalculator( myFormula, 30 | '/home/zeito/pyqgis_data/outputfile.tif', 31 | 'GTiff', 32 | layer.extent(), 33 | layer.width(), 34 | layer.height(), 35 | entries ) 36 | 37 | calc.processCalculation() --------------------------------------------------------------------------------