![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
He logrado avanzar un poco...
Buenas, de lo que pude averiguar buscando en la gran red de redes, he podido encontrar la forma genérica de calcular el valor correspondiente a cada pixel de acuerdo a la dimensión.
Entiendo el algoritmo, y es como detallo a continuación: 1) Armar una imagen temporal de tamaño (kM x kN), siendo k el factor de ampliación. 2) Por cada pixel de la imagen original se debe colocar intercalando (k-1) ceros entre ellos hasta alcanzar el tamaño (kM x kN): Por ejemplo: 5-11 8-25 se transforma a (con k = 3) 5-0-0-11-0-0 0-0-0- 0-0-0 0-0-0- 0-0-0 8-0-0-25-0-0 0-0-0- 0-0-0 0-0-0- 0-0-0 Hasta allí barbaro, logro hacer dicho procedimiento... La cosa se complica al calcular los valores intermedios entre ellos, es decir los ceros. Si A y B son dos puntos originales de la imagen, cualquier k-1 puntos entre ellos (no diagonal) se determina: x = (i*A + j*B)/k ,i = k-1,..,1 j = 1..k-1 ,k >= 3 x = (A + B)/2 ,k >= 2 Mientras i va decrementado, j aumenta lo cual permite asignar valores intermedios entre A y B de modo tal que se produzca una transición suave entre ellos. Para rellenar estos valores, primero se calculan en las filas: 5-7-9-11-0-0 0-0-0-0-0-0 0-0-0-0-0-0 8-14-19-25-0-0 0-0-0-0-0-0 0-0-0-0-0-0 Luego se aplica sobre las columnas: 5-7-9-11-0-0 6-9-12-16-0-0 7-12-16-20-0-0 8-14-19-25-0-0 0-0-0-0-0-0 0-0-0-0-0-0 Los ceros restantes, toman el valor de la ultima columna, y fila: 5-7-9-11-11-11 6-9-12-16-16-16 7-12-16-20-20-20 8-14-19-25-25-25 8-14-19-25-25-25 8-14-19-25-25-25 Y alli termina el algoritmo. ¿Sencillo no? Pues, en palabras... pues me he quedado encerrado tratando de ver como lo puedo llevar a cabo. Mi algoritmo solo me ha llegado hasta intercalar los ceros. Lo siguiente no tengo idea de como hacerlo. Adjunto lo que logrado hacer. Si alguien puede darme un consejo de como proseguir se lo agradecería. Yo hasta el momento estaba empleando scanline(), para moverme entre los pixeles. Es rápido... pero estaba pensando que con pixels[] sería más sencillo... pero muy lento. No se.. escucho alternativas. saludos, |
|
#2
|
||||
|
||||
|
Una forma podría ser utilizar matrices. De hecho, es lo que usan los programas como potochop, The Gimp y similares. Intentaré explicarlo, a ver qué tal me sale.
Primero amplias la imagen por el método uno. Cita:
Después recorres la imagen ampliada (cuyo tamaño es, por ejemplo <w, h>) y, sumas los pesos de los puntos que rodean el pixel según indica la matriz. El pixel resultante es dicha suma dividido por el total de los pesos:
No he comprobado el código y lo he hecho de memoria, así que revísalo, en especial la parte de cálculo de coordenadas. De todas formas creo que se entiende lo que quiero hacer, ¿no? En resumidas cuentas se busca la media ponderada del color de los píxeles que rodean a uno dado. En cuanto a la velocidad, eso se lo dejo a otro, que mi neurona no da ya para más. ![]()
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi! - BAScript - Multi Language Scriptable Development Environment Última edición por Ñuño Martínez fecha: 11-01-2007 a las 14:05:43. Razón: El editor me jugó una mala pasada. |
|
#3
|
||||
|
||||
|
Hola Ñuño, estoy leyendo tu método, y si no leí mal se trata de agrandar y luego suavizar la imagen. Este método de aplicar una matriz para suavizar la imagen ya lo discutimos aquí, usando Scanline y todo
.Pero me queda la duda si quedara bien, si primero añades un montón de ceros y luego aplicas la matriz, lo unico que conseguirás es oscurecer la imagen ![]() |
|
#4
|
||||
|
||||
|
Cita:
Cita:
5-11 8-25 se transforma a (con k = 3) 5-5-5-11-11-11 5-5-5-11-11-11 5-5-5-11-11-11 8-8-8-25-25-25 8-8-8-25-25-25 8-8-8-25-25-25 Por otro lado, obtengo el valor del pixel de ImagenAmpliada pero el resultado lo guardo en ImagenFinal. Esto es importante para evitar pisar los datos. De todas formas, si llego a a saber que ya se habló de aplicar filtros a una imagen mediante matrices, me ahorro todo ese código y la mayor parte de las explicaciones .[edit] error en el código que puse: Olvidé poner un "PesoTotal := 0" antes del bucle interno. Ahora ya está bien.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi! - BAScript - Multi Language Scriptable Development Environment Última edición por Ñuño Martínez fecha: 11-01-2007 a las 13:58:28. |
|
#5
|
||||
|
||||
|
Cita:
Pues parece que si lo hice, yo entendía que agrandabas añadiendo ceros y luego suavizabas, cuando claramente (ahora que releo tu mensaje) veo que agrandas la imagen repitiendo los pixeles y luego suavizando. Este método ya me parece mucho mejor Una opción seria agrandar la imagen como siempre, usando la API de windows, que su métodos tendrá, y luego aplicar el suavizado. Aunque no se si el objetivo de Delphius es puramente teórico, es decir, quiere saber como agrandar, o practico, es decir, necesita agrandar una imagen dentro de su programa. Si es el primer caso no le quedara mas remedio que romperse la cabeza hasta encontrar el super algoritmo , si es lo segundo usar la API puede servir, o GDI+, o cualquier otra librería gráfica.Cita:
|
|
#6
|
||||
|
||||
|
gracias por ayudar
Cita:
!... se me complicó la cosa.Lamentablemente si necesito agrandar una imagen y tiene que ser código mio. Podría usar la API, la verdad es que no me fijé si había alguna... yo me estoy basando en un libro y de alli estoy sacando los elementos que voy necesitando, pues ya he presentado mis fuentes bibliográficas ante mis tutores (no puedo cambiarlas ahora). Por lo que no puedo hacer uso de librerias gráficas, el objetivo es que yo las implemente. Asi lo impuse yo para mi trabajo. Ahora me doy cuenta de que esto no era la papa (fàcil)... Y si... como dices: me tendré que romper el coco tratando de sacarle el algoritmo. Nuño: gracias por tu aporte. Ese algoritmo es relativamente sencillo. Es repetir... a ese lo tengo. Es por el otro método (interpolación lineal) el que me estoy dando golpes en la cabeza con el martillo que tengo al lado Como habrás notado el método por repetición es casi elemental pero sufre de una gran problema, cuanto más elevado sea el factor k, la imagen queda totalmente dibujada en bloques. El segundo método trata de evitar este efecto, pero claro... a niveles altos también falla: la imagen queda borrosa.Cita:
. Tuve que buscar en internet un largo rato para lograr darme cuenta de la dichosa fórmula. Si bien no la encontré explícitamente (pues yo la encontré a mano y papel![]() ![]() )* en ningún sitio... en todos me fueron dejando "pistas". Lástima, ninguno me advirtió de lo que seguía.![]() Gracias seoane, no es mi intención de que me hagas la tarea... en otro hilo tu ayuda vino bárbara. Yo prefiero una directrices, tips... Pero debo admitir de que si tu no hubieras puesto ese código, tal vez yo no hubiera avanzado mucho. * como dicen en Argentina: ¡me volví mono! Seguiré dandome golpes... a ver si no quedo loco antes .Gracias a ambos |
|
#7
|
||||
|
||||
|
No puedo, no me sale... no se como...
Buenas de nuevo. Disculpen por abrir de nuevo este hilo, pero la verdad es que este algoritmo me ha dejado sin cerebro... por más que lo piense... y lo piense... no logro encontrarle manera de codificarlo. Lo entiendo al algoritmo, pero en la práctica mi cerebro queda frito.
Lo he pensado incluso en papel para guiarme, en forma manual lo saco... Pero al momento de "traducirlo" empleando tanto Pixels[] como Scanline() no puedo, sinceramente, se me borra todo de mi mente... Este algoritmo me ha dejado mal parado... he podido continuar con otras partes de mi proyecto, pero lamentablemente he llegado a un punto en donde no puedo avanzar si no logro implementar al (disculpen mis palabras) maldito algoritmo de zoom por interpolación lineal. Si alguno puede darme alguna orientación le estaría muy agradecido. Muchas gracias, |
|
#8
|
||||
|
||||
|
Bueno, una primera aproximacion seria la siguiente:
Puede que tenga fallos, es solo una primera aproximación, además tiene que haber una solución mejor donde el Zoon no tenga que ser un numero entero. Todo se andará ... ![]() Última edición por seoane fecha: 26-01-2007 a las 18:54:22. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| ¿Crear email con imagen como parte del contenido del texto? | burasu | Varios | 6 | 07-04-2006 20:11:30 |
| Crear directorio con lista lineal | davitcito | Varios | 4 | 07-05-2005 08:20:01 |
| Programa que agrande una parte de la imagen | maravert | Gráficos | 0 | 05-08-2004 02:12:50 |
| Ampliar un campo en un dbgrid | hogol | Varios | 1 | 21-11-2003 17:02:40 |
|