Realce por contraste (Contrast Enhancement) con Raster Layers en PyQGIS

El realce por contraste en PyQGIS se alcanza a través de la data, atributos y métodos de la clase QgsContrastEnhancement. Para ello, es necesario usar el constructor de la clase pasando como argumento el tipo de banda usada el cual se obtiene, si se está trabajando con Raster Layers del tipo Single Band Gray, con el método ‘dataType’ de la clase QgsSingleBandGrayRenderer. Vamos a cargar en la Map View de QGIS un raster de este tipo, nos aseguramos que es capa activa y creamos una referencia al mismo a través de iface. También extraemos el código entero de la banda a través del ‘renderer’ así como su ‘dataType’.

La imagen luce como sigue:

enhancement3

Ahora comenzamos a escribir el código en la Python Console:

>>>layer=iface.activeLayer()
>>>renderer=layer.renderer()
>>>renderer
<qgis.core.QgsSingleBandGrayRenderer object at 0x20945978>
>>>myBand=renderer.grayBand()
>>>myBand
1
>>>myType=renderer.dataType(myBand)
>>>myType
13

Una vez obtenido el código de la banda ahora se va a usar el constructor de QgsContrastEnhancement para obtener un objeto de esa clase y así poder acceder a sus métodos. Por tanto:

>>>myEnhancement=QgsContrastEnhancement(myType)
>>>myEnhancement
<qgis.core.QgsContrastEnhancement object at 0x20950588>

Antes de continuar es conveniente hacer un dir a la clase en la Python Console y ver su atributos y métodos:

['ClipToMinimumMaximum', 'ContrastEnhancementAlgorithm', 'NoEnhancement', 
'StretchAndClipToMinimumMaximum', 'StretchToMinimumMaximum', 
'UserDefinedEnhancement', '__class__', '__delattr__', 
'__dict__', '__doc__', '__format__', '__getattribute__', 
'__hash__', '__init__', '__module__', '__new__', 
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', 
'__sizeof__', '__str__', '__subclasshook__', '__weakref__', 
'contrastEnhancementAlgorithm', 'contrastEnhancementAlgorithmFromString', 'contrastEnhancementAlgorithmString', 'enhanceContrast', 'isValueInDisplayableRange', 'maximumValue', 
'maximumValuePossible', 'minimumValue', 'minimumValuePossible', 
'readXML', 'setContrastEnhancementAlgorithm', 
'setContrastEnhancementFunction', 'setMaximumValue', 
'setMinimumValue', 'writeXML']

Si imprimimos los códigos de los atributos, antes de los métodos especiales de clase, éstos se podrían usar como un selector en un script más elaborado.

>>>QgsContrastEnhancement.NoEnhancement
0
>>>QgsContrastEnhancement.StretchToMinimumMaximum
1
>>>QgsContrastEnhancement.StretchAndClipToMinimumMaximum
2
>>>QgsContrastEnhancement.ClipToMinimumMaximum
3

Vamos a escoger en primer lugar ‘NoEnhancement’; el cual no requiere el uso de mínimos y máximos para el despliegue del histograma. Entonces:

>>>ContrastEnhancement=QgsContrastEnhancement.NoEnhancement
>>>myEnhancement.setContrastEnhancementAlgorithm(ContrastEnhancement,True)
>>>layer.renderer().setContrastEnhancement(myEnhancement)
>>>iface.mapCanvas().refresh()

Obteniéndose este resultado:

enhancement2

Antes, éste era el realce por contraste por defecto que se obtenía al abrir un raster de este tipo en versiones antiguas de QGIS. Vamos a revertir ésto pero haciendo un poco de trampa para ahorrar tiempo. Averigüemos en las “Layer Properties” los valores mínimo y máximo del raster para ser usados con ‘StretchToMinimumMaximum’ (recuerden que esto se puede programar con el método ‘bandStatistics’ de QgsRasterDataProvider). Los valores son 1323 y 3556 respectivamente. Por tanto:

>>>myEnhancement = QgsContrastEnhancement(myType)
>>>ContrastEnhancement=QgsContrastEnhancement.StretchToMinimumMaximum
>>>myEnhancement.setContrastEnhancementAlgorithm(ContrastEnhancement,True)
>>>myEnhancement.setMinimumValue(1323)
>>>myEnhancement.setMaximumValue(3556)
>>>layer.renderer().setContrastEnhancement(myEnhancement)
>>>iface.mapCanvas().refresh()

El resultado es similar a la imagen inicial de este post por lo que se ha revertido el ‘NoEnhancement’.

Esta entrada fue publicada en Código Python, PyQGIS, SIG, Software Libre. Guarda el enlace permanente.

2 respuestas a Realce por contraste (Contrast Enhancement) con Raster Layers en PyQGIS

  1. Pingback: Realce por contraste (Contrast Enhancement) con...

  2. Pingback: Cómo cambiar el renderizado de un ráster basado en pseudo color o palette a single band gray | El Blog de José Guerrero

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s