Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Obtener valor de los pixeles de una foto a escala de grises

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Obtener valor de los pixeles de una foto a escala de grises Responder citando

Hola, tengo fotos a color que obtengo el valor RGB de cada pixel con las funciones GetRValue,GetGValue y GetBValue, para hacer lo mismo pero con una imagen a escala de grises sabe alguien que funcion se utiliza, mil gracias
Volver arriba
Mensaje    Asunto: Responder citando

No se si entiendo bien tu pregunta, lo que quieres es "convertir" la imagen? Si no es esto, puedes explicar con mas detalle lo que necesitas, como lo estas haciendo y donde te falla ... ?

Si te vale como ejemplo, vamos a usar un TImage (Image1), carga en el una imagen .BMP en color, y con el siguiente código la convertimos a tonos de grises.

- En este ejemplo usamos la forma más lenta, la pongo porque creo que es más fácil de entender al leerla:
Código:
Graphics::TBitmap* bmp = Image1->Picture->Bitmap;

for (int y = 0; y < bmp->Height; y++)
{
  for (int x = 0; x < bmp->Width; x++)
  {
    // Obtenemos un pixel
    TColor color = bmp->Canvas->Pixels[x][y];
    int r = GetRValue(color);
    int g = GetGValue(color);
    int b = GetBValue(color);

    // Calculamos el tono de gris equivalente al color
    BYTE gris = 0.30 * r + 0.59 * g + 0.11 * b;

    // Y lo aplicamos
    color = static_cast<TColor>(RGB(gris, gris, gris));
    bmp->Canvas->Pixels[x][y] = color;
  }
}

- Y ahora una versión mucho más rápida usando "ScanLine" (si no sabes que es, puedes buscarlo en la ayuda) y optimizando el cálculo del tono de gris sin usar como flotante:
Código:
Graphics::TBitmap* bmp = Image1->Picture->Bitmap;

bmp->PixelFormat = pf24bit;
for (int y = 0; y < bmp->Height; y++)
{
  // Obtenemos un pixel
  RGBTRIPLE* p = static_cast<RGBTRIPLE*>(bmp->ScanLine[y]);
  for (int x = 0; x < bmp->Width; x++)
  {
    // Calculamos el tono de gris equivalente al color
    BYTE gris = HIBYTE(p->rgbtRed*77+p->rgbtGreen*151+p->rgbtBlue*28);
    // Y lo aplicamos
    p->rgbtRed   = gris;
    p->rgbtGreen = gris;
    p->rgbtBlue  = gris;
    ++p;
  }
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola Leo, gracias por tu respuesta, he probado con los dos códigos que has puesto, pero he observado que producen resultados diferentes, es decir, en el primer caso se me generan unos pixeles con unos valores determinados, y en el segundo otros pixeles con otros valores. Es importante que lea los pixeles correctos asi que,

¿Con qué código obtengo los pixeles a escala de grises correctos?, gracias por su amabilidad
Volver arriba
Mensaje    Asunto: Responder citando

La primera función es mas exacta, pero mucho mas lenta, la segunda es una versión optimizada, tiene menor precisión, pero aun así los valores que salen son muy próximos y muchas veces idénticos.

Para mejorar la velocidad puedes usar la segunda función, pero modificando la línea donde hace el calculo por el de la primera función.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

no se podria poner la imagen con en 8 bytes directamente y asi la tenemos en escala de grises?

bmp->PixelFormat = pf8bit; //¿?¿?¿?¿?
_________________
Jey U! I'm a Telecoman
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Si te refieres a la imagen final pues si, seria más simple para trabajar después con ella, pero si te refieres a la imagen de origen con más o con menos bits da igual, siempre tendrás que calcular.

Con que pongas esa línea al final ya se hace la reducción de la paleta.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

hombre, realmente de lo q se trataría (en mi casa) es de partir de, partiendo de una imagen secuencia de imágenes en "color verdadero", pasarlas a escala de grises para después obtener el valor de una región de pixeles y ver como "evoluciona" la intensidad en esa región de pixeles.

Por eso pensé q con hacer "Imagenoriginal->bmp->PixelFormat = pf8bit"
y trabajar con los pixeles de la iamgen original tras haberle hecho esta modifiación podría ser suficiente.

¿Qué opinas?


P.D. en vista de q hay 2 posts muy muy parecidos me he centrado en este pq creo q tiene más "sustancia" de donde aprender Wink
Volver arriba
Mensaje    Asunto: Responder citando

Anonymous escribió:
hombre, realmente de lo q se trataría (en mi caso) es de partir de, partiendo de una imagen secuencia de imágenes en "color verdadero", pasarlas a escala de grises para después obtener el valor de una región de pixeles y ver como "evoluciona" la intensidad en esa región de pixeles.

Por eso pensé q con hacer "Imagenoriginal->bmp->PixelFormat = pf8bit"
y trabajar con los pixeles de la iamgen original tras haberle hecho esta modifiación podría ser suficiente.

¿Qué opinan?


P.D. en vista de q hay 2 posts muy muy parecidos me he centrado en este pq creo q tiene más "sustancia" de donde aprender Wink
Volver arriba
Mensaje    Asunto: Responder citando

ups, perdon pero puse el post sin hacer login... depsués fui a editar sin haber hecho login... y miren como terminó. Perdón :$
_________________
Jey U! I'm a Telecoman
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.