Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Histograma (https://www.clubdelphi.com/foros/showthread.php?t=15955)

javikanin 10-11-2004 18:02:35

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

franciscobucio 10-11-2004 18:55:37

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

javikanin 10-11-2004 18:58:43

Y como hago para pasar a escala de grises?Hay alguna funcion en Delphi que lo haga?

franciscobucio 10-11-2004 19:09:35

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

alvaroiba 10-11-2004 19:10:38

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;

javikanin 10-11-2004 19:14:44

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

alvaroiba 10-11-2004 19:18:56

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?

javikanin 10-11-2004 19:38:03

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

javikanin 10-11-2004 20:28:30

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

alvaroiba 10-11-2004 20:40:57

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.

javikanin 10-11-2004 20:54:26

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

alvaroiba 10-11-2004 21:10:01

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.

javikanin 10-11-2004 21:11:36

Ya lo habia probado, pero es que da una excepcion que se sale del programa

alvaroiba 10-11-2004 21:48:31

has creado las series en el chart?

debes de añadir una serie de tipo lineal.

javikanin 10-11-2004 21:56:20

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

Javi_bcn 21-12-2005 19:25:46

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!

bustio 02-01-2006 23:40:17

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.


La franja horaria es GMT +2. Ahora son las 08:11:03.

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