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-04-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Histograma. Obtener máximos y mínimos relativos

Buenas a todos...

Como dice la pregunta... alguien puede indicarme, si es tan amable, ¿como sería el algoritmo para obtener los máximos y mínimos relativos dado un histograma?

Verán... tengo este código, que se que no es muy eficiente:

Código Delphi [-]
PreviusUp := Histogram[MinValue];
          for j := (MinValue + 1) to MaxValue do
            begin
              if Histogram[j] > PreviusUp
                 then begin
                        with Valleys.Maximum do
                          begin
                            inc(Count);
                            SetLength(Value, Count);
                            if (j = (MinValue + 1))
                               then Value[Count - 1] := MinValue
                               else Value[Count - 1] := j;
                          end;
                       end
                 else begin
                        with Valleys.Minimum do
                          begin
                            inc(Count);
                            SetLength(Value, Count);
                            if (j = (MinValue + 1))
                               then Value[Count - 1] := MinValue
                               else Value[Count - 1] := j;
                          end;
                      end;
            end;

Siendo las estructuras de esta manera:

Código Delphi [-]
THistogram = array[0..MAX_RGB] of integer;

  {* Estructura de información asociada a valles *}
  TValleyInfo = record
    Count: integer;
    Value: TIntegerDynArray;
  end;

  {* Estructura asociada a Valles *}
  // Un valle está formado por una secuencia de Maximos y Mínimos
  TValley = record
    Count: integer;
    Maximum: TValleyInfo;
    Minimum: TValleyInfo;
  end;

Se que a el código le falta refinar....
Pero de acuerdo a mi lógica (que es muy probable de que esté errado) debería ir copiando en la estructura de maximum y minimum los valores posicionales del histograma que cumple con los máximos y mínimos dependiendo del valor anterior...

Pues, hago recorrer ambas estructuras y no pasa nada... es como si fuera que no encuentra ningún máximo o minimo:
Código Delphi [-]
ListBox1.Items.Add('--- Valles: ');
        smax := 'Maximos: ';
        smin := 'Minimos: ';
        for j := 0 to Channel[i].Valleys.Maximum.Count - 1 do
          begin
            valor := Channel[i].Valleys.Maximum.Value[j];
            smax := smax + IntToStr(valor) + ',';
          end;
        for j := 0 to Channel[i].Valleys.Minimum.Count - 1 do
          begin
            valor := Channel[i].Valleys.Minimum.Value[j];
            smin := smin + IntToStr(valor) + ',';
          end;

Llevo un tiempo tratando de averiguar donde está la falla... y ya no se por donde ver... aunque el código para obtener los valores no es el correcto... debería ir guardando algo... ¿?

Desde ya muchas gracias por tomarse su tiempo,
Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #2  
Antiguo 11-04-2007
Robert01 Robert01 is offline
Miembro
 
Registrado: feb 2006
Ubicación: Córdoba, Argentina
Posts: 895
Poder: 19
Robert01 Va por buen camino
Hola Delphius

Mirá este link

Está el código fuente de un programa que hace un histograma, aunque lo hace al abrir un archivo y leer te puede servir de algo.

A lo mejor en la página de la Facutad de Ciencias Agronómicas de la UNC pueda haber algo, ellos desarrollaron un programa que creo que se llama infostat en delphi.

Saludos
Responder Con Cita
  #3  
Antiguo 11-04-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Question A ver...

Muchas gracias Robert01 por ofrecer tu ayuda.
Lamento decirte que he mirado el código del link y la verdad es esa parte no me sirve de nada.
El problema no pasa por armar un histograma, a eso ya lo tengo hecho. La situación complicada para mi es que no se porqué motivo, razón o circunstancia, no está registrando en el vector dinámico los valores máximos y mínimos.

Si bien el código que expuse anteriormente no cumple con el cometido. Lo he realizado para comprobar si estaba funcionando el vector... y la verdad es que no funciona.

Lo curioso es que yo ya tengo implementado un vector dinámico similar a ese para llevar un registro de otras cosas y éste si funciona.

Envío las unidades para ver si alguien ve la luz.
Saludos,
Archivos Adjuntos
Tipo de Archivo: zip UHistogramOperation.zip (6,8 KB, 25 visitas)
Tipo de Archivo: zip UImageTypes.zip (3,3 KB, 17 visitas)
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #4  
Antiguo 11-04-2007
Robert01 Robert01 is offline
Miembro
 
