Visual C++ .NET - Aplicar máscara a una imagen

 
Vista:

Aplicar máscara a una imagen

Publicado por kayss (1 intervención) el 07/11/2007 09:36:32
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. Pero esto es muy lento.

Os muestro el código que he desarrollado por si es causa de que no está bien planteado:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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;
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Gracias, un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Optimización de aplicación de máscara en imágenes bitmap

Publicado por Alejandro (265 intervenciones) el 02/02/2024 18:55:31
Kayss, tu implementación actual puede beneficiarse de algunas optimizaciones. Aquí hay algunas sugerencias para mejorar la velocidad de aplicación de la máscara:

1. Utilizar aritmética de punteros:
En lugar de utilizar las funciones `GetPixel` y `SetPixel`, puedes acceder directamente a los datos de la imagen utilizando la aritmética de punteros. Esto puede ser más eficiente.

2. Reducir accesos repetitivos:
Minimiza el número de veces que accedes a las propiedades de los objetos `Bitmap` y `Array`. Puedes almacenar esos valores en variables para evitar cálculos repetitivos.

3. Vectorizar la aplicación de la máscara:
Intenta aplicar la máscara en bloques de píxeles utilizando operaciones vectorizadas en lugar de recorrer píxel por píxel. Esto puede mejorar significativamente el rendimiento.

Aquí hay un ejemplo que implementa algunas de estas sugerencias:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Bitmap^ AplicarMascara(Bitmap^ Imagen, array<double>^ Mascara, int Tamanio) {
    Bitmap^ ImagenFiltrada = gcnew Bitmap(Imagen->Width, Imagen->Height);
    int Margen = Tamanio / 2;
 
    for (int i = Margen; i < Imagen->Width - Margen; i++) {
        for (int j = Margen; j < Imagen->Height - Margen; j++) {
            double Sumatorio = 0;
 
            for (int k = 0; k < Tamanio; k++) {
                for (int q = 0; q < Tamanio; q++) {
                    int X = i + q - Margen;
                    int Y = j + k - Margen;
 
                    Sumatorio += Mascara[k * Tamanio + q] * Imagen->GetPixel(X, Y).R;
                }
            }
 
            int ValorPixel = static_cast<int>(Sumatorio);
            ValorPixel = Math::Min(255, Math::Max(0, ValorPixel)); // Asegurar que el valor está en el rango 0-255
            Color color = Color::FromArgb(ValorPixel, ValorPixel, ValorPixel);
            ImagenFiltrada->SetPixel(i, j, color);
        }
    }
 
    return ImagenFiltrada;
}

Además, asegúrate de que la máscara se ha definido correctamente y de que sus valores son válidos para el tamaño del kernel que estás utilizando. Estos ajustes deberían ayudar a mejorar la velocidad de aplicación de la máscara en tu código.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar