Programación General > Visual C++
Convertir Una Imagen Rgb A Escala De Grises
KAYSS:
He encontrado una solución pero es muy lenta (3, 4 seg en procesarla), a ver si me podéis decir otra o una modificación de esta más rápida:
double bn;
Color color, ColorBN;
for(int i=0; i<Imagen->Width; i++){
for (int j=0; j<Imagen->Height; j++){
color=Imagen->GetPixel(i,j);
bn=(double) ((color.R*30)+(color.G*59)+ (color.B*11));
ColorBN=Color::FromArgb(bn,bn,bn);
ImagenBN->SetPixel(i,j,ColorBN);
}
}
this->PictureBoxImagen->Image=this->ImagenBN;
Saludos, kayss
gatiori:
Bueno, yo no conosco mucho de programación, pero segun entiendo que para la escala de grises se deben promediar los valores de R, G y B o sea ( R + G + B ) / 3
Esta linea no la entiendo: bn=(double) ((color.R*30)+(color.G*59)+ (color.B*11));
... es decir por qué multiplicar por 30 para el rojo, 59 para el verde y 11 para el azul?
creo que sería así:
bn = ( color.R + color.G + color.B ) / 3
... pero mejor dejemos que alguien que sepa másn nos explique... no?
Eternal Idol:
Se hicieron estudios y se demostro que: To convert any color to its most approximate level of gray, first one must obtain the values of its red, green and blue (RGB) primaries.
Then it is sufficient to add 30% of the red value plus 59% of that of the green plus 11% of that of the blue, no matter whatever scale is employed. The resultant level is the desired gray value. These percentages are chosen due to the different relative sensitivity of the normal human eye to each of the primary colors (higher to the green, lower to the blue).
Desde Wikipedia.
Igual NO es blanco y negro, son 256 (de 0 a 255) colores (grises) diferentes y en realidad el codigo deberia ser asi:
--- Código: Text ---bn=(double) ((color.R*0.3)+(color.G*0.59)+ (color.B*0.11));
O deberias dividir por 100 el resultado final en tu codigo ya que sino el valor de bn nunca estara entre 0 y 255, y sera invalido:
Color.FromArgb (Int32, Int32, Int32): Creates a Color structure from the specified 8-bit color values (red, green, and blue). The alpha value is implicitly 255 (fully opaque). Although this method allows a 32-bit value to be passed for each color component, the value of each component is limited to 8 bits.
De la MSDN.
Es muy probable que el cuello de botella este en GetPixel y SetPixel.
drd:
No has pensado en usar alguna biblioteca de tratamiento de imágenes, como openCV, CImage y cosas así, esas operaciones las hacen muy rápido, aunque claro, tienes que usar en memoria su formato de imagen, supongo que a lo mejor te puedes meter en las tripas a ver que hacen, aunque yo no me atrevería.
Un saludo.
Eternal Idol:
--- Cita de: "drd" --- No has pensado en usar alguna biblioteca de tratamiento de imágenes, como openCV, CImage y cosas así, esas operaciones las hacen muy rápido, aunque claro, tienes que usar en memoria su formato de imagen, supongo que a lo mejor te puedes meter en las tripas a ver que hacen, aunque yo no me atrevería.
--- Fin de la cita ---
Pasar una imagen de RGB a escala de grises es algo muy simple, incluso usando el promedio (como dijo gatiori) se obtiene un resultado cercano al esperado.
Navegación
[#] Página Siguiente
Ir a la versión completa