En esta entrada vamos a ver una sencilla forma de modificar el contraste de una imagen, obteniendo muy buenos resultados. Al modificar el contraste de una imagen lo que se hace realmente es ensanchar o contraer el histograma de la imagen. Viendo un ejemplo se verá de forma más clara.
Histogramas |
En la parte superior se muestra la imagen original con su correspondiente histograma, justo debajo la misma imagen después de haber aumentado el contraste, y por último se muestra la imagen después de haber disminuido el contraste. Como puede observarse, las diferencias en el histograma son claras, ya que cuando se aumenta el contraste, se estira el histograma abarcando más tonos de gris, en cambio cuando se disminuye, el histograma está más comprimido.
Ahora vamos a ver la función que modificará el contraste:
'Función que modifica el contraste de una imagen Public Function Contraste(ByVal bmp As Bitmap, ByVal valorContraste As Double) As Bitmap 'Creamos un bitmap con las dimensiones del bitmap recibido Dim bmpResultado As New Bitmap(bmp.Width, bmp.Height) Dim Rojo, Verde, Azul, alfa As Byte Dim Rojoaxu, Verdeaux, Azulaux As Double Dim calculo, calculoAux As Double 'Con esto hacemos que si recibimos 0 (valorcontraste) no haya modificación en la imagen calculoAux = (1 / ((Math.PI) / 4)) 'Pi/4 calculo = (valorContraste + 1) * (Math.PI / 4) calculo *= calculoAux For i = 0 To bmp.Width - 1 'Recorremos la matriz For j = 0 To bmp.Height - 1 'obtenemos el valor del píxel actual con GetPixel y le aplicamos la transformación Rojoaxu = ((bmp.GetPixel(i, j).R - 128) * calculo) + 128 Verdeaux = ((bmp.GetPixel(i, j).G - 128) * calculo) + 128 Azulaux = ((bmp.GetPixel(i, j).B - 128) * calculo) + 128 'Eliminamos valores mayores de 255 If Rojoaxu > 255 Then Rojoaxu = 255 If Verdeaux > 255 Then Verdeaux = 255 If Azulaux > 255 Then Azulaux = 255 'Eliminamos valores menores de 0 If Rojoaxu < 0 Then Rojoaxu = 0 If Verdeaux < 0 Then Verdeaux = 0 If Azulaux < 0 Then Azulaux = 0 'ASignamos el resultado a las variables rojo, verde, azul Rojo = Rojoaxu Verde = Verdeaux Azul = Azulaux 'El canal alfa no lo modificamos alfa = bmp.GetPixel(i, j).A 'Almacenamos los valores obtenidos en un bitmap bmpResultado.SetPixel(i, j, Color.FromArgb(alfa, Rojo, Verde, Azul)) Next Next 'Devolvemos el bitmap transformado Return bmpResultado End Function
La función como vemos es muy sencilla, ahora vamos a crear un formulario como el que se observa en la siguiente imagen.
Formulario para modificar contraste |
Por último, vamos a mostrar el código fuente asociado al Load del formulario, al HScrollbar y al botón.
Dim bmp As Bitmap 'Variable que almacenará el contenido del Picturebox 'Carga incial del formulario Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'Almacenamos como bitmap la imagen bmp = PictureBox1.Image End Sub 'Actualizamos el valor del label Private Sub HScrollBar1_Scroll(sender As Object, e As ScrollEventArgs) Handles HSvalor.Scroll lblValor.Text = HSvalor.Value / 100 End Sub 'Modificar contraste Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 'Asigamos al picturebox la imagen transformada 'El valor del Hscrollbar se divide entre 100 para que esté entre -1 y 1 PictureBox1.Image = Contraste(bmp, HSvalor.Value / 100) End Sub
Todo el proceso es muy sencillo y los resultados a la hora de aumentar el contraste son bastante buenos.
Podéis descargar la aplicación desde aquí:
Más info en http://ocw.usal.es/ensenanzas-tecnicas/herramientas-informaticas-para-el-geoprocesado
No hay comentarios:
Publicar un comentario