Log 0 – Manipulación Básica de Imagenes

La suma de valores a cada pixel puede ser utilizado para obtener,
Ajuste de Contraste, sumando un valor a cada pixel de una imagen incrementa su valor, por lo tanto aumenta su brillo.


from PIL import Image

myIm = Image.open("tucan.jpg")

myImResta = myIm.point(lambda x: x-100)
myImSuma = myIm.point(lambda x: x+100)

myImResta.save("contraste-100.png")
myImSuma.save("contraste+100.png")

En esta imagen vimos suma y resta de valores constantes.

Otra operación interesante es el ‘blending‘ .. que consiste en sumar dos imagenes (ponderando una mas que la otra con un alpha constante).

from PIL import Image

fox = Image.open("fox.jpg")
buddy = Image.open("fox2.jpg")

# para realizar blending deben tener el mismo tamano
buddy.resize(fox.size)

out = Image.blend(fox, tucan, 0.40)
# out = image1 * (1.0 - alpha) + image2 * alpha

out.save("myFoxyBlending.jpg")

En cuanto a operaciones lógicas una de las mas simples, como lo es la Negación , podemos inferir facilmente que esta operación invierte la representación de la imagen.
En imagenes binarias, el negro se convierte en blanco y viceversa.
En imagenes de color o escala de grises, el proceso consiste en aplicar a cada pixel $(MAX – p(x,y))$, donde $MAX$ es el valor máximo posible.

from PIL import Image, ImageChops

myImC = Image.open("tucan.jpg") #imagen color

myGreyTucan = myImC.convert("L")
myBWTucan = myImC.convert("1")

out = ImageChops.invert(myImC) #Invertido Color
out2 = ImageChops.invert(myGreyTucan) #Invertido Color
out3 = ImageChops.invert(myBWTucan) #Invertido Blanco y Negro

También podemos jugar con los espacios de color …

La representación de los colores en una imagen digital se logra usando una combinación de uno o más canales.

La representación que utilizamos para almacenar los colores, especificando numero y ‘naturaleza’ del canal es conocido como espacio de color.

 from PIL import Image
 from pylab import subplot,bar,savefig

 myIm = Image.open("tucan.jpg")
 myHis = myIm.histogram()

 subplot(333)
 bar(range(256), myHis[0:256], ec = 'r')
 subplot(336)
 bar(range(256), myHis[256:512], ec = 'g')
 subplot(339)
 bar(range(256), myHis[512:768], ec = 'b')

 savefig("myHIsto.png")
 

RGB es un espacio tridimensional, por lo que podemos imaginarlo como un cubo, con ejes R,G y B, todos los ejes poseen el mismo rango (escalado de 0-255 para 1 byte por canal, asignando 24 bit para la representación de la imagen).

El color negro lo encontramos en el origen del cubo $RGB(0,0,0)$ , el cual corresponde a la ausencia de color y el color blanco en la esquina opuesta $RGB(255,255,255)$ indicando la máxima cantidad de los tres colores.
El espacio de color RGB esta basado sobre la porción del espectro visible de los humanos.

Otro espacio con el que podemos experimentar es HSV,

El espacio de color ‘apreciable’ es una forma alternativa para representar imagenes en su verdadero color de una forma más natural para el humano que el espacio RGB.
En este espacio nos concentramos en el :

  • Matiz, es la longitud de onda dominante del color, (rojo, azul o verde).
  • Saturación, muestra el nivel de “pureza” del color, la cantidad de “luz blanca” mezclada con el color.
  • Valor, es el brillo del color , luminancia.

La representación HSV de una Imagen , al igual que RGB es un arreglo tridimensional, todo pixel de la imagen $f(x,y)$ posee una tupla del tipo $(h,s,v)$.
Podemos ver en el siguiente ejemplo la división de estos tres canales.

import cv
myIm = cv.LoadImage("tucan.jpg")
myHSV = cv.CreateImage(cv.GetSize(myIm),8,3)
cv.CvtColor(myIm, myHSV, cv.CV_RGB2HSV)

cv.SaveImage("myHSV.png", myHSV)

#Con esto tenemos la trasnformacion de RGB a HSV
#Ahora dividimos los canales

h_myHSV = cv.CreateImage(cv.GetSize(myIm), 8, 1)
s_myHSV = cv.CreateImage(cv.GetSize(myIm), 8, 1)
v_myHSV = cv.CreateImage(cv.GetSize(myIm), 8, 1)

cv.Split(myHSV, h_myHSV, s_myHSV, v_myHSV, None)

cv.SaveImage("h.png",h_myHSV)
cv.SaveImage("s.png",h_myHSV)
cv.SaveImage("v.png",h_myHSV)

 y como en el caso anterior podemos realizar un merge y ver que se vuelve a la imagen inicial.
cv.Merge(h_myHSV, s_myHSV, v_myHSV,None, myIm)
cv.SaveImage("myMergeHSV.png",myIm)

Estos y los siguientes logs forman parte de ejemplos básicos  (de un trabajo) para que no queden en /dev/null 🙂

Anuncios

3 pensamientos en “Log 0 – Manipulación Básica de Imagenes

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

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