martes, 5 de marzo de 2013

Crear anaglifos en Visual Basic .NET. Tratamiento de imágenes. Parte X.

Los anaglifos son, según la Wikipedia, imágenes de dos dimensiones capaces de provocar un efecto tridimensional, cuando se ven con lentes especiales (lentes de color diferente para cada ojo). Con el siguiente ejemplo de un anaglifo seguro que queda más claro.

Anaglifo

Para poder ver estas imágenes en 3D, serían necesarias unas gafas anafligo.
La imagen se forma a partir de dos imágenes muy próximas. Los pasos son los siguientes:
  •  A la imagen de la izquierda, se le quitan los colores verde y azul, y a la derecha se le quita la componente rojo
  • Se suman las imágenes.
Para que quede más claro, en vez de agrupar todo en una función, vamos a separarlo en 3 funciones. La primera función, denominada ExtraeVerdeAzul, que recibe una imagen.

Function ExtraeVerdeAzul(ByVal ImagenIzquierda As Bitmap) As Bitmap
        'Dejamos pasar sólo el rojo
        Dim Rojo As Byte
        Dim ImagenSalida As New Bitmap(ImagenIzquierda.Width, ImagenIzquierda.Height)
        For i = 0 To ImagenIzquierda.Width - 1  'Recorremos la matriz
            For j = 0 To ImagenIzquierda.Height - 1
                Rojo = ImagenIzquierda.GetPixel(i, j).R
                ImagenSalida.SetPixel(i, j, Color.FromArgb(Rojo, 0, 0)) 'Sólo almacenamos el rojo
            Next
        Next
       Return ImagenSalida
End Function

La función extraerá el color rojo y se llama ExtraeRojo
 Function ExtraeRojo(ByVal ImagenDerecha As Bitmap) As Bitmap
        'Dejamos pasar sólo el rojo
        Dim Verde, Azul As Byte
        Dim ImagenSalida As New Bitmap(ImagenDerecha.Width, ImagenDerecha.Height)
        For i = 0 To ImagenDerecha.Width - 1  'Recorremos la matriz
            For j = 0 To ImagenDerecha.Height - 1
                Verde = ImagenDerecha.GetPixel(i, j).G
                Azul = ImagenDerecha.GetPixel(i, j).B
                ImagenSalida.SetPixel(i, j, Color.FromArgb(0, Verde, Azul)) 'Sólo almacenamos el verde y azul
            Next
        Next
        Return ImagenSalida
End Function

Por último la siguiente función suma las imágenes.
 Function SumaImagenes(ByVal ImagenIzquierda As Bitmap, ByVal ImagenDerecha As Bitmap) As Bitmap

        Dim Rojo, Verde, Azul As Integer 'Declaramos tres variables que almacenarán los colores
        Dim bmpSalida As New Bitmap(ImagenIzquierda.Width, ImagenIzquierda.Height)

        For i = 0 To ImagenIzquierda.Width - 1  'Recorremos la matriz
            For j = 0 To ImagenIzquierda.Height - 1
                'Extraemos color rojo de la imagen de la izquierda y verde/azul de la derecha
                Rojo = ImagenIzquierda.GetPixel(i, j).R
                Verde = ImagenDerecha.GetPixel(i, j).G
                Azul = ImagenDerecha.GetPixel(i, j).B
                bmpSalida.SetPixel(i, j, Color.FromArgb(Rojo, Verde, Azul)) 'Asignamos a bmp los colores
            Next
        Next

        Return bmpSalida
End Function

Vamos a suponer que tenemos un formulario con 3 Picturebox y un botón.

Imagen del formulario.

Hacemos doble clic sobre el botón y agregamos el siguiente código.


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim bmpIzqui As Bitmap
        bmpIzqui = ExtraeVerdeAzul(PictureBox1.Image)

        Dim bmpDerecha As Bitmap
        bmpDerecha = ExtraeRojo(PictureBox2.Image)

        Dim ImagenAnaglifo As Bitmap
        ImagenAnaglifo = SumaImagenes(bmpIzqui, bmpDerecha)

        PictureBox3.Image = ImagenAnaglifo
End Sub

Ejecutamos la aplicación, pulsamos en el botón y crea el anaglifo.

Resultado final del anaglifo.

Descarga el código fuente:


4 comentarios:

  1. hola
    me han servido de mucha ayuda tus tutoriales

    pero tengo un problema con este efecto no me funciona.

    ResponderEliminar
  2. ¿Qué es lo que no te funciona en concreto?

    ResponderEliminar
  3. Descargue el ejemplo y lo probe, funciona de maravilla pero cuando cambio de imagen no funciona , la imagen se queda igual.

    Uso visual studio 2010 ultimate

    Otra cosa no tendras un codio para realizar un desenfoque gaussiono en vb.net o c#

    ResponderEliminar
  4. Pues yo cambio la imagen directamente en el Picturebox (eso sí, teniendo en cuenta que ambas imágenes deben tener el mismo tamaño), y me aplica bien la transformación.
    Lo probé utilizando VS 2012.
    Un saludo

    ResponderEliminar