Registrado: feb 2006
Ubicación: Córdoba, Argentina
Posts: 895
Poder: 19
Robert01 Va por buen camino
Cita:
Empezado por Delphius
El problema no pasa por armar un histograma, a eso ya lo tengo hecho. La situación complicada para mi es que no se porqué motivo, razón o circunstancia, no está registrando en el vector dinámico los valores máximos y mínimos.
Delphius ¿en ningún momento registra ningún valor? ¿No será que se registran y se borran en el siguiente ciclo del bucle?
Responder Con Cita
  #5  
Antiguo 15-04-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Question watch dice que no hay nada... F7 pasa las instrucciones...

Bueno, Robert01 estuve probando lo que tu comentabas, y la verdad no es que se "pisa" los datos con el paso siguiente.
De acuedo a las pruebas (paso a paso) que hice, el código se ejecuta.. la instrucción se realiza pero si observo con watch, se ve que no incrementa la cantidad ni pide la memoria adecuada, ni le asigna el valor...

Debería poder realizar esta parte:

Código Delphi [-]
in(Count);
SetLength(Value, Count);
Value[Count - 1] := 0;

La verdad es que me parece muy raro... si anteriormente a esta parte del código realiza el procedimiento similar para el almacenamiento de la moda (ver zip adjuntado en el post anterior) ¿Porqué no lo hace para los máximos y mínimos? Es un misterio...

No le veo error al código. Demasiado raro: que con F7 se ve que se ejecuta estas instrucciones, pero que en realidad no está incrementando el valor ni almacenando.... He probado moviendo el código un poco más arriba... he alterado el código de diversas formas, incluso la más absurda:
Código Delphi [-]
ImageInfo.Channel[k].Vallyes.Maximum.Count
ImageInfo.Channel[k]....
Y Nada... las instrucciones son realizadas... pero el watch dice otra cosa.

Si alguien ve el error, ¿me puede dar un buen zopapo (paliza) virtual?

Muchas gracias... por ayudarme Robert01.
Saludos
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #6  
Antiguo 15-04-2007
Robert01 Robert01 is offline
Miembro
 
Registrado: feb 2006
Ubicación: Córdoba, Argentina
Posts: 895
Poder: 19
Robert01 Va por buen camino
Delphius:

Yo hace un tiempo estaba probando un código y por un error que no se donde está no ejecutaba el bucle porque los índices permanecían en 0. según cual fuera el caso.

La primera vez que usaba el bucle andaba todo bien pero a la segunda vez que trataba de usar esa parte de código ocurría el error.
No se si había declarado las variables en forma inadecuada o que.

Yo lo que hice fue usar un bucle do while para ver lo que pasaba.

Saludos
Responder Con Cita
  #7  
Antiguo 16-04-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Soy un brujo...

Pues yo ya no se que hacer... no funciona... he probado haciendolo con while, for, Repeat... y nada... es como dices:
Cita:
Empezado por Robert01
los índices permanecían en 0.
El bucle (ya sea FOR, REPEAR, WHILE) se ejecuta... pero no cambia en nada los valores...

¡Brujería!

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #8  
Antiguo 16-04-2007
Robert01 Robert01 is offline
Miembro
 
Registrado: feb 2006
Ubicación: Córdoba, Argentina
Posts: 895
Poder: 19
Robert01 Va por buen camino
Delphius:

Así debería andar bien

Yo llamaba dos veces un procedure, el índice que permanecía en 0 era k, entonces hice algo así:

Código Delphi [-]
    if (sen1 = 0) then begin

        AlgSent :='ascendente';
        T1:=now;
        k:=1;
        while k <=1500 do begin
          randomize;
          for i:= 1 to ult do
            a[i]:=round(random*ult);

          insercion(a,prim,ult,sen1);
          T2:=now;
          k:=k+1;
        end;

      end

      else if (sen1=1) then begin

        AlgSent :='descendente';
        T1:=now;
        k:=1;
        while k <=1500 do begin
          randomize;
          for i:= 1 to ult do
            a[i]:=round(random*ult);
          insercion(a,prim,ult,sen1);
          T2:=now;
          k:=k+1;
        end;

      end;


i,k están declaradas como integer en el mismo formulario. Inserción es un procedure, no le hagas caso al mismo solo presta atención a la lógica a ver si te sirve.


A mi me solucionó el problema pero no se cual es el error que había cometido que tuve que aplicar esta solución qu eno me parece muy buena


Un saludo desde el aquelarre
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Requerimientos mínimos de Vista son muy mínimos vtdeleon La Taberna 2 20-02-2007 23:34:06
Histograma javikanin Varios 16 02-01-2006 23:40:17
Requerimientos minímos Alexander Varios 0 27-06-2005 15:45:36
Maximos Carlex SQL 1 03-02-2005 19:23:53
Graph Meter (histograma) cadena Gráficos 0 01-12-2004 19:29:23


La franja horaria es GMT +2. Ahora son las 02:49:15.


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