2 votos

¿Mostrar raster RGB en QGIS sin mejora con Python Console?

Estoy trabajando con un raster RGB en QGIS 2.6.1, en una máquina con Windows 7.

Necesito establecer la opción de Mejora de Contraste a Sin Mejora con la Consola de Python (no a través de la ventana de Propiedades de Capa). He desarrollado un sencillo script, inspirado en esta discusión: Problema con QGIS Scripting actualizando mejoras de contraste para capas raster usando bandStatistics

layer = iface.activeLayer()
renderer = layer.renderer()
ContrastEnhancement = QgsContrastEnhancement.NoEnhancement

for Band in range(3):
    if Band == 0:
        myBand = layer.renderer().redBand()
    elif Band == 1:
        myBand = layer.renderer().greenBand()
    elif Band == 2:
        myBand = layer.renderer().blueBand()
    myType = layer.renderer().dataType(myBand)
    myEnhancement = QgsContrastEnhancement(myType)
    myEnhancement.setContrastEnhancementAlgorithm(ContrastEnhancement,True)
    if Band == 0:
        layer.renderer().setRedContrastEnhancement(myEnhancement)
    elif Band == 1:
        layer.renderer().setGreenContrastEnhancement(myEnhancement)
    elif Band == 2:
        layer.renderer().setBlueContrastEnhancement(myEnhancement)

layer.triggerRepaint()

Desgraciadamente, no funciona y la capa deja de ser visible. Parece que no está manejando correctamente los valores mín./máx. de las bandas. ¿Alguna sugerencia?

2voto

Yada Puntos 9489

Tu script funciona como se espera porque necesitas un 'ContrastEnhancement' para cada banda a 'StretchToMinimumMaximum' en lugar de 'NoEnhancement'. He modificado tu script para calcular los valores mínimo y máximo de cada banda utilizando el método 'bandStatistics' de QgsDataProvider clase. Estos valores se establecieron manualmente en el código y se utilizó la imagen rgb 'natural_earth' para probarlo.

layer = iface.activeLayer()
renderer = layer.renderer()
provider = layer.dataProvider()

bands = renderer.usesBands()

min = [provider.bandStatistics(band, QgsRasterBandStats.All).minimumValue 
            for band in bands]

max = [provider.bandStatistics(band, QgsRasterBandStats.All).maximumValue 
            for band in bands]

print min
print max

ContrastEnhancement = QgsContrastEnhancement.StretchToMinimumMaximum

myRedBand = layer.renderer().redBand()
myRedType = layer.renderer().dataType(myRedBand)
myRedEnhancement = QgsContrastEnhancement(myRedType)
myRedEnhancement.setContrastEnhancementAlgorithm(ContrastEnhancement,True)
myRedEnhancement.setMinimumValue(62)
myRedEnhancement.setMaximumValue(255)
layer.renderer().setRedContrastEnhancement(myRedEnhancement)

myGreenBand = layer.renderer().greenBand()
myGreenType = layer.renderer().dataType(myGreenBand)
myGreenEnhancement = QgsContrastEnhancement(myGreenType)
myGreenEnhancement.setContrastEnhancementAlgorithm(ContrastEnhancement,True)
myGreenEnhancement.setMinimumValue(89)
myGreenEnhancement.setMaximumValue(255)
layer.renderer().setGreenContrastEnhancement(myGreenEnhancement)

myBlueBand = layer.renderer().blueBand()
myBlueType = layer.renderer().dataType(myBlueBand)
myBlueEnhancement = QgsContrastEnhancement(myBlueType)
myBlueEnhancement.setContrastEnhancementAlgorithm(ContrastEnhancement,True)
myBlueEnhancement.setMinimumValue(90)
myBlueEnhancement.setMaximumValue(255)
layer.renderer().setBlueContrastEnhancement(myBlueEnhancement)

layer.triggerRepaint()

Después de ejecutar el código en la consola Python de QGIS no se observaron cambios en el raster (ver siguiente imagen); como era de esperar.

enter image description here

Sin embargo, si se modifica, por ejemplo, el valor máximo de la mejora del rojo a 100:

myRedEnhancement.setMaximumValue(100)

el resultado cambia drásticamente; como puede observarse en la siguiente imagen:

enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X