Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-11-2004
javikanin javikanin is offline
Miembro
 
Registrado: ago 2004
Posts: 21
Poder: 0
javikanin Va por buen camino
Histograma

Hola, estoy intentando hacer un histograma de una imagen, pero nose como hacerlo, porque nose que parametros pasarle para hacerlo. He instalado unas librerias para imagenes, MCM, pero no encuentro nada para usarlas. Sabe alguien como se usan, para que sirven? Y para hacer el histograma?

Muchas gracias
Responder Con Cita
  #2  
Antiguo 10-11-2004
franciscobucio franciscobucio is offline
Miembro
 
Registrado: oct 2004
Posts: 20
Poder: 0
franciscobucio Va por buen camino
hola,

Para que puedas hacer el histograma de una imagen primeramente necesitas tener la imagen en escala de grises (a menos que sea por color, pero la usual es a partir de una escala de grises).
Un algoritmo de fácil es promediar tus componentes RGB y obtienes el valor correspondiente en gris, una vez que hiciste lo anterior, ahora estás listo para obtener tu histograma. donde lo que haces es obtener la cantidad de tonos de gris (utilizas una tabla o arreglo de 0 a 255 posiciones) y lees cada pixel de la imagen e incrementas en 1 el valor de la posición de tu tabla, y así con todos los pixeles de la imagen.
Ejemplo tienes una imagen de 100x100pixeles. lees el primer pixel y su tono de gris es 125, entonces en la posición 125 de tu arreglo o tabla le incrementas en 1 al contenido. al final tendrás cuantos tonos de gris (0 a 255) existen en la imágen y ese es el histograma de una imagen.

Espero no haberte confundido.

Saludos
Responder Con Cita
  #3  
Antiguo 10-11-2004
javikanin javikanin is offline
Miembro
 
Registrado: ago 2004
Posts: 21
Poder: 0
javikanin Va por buen camino
Y como hago para pasar a escala de grises?Hay alguna funcion en Delphi que lo haga?
Responder Con Cita
  #4  
Antiguo 10-11-2004
franciscobucio franciscobucio is offline
Miembro
 
Registrado: oct 2004
Posts: 20
Poder: 0
franciscobucio Va por buen camino
Desconozco si la hay, yo he trabajado con el tratamiento de imagenes pero a través de Java y lo he hecho todo sin la utilización de algún método o componente.
Sería una buena opción que se hiciera desde delphi

Saludos
Responder Con Cita
  #5  
Antiguo 10-11-2004
alvaroiba alvaroiba is offline
Registrado
 
Registrado: nov 2004
Posts: 6
Poder: 0
alvaroiba Va por buen camino
procedure Histograma( const BitmapOriginal: TBitmap );
var
x, y: Integer;
G: Byte;
W,H: Integer;
Histograma: Array [0..255] of byte;
begin
if BitmapOriginal.PixelFormat = pf24bit then
begin
W := BitmapOriginal.Width;
H := BitmapOriginal.Height;

for y := 0 to H-1 do
begin
ptrOrig := BitmapOriginal.ScanLine[y];
for x := 0 to W-1 do
begin
G := ( ptrOrig[3*x] + ptrOrig[3*x+1] + ptrOrig[3*x+2] ) div 3;
inc( Histograma[G] );
end;
end;
Chart1.SeriesList[0].Clear;
Chart1.SeriesList[0].AddArray( Histograma );
end;
end;
Responder Con Cita
  #6  
Antiguo 10-11-2004
javikanin javikanin is offline
Miembro
 
Registrado: ago 2004
Posts: 21
Poder: 0
javikanin Va por buen camino
Muchas gracias por el codigo, y sobre todo por las molestias que os tomais. Lo entiendo bien, pero el problema es que lo que hago es cargar una imagen en un TImage, y a partir de ella es cuando hago el histograma. Como hago para que el bitmap sea el de la imagen?

Muchas gracias
Responder Con Cita
  #7  
Antiguo 10-11-2004
alvaroiba alvaroiba is offline
Registrado
 
Registrado: nov 2004
Posts: 6
Poder: 0
alvaroiba Va por buen camino
Le pasas a la función como parámetro Image.Picture.Bitmap pero primero has de haberla cargado de fichero con la funcion image.picture.loadfromfile o algo así.
Es para el trabajo? donde trabajas?
Responder Con Cita
  #8  
Antiguo 10-11-2004
javikanin javikanin is offline
Miembro
 
Registrado: ago 2004
Posts: 21
Poder: 0
javikanin Va por buen camino
Hola, pues es para un trabajo que me han pedido en la uni, y le keria meter el histograma. Una cosilla, la variable ptrOrig, como se declara?

Gracias
Responder Con Cita
  #9  
Antiguo 10-11-2004
javikanin javikanin is offline
Miembro
 
Registrado: ago 2004
Posts: 21
Poder: 0
javikanin Va por buen camino
Hola otra vez, ya me calcula el histograma segun el programa que me has dejado, pero no se que hace, porque calcula asi los valores. Me puedes echar una mano?

Gracias
Responder Con Cita
  #10  
Antiguo 10-11-2004
alvaroiba alvaroiba is offline
Registrado
 
