La corrección de gamma es la responsable de la sensación de contraste de una imagen, y decimos sensación porque no es algo inherente a la imagen, sino a los dispositivos que la registran, a los dispositivos que la reproducen y a la luminosidad del entorno donde la estamos viendo.
En esta entrada vamos a explicar cómo aplicar corrección de gamma a una imagen en sus 3 canales RGB. Lo primero que vamos a mostrar es la función que hace esta corrección, y realmente lo que crea es una rampa de tonos con los diferentes canales.
Public Function Gamma(ByVal bmp As Bitmap, ByVal ValorGammaRojo As Double, ByVal ValorGammaVerde As Double, ByVal ValorGammaAzul As Double)
'Creamos un bitmap con el mismo tamaño que el bitmap recibido
Dim bmp3 As New Bitmap(bmp.Width, bmp.Height)
'Variables que almacenarán los colores modificados
Dim rojo, verde, azul, alfa As Byte
'Recorremos la matriz (imagen)
For i = 0 To bmp.Width - 1
For j = 0 To bmp.Height - 1
'Cambiamos la gamma creando una rampa de contraste
Rojo = CByte(Math.Min(255, CInt(Math.Truncate((255.0 * Math.Pow(bmp.GetPixel(i, j).R / 255.0, 1.0 / ValorGammaRojo)) + 0.5))))
Verde = CByte(Math.Min(255, CInt(Math.Truncate((255.0 * Math.Pow(bmp.GetPixel(i, j).G / 255.0, 1.0 / ValorGammaVerde)) + 0.5))))
Azul = CByte(Math.Min(255, CInt(Math.Truncate((255.0 * Math.Pow(bmp.GetPixel(i, j).B / 255.0, 1.0 / ValorGammaAzul)) + 0.5))))
alfa = bmp.GetPixel(i, j).A
'Asignamos a bmp los colores modificados
bmp3.SetPixel(i, j, Color.FromArgb(alfa, rojo, verde, azul))
Next
Next
Return bmp3
End Function
Como vemos, simplemente la función recibe los valores de corrección para cada canal RGB, y crea una escala para modificar la imagen. Cuando los valores son menores que 1, la imagen se hará más oscura, y en caso de ser mayores, la imagen se aclarará.
Ahora vamos a crear un formulario similar al que se muestra en la siguiente imagen:
![]() |
| Formulario corrección de gamma |
Y por último añadimos el siguiente código fuente.
Dim bmpOriginal As Bitmap
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'Establecemos la imagen del Picturebox como imagen original
bmpOriginal = PictureBox1.Image
End Sub
'Botón para aplicar la corrección
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
PictureBox1.Image = Gamma(bmpOriginal, HSRojo.Value / 100, HSVerde.Value / 100, HSAzul.Value / 100)
End Sub
Sub ScrollsVinculados(ByVal valor As Integer)
lblrojo.Text = valor / 100
HSRojo.Value = valor
lblverde.Text = valor / 100
HSVerde.Value = valor
lblazul.Text = valor / 100
HSAzul.Value = valor
End Sub
Private Sub HSAzul_Scroll(sender As Object, e As ScrollEventArgs) Handles HSAzul.Scroll
If chbVincular.Checked = True Then
ScrollsVinculados(HSAzul.Value)
Else
lblazul.Text = HSAzul.Value / 100
End If
End Sub
Private Sub HSVerde_Scroll(sender As Object, e As ScrollEventArgs) Handles HSVerde.Scroll
If chbVincular.Checked = True Then
ScrollsVinculados(HSVerde.Value)
Else
lblverde.Text = HSVerde.Value / 100
End If
End Sub
Private Sub HSRojo_Scroll(sender As Object, e As ScrollEventArgs) Handles HSRojo.Scroll
If chbVincular.Checked = True Then
ScrollsVinculados(HSRojo.Value)
Else
lblrojo.Text = HSRojo.Value / 100
End If
End Sub
Este código lo único que hace es crear en el load del formulario un bitmap que será pasado a la función (junto con los parámetros) en el evento clic del botón. Por último, la función ScrollsVinculados simplemente hace que los tres scrolls (junto con los labels), tengan el mismo valor.
El resultado después de aplicar una corrección de gamma de 0.45 para los tres canales, sería.
![]() |
| Imagen con corrección de gamma |
Más info aquí: http://ocw.usal.es/ensenanzas-tecnicas/herramientas-informaticas-para-el-geoprocesado
Descarga el código fuente:


como pones el codigo con ese estilo de letra?
ResponderEliminar