Manipulación de pixels con Python-Fu

Usando GIMP y el complemento que permite crear plug-ins en Python podemos hacer manipulación a bajo nivel de los pixels de una imagen.

PixelRegion

PixelRegion permite realizar una abstracción sobre una imagen de forma tal de verla como una región de pixeles. Cada posición x,y de la región corresponde a un pixel de la imagen. En el caso de las imágenes RGB, cada pixel tiene 3 valores. En Python-Fu estos valores son representados con un string de 3 caracteres en el que cada caracter es uno de aquellos que tiene su número de orden (función ord) entre y 255.

Los siguientes ejemplos son una demostración sencilla de como trabajar con PixelPerfect para manipular imágenes. En el primer ejemplo se leen los valores de algunos de los pixeles de la imagen y en el segundo se escriben otros.

Ejemplo 1 (lectura)

La siguiente imagen de 5×5 pixeles (ampliada) será usada para este ejemplo:

5×5 pixel image

Imagen original

La función pixel es la que se ejecutará cuando ejecutemos el plug-in creado para este ejemplo. No se ingresan parámetros desde la interfaz gráfica del mismo, pero la función recibe 2 argumentos. Objetos que representan la imagen y la capa (layer) a procesar.

def pixels(img, layer):
 
    w = layer.width
    h = layer.height
 
    pr = layer.get_pixel_rgn(0, 0, w, h)
 
    print "Valores de los pixeles de las esquinas de la imagen"
 
    r,g,b = pr[0,0]
    print [ord(x) for x in r,g,b]
 
    r,g,b = pr[0,4]
    print [ord(x) for x in r,g,b]
 
    r,g,b = pr[4,0]
    print [ord(x) for x in r,g,b]
 
    r,g,b = pr[4,4]
    print [ord(x) for x in r,g,b]
 
    layer.update(0, 0, w, h)
    layer.flush()
    gimp.displays_flush()

El ejemplo es sencillo y lo que hace es instanciar una PixelRegion tan grande como la capa (layer). Luego los diferentes pixeles de la misma pueden accederse mediante sus coordenadas: pr[x,y].

Se muestran los valores RGB de cada uno de los puntos del ejemplo.

Código fuente: pixels-read.py

Ejemplo 2 (escritura)

En una porción de código que empieza de forma similar a la del ejemplo anterior podemos ver que una vez que hemos obtenido la PixelRegion que nos interesa, podemos escribir pixeles en ella.

El siguiente ejemplo aplicado sobre la imagen del ejemplo anterior dibuja una equis amarilla:

def pixels_write(img, layer):
 
    w = layer.width
    h = layer.height
    pr = layer.get_pixel_rgn(0, 0, w, h)
 
    yellow_rgb = (255,255,0)
    yellow_str = chr(yellow_rgb[0]) + chr(yellow_rgb[1]) + chr(yellow_rgb[2])
 
    for i in xrange(5):
        pr[i,i] = yellow_str
        pr[4-i,i] = yellow_str
 
    layer.update(0, 0, w, h)
    layer.flush()
    gimp.displays_flush()

5×5 image with yellow pixels

Imagen procesada con el código del ejemplo 2

Código fuente: pixels-write.py

Links

About Juanjo

Mi nombre es Juanjo Conti, vivo en Santa Fe y soy Ingeniero en Sistemas de Información. Mi lenguaje de programación de cabecera es Python; lo uso para trabajar, estudiar y jugar. Como hobby escribí un libro de cuentos que se puede descargar gratuitamente.
This entry was posted in Python Fu and tagged , . Bookmark the permalink.
  • Javier

    Buena pagina…. seria de GRAN ayuda que armes (mientras tengas tiempo) un tutorial de algun IDE que te permita programar algun codigo en Python. Vengo de PHP y Java asi que supongo que Python no sera de mucha dificultad, pero bueno mientras me interno un poco mas en esto seria lindo que pusieras cuales son los requisitos e IDEs para comenzar a desarrollar un programa Python. Tanto para linux como para windows.

    saludos y segui asi
    Javi

  • Juanjo
  • claudio canepa

    el link ‘Más artículos’ da 404 (solo aviso, vi que se puede llegar desde otra parte)

  • Juanjo

    Corregido!