Hoy vamos a ver cómo añadir algo de ruido a una imagen a través de la función Random que nos proporcionará número aleatorios (pseudoaleatorios). La función que veremos a continuación (RuidoProgresivo), recibe como parámetros, además de la imagen, el valor del ruido que se quiere generar. Este ruido se va a aplicar de la siguiente forma, por ejemplo, para un píxel que en su canal rojo tiene un valor de 24, y el parámetro que ha recibido la función como valor de ruido es 30, generará el nuevo valor de la siguiente forma.
- Genera un número aleatorio entre -30 y 30.
- Suma el valor del número generado al píxel correspondiente.
Public Function RuidoProgresivo(ByVal bmp As Bitmap, ByVal valorRuido As Integer, Optional RuidoGris As Boolean = False)
'Creamos un bitmap con el mismo tamaño que el original
'Este bitmap será el retorno de la función
Dim bmp3 As New Bitmap(bmp.Width, bmp.Height)
Dim rojo, verde, azul, alfa As Integer
'Inicializar la clase Random
Dim Random As New Random()
Dim ValorRandomRuido As Integer
'Recorremos la matriz (imagen)
For i = 0 To bmp.Width - 1
For j = 0 To bmp.Height - 1
ValorRandomRuido = Random.Next(-(valorRuido - 1), valorRuido + 1)
rojo = bmp.GetPixel(i, j).R + ValorRandomRuido
If RuidoGris = False Then
ValorRandomRuido = Random.Next(-(valorRuido - 1), valorRuido + 1)
End If
verde = bmp.GetPixel(i, j).G + ValorRandomRuido
If RuidoGris = False Then
ValorRandomRuido = Random.Next(-(valorRuido - 1), valorRuido + 1)
End If
azul = bmp.GetPixel(i, j).B + ValorRandomRuido
'Si hay valores mayores de 255 los pasamos a 255
'Si hay valores menores de 0 los pasamos a 0
If rojo < 0 Then rojo = 0
If rojo > 255 Then rojo = 255
If verde < 0 Then verde = 0
If verde > 255 Then verde = 255
If azul < 0 Then azul = 0
If azul > 255 Then azul = 255
'El canal alfa lo conservamos
alfa = bmp.GetPixel(i, j).A
'Pintamos bmp3 con los colores obtenidos
bmp3.SetPixel(i, j, Color.FromArgb(alfa, rojo, verde, azul))
Next
Next
'Retornas el bitmap con ruido
Return bmp3
End Function
Además de lo explicado, la función recibe también un parámetro llamado RuidoGris que en caso de ser True, hace que el valor generado aleatoriamente sea el mismo para los tres canales RGB, en caso contrario, se generarían 3 valores diferentes para los tres canales.
Ahora vamos a crear un formulario con una imagen, un botón, un checkbox y un scroll. El resultado del formulario sería el siguiente:
![]() |
| Formulario para aplicar ruido |
El código para el formulario sería el siguiente.
Dim bmpOriginal As Bitmap
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'Guardamos como bitmap el Picturebox
bmpOriginal = PictureBox1.Image
End Sub
'Aplicamos ruido
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'Si está marcado el checkbox aplicamos ruido en escala de grises
If chbGrises.Checked = True Then
PictureBox1.Image = RuidoProgresivo(bmpOriginal, HSruido.Value, True)
Else
PictureBox1.Image = RuidoProgresivo(bmpOriginal, HSruido.Value, False)
End If
End Sub
Private Sub HScrollBar1_Scroll(sender As Object, e As ScrollEventArgs) Handles HSruido.Scroll
'Actualizamos el valor del label
lblRuido.Text = HSruido.Value
End Sub
Lo único que hace es crear un Bitmap con la imagen del Picturebox en el load del formulario, y en el evento clic del botón botón llamar a la función para aplicar ruido a la imagen. El resultado después de ejecutar la aplicación y aplicar un ruido de 100 puntos y la opción de escala de grises marcada, sería así:
![]() |
| Imagen después de aplicar ruido |
Puedes descargar el código fuente aquí.


Hola puedes ayudarme, como podría hacer este efecto en java, y aplicarlo a un Jpanel?
ResponderEliminarHola. Revisa los post de java, y ahí te explica cómo leer los píxeles de una imagen. Una vez hecho esto, es simplemente aplicar el algoritmo.
ResponderEliminarSi no encuentras los post de tratamiento de imágenes en java, dímelo.
Un saludo
si ya lo resolví tome el programa que hiciste aquí y lo hice en java y me funciono, es solo que pregunte sin ponerme a analizar estos códigos de VB.NET, pero después de analizarlo comprendí lo que haces en el algoritmo y lo hice.
Eliminarhola una consulta. como seria el algoritmo para poder quitar el ruido a una imagen. gracias de antemano
ResponderEliminar