| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Fede Bahon Invitado
|
Publicado: Mar 05 Abr, 2005 12:36 pm Asunto: Obtener valor de los pixeles de una foto a escala de grises |
|
|
| 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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 27 Abr, 2005 11:06 pm Asunto: |
|
|
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 |
|
 |
Fede_Bahon Invitado
|
Publicado: Jue 28 Abr, 2005 9:40 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 28 Abr, 2005 10:17 pm Asunto: |
|
|
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 |
|
 |
Eaco Lt JG

Registrado: 04 Nov 2004Mensajes: 58Ubicación: Las Palmas de Gran Canaria-Islas Canarias
|
Publicado: Lun 02 May, 2005 1:56 am Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 02 May, 2005 3:19 am Asunto: |
|
|
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 |
|
 |
Invitado
|
Publicado: Lun 02 May, 2005 11:39 am Asunto: |
|
|
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  |
|
| Volver arriba |
|
 |
Invitado
|
Publicado: Lun 02 May, 2005 11:40 am Asunto: |
|
|
| 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  |
|
|
| Volver arriba |
|
 |
Eaco Lt JG

Registrado: 04 Nov 2004Mensajes: 58Ubicación: Las Palmas de Gran Canaria-Islas Canarias
|
Publicado: Lun 02 May, 2005 11:43 am Asunto: |
|
|
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 |
|
 |
|