Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Histograma en Delphi (https://www.clubdelphi.com/foros/showthread.php?t=46957)

Cesar Junior 14-08-2007 21:20:33

Histograma en Delphi
 
Ola a todos, estoy con un projecto en la uni, y tengo un gran problema para crear un Histograma de imagen (escala de gizes) en Delphi7, le cuestion es que entiendo mui bien el funcionamento del histograma, ya el problema esta en implementar en delphi, hora q soy un iniciante, si pudieran ayudarme les sere muy grato, obs.... disculpem por mi español q no es muy bueno ..jejeje:confused:

seoane 14-08-2007 21:28:57

Vamos por partes.

1. ¿La imagen esta en un archivo? ¿esta en un TImage? ¿es bmp, jpeg, ...?
2. ¿La imagen esta en color o en blanco y negro?
3. ¿El resultado lo necesitas en un array o lo quieres dibujar en una gráfica?

jhonny 14-08-2007 21:31:18

Bueno, Bienvenido¡¡¡ a este, el ClubDelphi, ya nos haz explicado que no escribes bien en español, pero de todas formas, debes explicarnos mejor lo que necesitas, mira tu dices:

Cita:

Empezado por Cesar Junior
le cuestion es que entiendo mui bien el funcionamento del histograma

Entonces cuentanos, ¿De que se trata el funcionamiento de dicho histograma?

cHackAll 14-08-2007 21:45:45

Será algo como ésto :confused::

Código Delphi [-]
procedure TForm1.FormPaint(Sender: TObject);
var Pos: Cardinal;
begin
 Pos := 256;
 with Canvas do
  repeat Dec(Pos);
   Pen.Color := RGB(Pos, Pos, Pos);
   MoveTo(Pos, 0);
   LineTo(Pos, 64);
  until Pos = 0;
end;

0j0: OnPaint

Cesar Junior 15-08-2007 01:35:57

Cita:

Empezado por jhonny (Mensaje 223039)
Bueno, Bienvenido¡¡¡ a este, el ClubDelphi, ya nos haz explicado que no escribes bien en español, pero de todas formas, debes explicarnos mejor lo que necesitas, mira tu dices:



Entonces cuentanos, ¿De que se trata el funcionamiento de dicho histograma?



Vemaos si me expresso mejor, los pixels varian de 0 a 255, siendo q 0 seria el pixel mas oscuro y el 255 ya llegando al blanco, queria barrer los pixels de la imagen guardando-los en un array, como quantos pixels de 0 y quntos de 145 i assi llegar hatsa el 255, despues de tener las contaje d de cada valor en un array crear un histograma, puede ser en un Tchart, para mostrar la equalizacion, la imagen le cargo en un TImage y es de tipo Btimap, haber si me entienden mejor, desde ja garto

Cesar Junior 15-08-2007 01:37:03

Cita:

Empezado por seoane (Mensaje 223037)
Vamos por partes.

1. ¿La imagen esta en un archivo? ¿esta en un TImage? ¿es bmp, jpeg, ...?
2. ¿La imagen esta en color o en blanco y negro?
3. ¿El resultado lo necesitas en un array o lo quieres dibujar en una gráfica?


sip, la imagen esta en un TImage y es del tipo Bitmap

Cesar Junior 15-08-2007 01:38:55

Cita:

Empezado por Cesar Junior (Mensaje 223112)
Vemaos si me expresso mejor, los pixels varian de 0 a 255, siendo q 0 seria el pixel mas oscuro y el 255 ya llegando al blanco, queria barrer los pixels de la imagen guardando-los en un array, como quantos pixels de 0 y quntos de 145 i assi llegar hatsa el 255, despues de tener las contaje d de cada valor en un array crear un histograma, puede ser en un Tchart, para mostrar la equalizacion, la imagen le cargo en un TImage y es de tipo Btimap, haber si me entienden mejor, desde ja garto

code:
pixels --> ocorrência
0 3
1 1
10 2
15 4

ae eh soh montar o gráfico
code:
ocorrencia
5|
4| |
3| | |
2| | | |
1| | | | |
0|_|_|______|________|____
0 1 10 15 pixel

seoane 15-08-2007 01:53:07

Podemos empezar por contar cuantos píxeles de cada color hay en la imagen:
Código Delphi [-]
var
  i,j: Integer;
  Histograma: Array[0..255] of Integer;
begin
  FillChar(Histograma,Sizeof(Histograma),#0);
  for j:= 0 to Image1.Picture.Bitmap.Height - 1 do
    for i:= 0 to Image1.Picture.Bitmap.Width - 1 do
      inc(Histograma[Image1.Picture.Bitmap.Canvas.Pixels[i,j] and $FF]);
end;

seoane 15-08-2007 02:06:04

Y para terminar podemos dibujar la gráfica en otro TImage con un ancho de 256 píxeles:
Código Delphi [-]
var
  i,j: Integer;
  Histograma: Array[0..255] of Integer;
begin
  FillChar(Histograma,Sizeof(Histograma),#0);
  for j:= 0 to Image1.Picture.Bitmap.Height - 1 do
    for i:= 0 to Image1.Picture.Bitmap.Width - 1 do
      inc(Histograma[Image1.Picture.Bitmap.Canvas.Pixels[i,j] and $FF]);

  j:= 1;
  for i:= 1 to 255 do
    if Histograma[i] > j then
      j:= Histograma[i];
  Image2.Canvas.FillRect(Image2.Canvas.ClipRect);
  for i:= 0 to 255 do
  begin
    Image2.Canvas.MoveTo(i,Image2.Height);
    Image2.Canvas.LineTo(i,Image2.Height - ((Image2.Height * Histograma[i]) div j));
  end;
end;

Cesar Junior 15-08-2007 04:01:52

Cita:

Empezado por seoane (Mensaje 223124)
Y para terminar podemos dibujar la gráfica en otro TImage con un ancho de 256 píxeles:

Código Delphi [-]
var
i,j: Integer;
Histograma: Array[0..255] of Integer;
begin
FillChar(Histograma,Sizeof(Histograma),#0);
for j:= 0 to Image1.Picture.Bitmap.Height - 1 do
for i:= 0 to Image1.Picture.Bitmap.Width - 1 do
inc(Histograma[Image1.Picture.Bitmap.Canvas.Pixels[i,j] and $FF]);

j:= 1;
for i:= 1 to 255 do
if Histograma[i] > j then
j:= Histograma[i];
Image2.Canvas.FillRect(Image2.Canvas.ClipRect);
for i:= 0 to 255 do
begin
Image2.Canvas.MoveTo(i,Image2.Height);
Image2.Canvas.LineTo(i,Image2.Height - ((Image2.Height * Histograma[i]) div j));
end;
end;






Amigo, muchas gracias por la ayuda!!!! ya tenia dias quebrando cabeza, te agardezco por ocupar tu tiempo ayudandome!!! quedo de maravilhas!!!


Valeu cara muito obrigado!!!:D

chinnamasta 05-07-2012 12:36:42

Gracias a mi también me funciono
 
hola muy buenos días después de estar mas de tres días de tratar de encontrar la manera de crear el histograma de una Timage que me lea el RGB por fin encontré en que es que estaba fallando jeje.


La franja horaria es GMT +2. Ahora son las 21:36:00.

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