Registrado: nov 2004
Posts: 6
Poder: 0
alvaroiba Va por buen camino
Claro que te puedo echar una mano, yo soy programador de visión artificial y todo esto lo domino basante bien.
La funcion que te he enviado a partir de un bitmap de tipo 24 bits por pixel, que suele ser de una imagen normal en color (8 bits para cada plano de color) extrae los valores RGB de cada pixel y hace una media de ellos para añadirlos a un array, después este array lo visualiza en un componente TChart. Dependiendo de la claridad de la imagen te saldrá un historgrama balanceado hacia su valor máximo o hacia su valor minimo. El histograma solo te informa de la proporción de claridad existente en la imagen.
Responder Con Cita
  #11  
Antiguo 10-11-2004
javikanin javikanin is offline
Miembro
 
Registrado: ago 2004
Posts: 21
Poder: 0
javikanin Va por buen camino
pues me sigue dando un error en esta linea
form1.Chart1.SeriesList[0].AddArray(Histograma);, me dice q no son compatibles, ya que el AddArray necesita pasarle un double. Osea que en esta linea de codigo G := (ptrOrig[3*x] + ptrOrig[3*x+1] + ptrOrig[3*x+2]) div 3; lo que hace es hacer una media del rojo verde y azul de cada pixel no?
Existen varios tipos de histogramas?

Gracias otra vez
Responder Con Cita
  #12  
Antiguo 10-11-2004
alvaroiba alvaroiba is offline
Registrado
 
Registrado: nov 2004
Posts: 6
Poder: 0
alvaroiba Va por buen camino
ah pues entonces muy facil, declara el array como array de doubles, y despues deberas cambiar la linea de inc(array) por array[x] := array[x]+1 y ya ta.
Responder Con Cita
  #13  
Antiguo 10-11-2004
javikanin javikanin is offline
Miembro
 
Registrado: ago 2004
Posts: 21
Poder: 0
javikanin Va por buen camino
Ya lo habia probado, pero es que da una excepcion que se sale del programa
Responder Con Cita
  #14  
Antiguo 10-11-2004
alvaroiba alvaroiba is offline
Registrado
 
Registrado: nov 2004
Posts: 6
Poder: 0
alvaroiba Va por buen camino
has creado las series en el chart?

debes de añadir una serie de tipo lineal.
Responder Con Cita
  #15  
Antiguo 10-11-2004
javikanin javikanin is offline
Miembro
 
Registrado: ago 2004
Posts: 21
Poder: 0
javikanin Va por buen camino
Si que tengo creada una serie, pero me sigue dando el mismo error. Hago doble click sobre el chart, y me salen las opciones, y ahi esta la serie
Responder Con Cita
  #16  
Antiguo 21-12-2005
Javi_bcn Javi_bcn is offline
Registrado
 
Registrado: dic 2005
Posts: 1
Poder: 0
Javi_bcn Va por buen camino
Yo tambien quiero saber como se hace el histograma

Hola, yo tambien necesito saber como se hace el histograma de una imgen, y también me sería util saber como se ecualiza....
He intentado lo que poneis más arriba pero no hay manera... no tengo muchas nociones en esto y lo necesito para un trabajo..
Yo lo estaba haciendo de la siguiente manera pero sé que esta bastante mal, por no decir muy mal:

Procedure Mostrar_histograma(Image2:TImage;var Histograma:THist);
var
Histo:THistograma;
x,y:Integer;
w,h:Integer;
r,g,b:integer;
BM:TBitmap;
color2:Integer;
begin
BM:= TBitmap.Create;
BM.Height:=256;
BM.Width:=256;
BM.PixelFormat:=pf24bit;
Image3.Picture.Assign(BM);
BM.Free;
w:=Image1.Picture.Width;
h:=Image1.Picture.Height;
for y:=0 to h do
for x:= 1 to w do
begin
LlegirPixelRGB(Image2,X,Y,r,g,b);
color2:=(r+g+b) div 3;
Histo[color2]:= Histo[color2]+1;
r:=color2;
g:=color2;
b:=color2;
EscriurePixelRGB(Image3,X,Y,R,G,B);
end;
end;
no se si me podreis ayudar en algo, de todas formas gracias a todos de antemano.
un saludo!
Responder Con Cita
  #17  
Antiguo 02-01-2006
bustio bustio is offline
Miembro
 
Registrado: oct 2003
Posts: 231
Poder: 21
bustio Va por buen camino
Cool Mas del histograma

Hola a todos:

Yo tambien ando interesado en el temilla del histograma. Me encontre un codigo que lo hace bastante bien para delphi buscando por ahi que si lo desean, lo puedo compartir con uds. Pero esa no es la solucion,,, "Si le das un pez a un hambriento hoy ya no tendra hambre... si lo ensennas a pescar jamas la tendra". Yo hice uno en C# que funciona bastante bien.. pero en sus inicios tenia problemas con el tiempo en que se demoraba calculandolo para imagenes grandes, y lo resolvi trabajando la imagen en vez de como una imagen como un fichero. Es decir, que en vez de cargar la imagen en un TBITMAp trabaje la imagen.bmp como un fichero, leyendo el encabezamiento y el del area de datos saque los datos que necesito.
Para una imagen de 250Mb me demore en un P4 a 2.4Gb solo 7 segundos; lo cual me parece un buen tiempo.

Solo queria hacer esta ackaracion que tal vez les resulte util... a mi me hubiese sido de muchisima utilidad que me hubiesen sugerido esto.. me habria ahorrado miles de problemas!!! Me gustaria ver los codigos que hayan logrado.. si es qe pueden compartirlos conmigo.
__________________
Muchas Gracias...
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 19:32:27.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi