Manipulación de pixels con Python-Fu

Este post fue migrado de un blog hecho con Wordpress. Si se ve mal, dejame un comentario y lo arreglo.

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 5x5 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

Comentarios

Comments powered by Disqus