Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-01-2005
bustio bustio is offline
Miembro
 
Registrado: oct 2003
Posts: 231
Poder: 23
bustio Va por buen camino
Respuesta a Mick

Hola:
Ante todo, debo agradecerte el tomarte el trabajo de responder a mi pregunta. Te dire que estoy trabajando en un Celeron P4 a 1.7GHz de velocidad, con 248 Mb de RAM y para una imagen de 28 Mb, con 4000 y tantos por 7000 y tantos pixeles se demora bastante... por encima de los 10 minutos, cosa que es indeseable. Estoy comparando mi histograma con el que trae implementado el Paint Shop Pro 9 y para la misma imagen solo se demora unos pocos segundos. Evidentemente, ellos hacen algun tipo de analiisis no solo mas rapido qeu el que yo hago, sino muchisimo mas eficiente. En pocas palabras, lo que hago es algo como esto:

creo una variable tipo Bitmap y luego le asigno la imagen leida desde el fichero que deseo analizar.
Luego, cuento los pixeles por filas y columnas y luego con un ciclo voy visitando pixel a pixel, y en ese momento y para el pixel(x,y) obtengo sus respectivos valores en la escala RGB y los almaceno en los arrays de los que ya te hable en mi pregunta. Pienso que la demora esta en el recorrido de la imagen, por que lo que resta es leer estos arrays y con LineTo... graficar los valores.
No se de que otra manera pudiera optimizar esto. En realidad, no me interesa tanto que el procesador este al 100% como que el calculo del histograma sea rapido. Pienso que se puede sacrificar un poco la congestion del micro con el fin de que este analisis sea rapido.

De cualquier manera, si crees ser capaz de ayudarme con el codigo, pues perfectamente te lo puedo enviar(si es que esto no viola las reglas del foro)para ver de qye manera se puede llegar a la solucion mas optima.
Te agradezco otra vez por tomarte el trabajo de responderme..

GRACIAS!!!
Responder Con Cita
  #2  
Antiguo 09-01-2005
<Sergio> <Sergio> is offline
Miembro
 
Registrado: sep 2004
Posts: 72
Poder: 22
<Sergio> Va por buen camino
Cita:
Empezado por bustio
creo una variable tipo Bitmap y luego le asigno la imagen leida desde el fichero que deseo analizar.
Luego, cuento los pixeles por filas y columnas y luego con un ciclo voy visitando pixel a pixel, y en ese momento y para el pixel(x,y) obtengo sus respectivos valores en la escala RGB
¿No estarás accediendo a la imagen con el pixels[], verdad?

P.D.

Si lo estás haciendo es mejor que utilices el scanline (muchísimo más rápido por varios motivos...), te devuelve una referencia a memoria al inicio de la linea "y".

Define un tipo de dato de acuerdo al tipo de formato de pixel, ej: arreglo de bytes para 24 bits: en bytes: 3*ancho de la imagen.

TLinea=array[0..64535] of byte;//el 64535 solo para el control de rangos del compilador, puede ser 0..0 si no controla rangos.
PLinea=^Tlinea;

Defines una variable del tipo PLinea y le asignas el valor que devuelve
bitmap.scanline(y) suponiendo que tienes un objeto bitmap:Tbitmap

Mucho cuidado de pasarse del ancho total en bytes de cada linea de tu imagen.

Otra forma es usar directamente la referencia a memoria, guardarla en un entero de 4 bytes mientero=integer(bitmap.scanline(y)), hacer un ciclo while e incrementar la posición de memoria a revisar y cuando sea necesario aclararle al compilador que quieres usar tu entero como referencia a memoria: mivalor:=byte(pointer(mientero)^), esto genera código más eficiente.

El pixels[x,y] está pensado para acceder a cualquier pixel de la imagen al azar: realiza control de rangos, llama al scanline por cada pixel y además que realiza conversión de color al formato utilizado por Tcolor. Llamar al scanline para cada pixel es bastante pesado comparado a llamarlo sólo para cada línea.

Última edición por <Sergio> fecha: 09-01-2005 a las 16:04:21.
Responder Con Cita
  #3  
Antiguo 10-01-2005
bustio bustio is offline
Miembro
 
Registrado: oct 2003
Posts: 231
Poder: 23
bustio Va por buen camino
Respondiendo ,,,,

Pues si Sergio, muchisimas gracias por responder a mi pregunta. En realidad si estoy usando Pixel[]..... fijate bien en mi pregunta original, que dije que estaba programando en C#. Puse esta pregunta en este foro de Delphi por que tambien programo bastante en Delphi y creo que este es uno de los mejores foros que existen,.... ademas, lo que andaba buscando es un algoritmo para optimizar mi tratamiento a las imagenes.
Aunque no he probado todavia, supongo que en C# tambien exista un ScanLines... y siendo asi pondre a prueba tu sugerencia, todo esta en que exista esa funcion o propiedad.
De todas maneras te agradezco mucho haberte tomado el trabajo de leerte mi pregunta y responder.

Saludos..

Lazaro Bustio Martinez.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 01:16:25.


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
Copyright 1996-2007 Club Delphi