Programación General > Visual C++

 Aplicar Una Máscara A Una Imagen

(1/2) > >>

KAYSS:
Hola!

Alguno sabéis de una forma rápida de aplicar una máscara a una imagen en mapa de bits.

Yo primero creo la máscara (matriz nxn), recorro pixel a pixel la imagen, sitúo la máscara y recorro la máscara posición por posición para dicho pixel, y así con todos los demás pixels de la imagen.

Como os podeis imaginar esto tarda mucho en ejecutarse para una imagen de una resolución media.

Espero algunos sepais algún método más rápido


Saludos

diego.martinez:
hay un par de trucos para eso.

Si usas rgba para la matriz puedes decir que es una matriz de integers y asi aplicas la mascara de 4 en cuatro (o mas).

otras opciones son ya optimización del algoritmo, si posteas tu codigo podriamos mirar que se podria acelerar.

Por ejemplo, para las multiplicaciones de y*SizeX+x podrias precalcular en una matriz de n elementos las multiplicaciones y hacer Prec[y]+x

Otras opciones son usar bucles While (y--) empezando desde y=SizeY; ya que el bucle while hacia cero es mas rapido que un for estandard.

Hay truquillos de esos. Seguro que puedes encontrar formas de acelerar el codigo.

KAYSS:
Muchas gracias por la ayuda!!!

Supongo que en este caso me debería centrar más en optimización de código. Como no se exactamente a lo que te refieres exactamente en las opciones que me propones para optimizar el código, os muestro mi algoritmo y a ver si con el podemos hacer algo:


--- Código: Text --- Bitmap^ AplicarMascara(Bitmap ^Imagen, Array^ Mascara, int Tamanio){  Bitmap ^ImagenFiltrada=gcnew Bitmap (Imagen->Width, Imagen->Height);  int IncX, IncY, X, Y;  int TamanioNxN=Tamanio*Tamanio;  double Sumatorio;  Color color;   // Aplicamos la máscara para cada uno de los pixels de la imagen  for(int i=0; i<Imagen->Width; i++){    for (int j=0; j<Imagen->Height; j++){            IncY=Tamanio/2;      Sumatorio=0;       // Recorremos los valores de la máscara para aplicarlos a la imagen      for (int k=0; k<Tamanio; k++){                Y=j+IncY;        IncX=Tamanio/2;         for (int q=0; q<Tamanio; q++){          X=i+IncX;          if ((X>=0&&X<Imagen->Width) && (Y>=0&&Y<Imagen->Height))            Sumatorio=Sumatorio + Mascara->GetValue(Tamanio/2+IncX, Tamanio/2+IncY)) * Imagen->GetPixel(X,Y).R;           IncX--;        }         IncY--;      }            // El valor del pixel será el valor del sumatorio obtenido      color=Color::FromArgb(Sumatorio, Sumatorio, Sumatorio);      ImagenFiltrada->SetPixel(i, j, color);    }  }   return ImagenFiltrada;}  

Muchas gracias por todo.
Un saludo

Eternal Idol:
Viendo tu codigo me parece que este hilo esta mal ubicado y deberia ser movido al subforo de C#.

KAYSS:
Pero si es código en Windows Form de Visual Studio .Net?

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa