domingo, 25 de octubre de 2009

INSTALACION Y CONFIGURACION DE SERVIDOR PROXY PARA LINUX

Configuración Servidor Proxy para Linux

Introducción.

Servidor Proxy

Al traducirlo literalmente Proxy es como un delegado o apoderado es decir el que tiene el poder sobre otro, aplicado este concepto en redes es el servidor o dispositivo que permite realizar conexiones de red indirectas hacia otras redes.

Una aplicación común de los Servidores Proxy es funcionar como caché de contenido de Red (principalmente HTTP), proporcionando a los clientes un caché de páginas y archivos disponibles a través de la Red en servidores HTTP remotos, permitiendo a los clientes de la red local acceder hacia éstos de forma rápida y confiable. Los Servidores Proxy para contenido de Red también pueden actuar como filtros del contenido servido, aplicando políticas de censura de acuerdo a criterios arbitrarios.

Servicio Squid

Squid es un Servidor Proxy puede funcionar como Servidor Proxy y caché de contenido de Red para los protocolos HTTP, FTP, GOPHER y WAIS, Proxy de SSL, caché transparente, WWCP, aceleración HTTP, caché de consultas DNS y otras muchas más como filtración de contenido y control de acceso por IP y por usuario.

Versiones recomendadas

Para poder llevar al cabo los procedimientos descritos en este manual y documentos relacionados, usted necesitará tener instalado al menos lo siguiente:

SQUID 2.6.STABLE18

httpd-2.0.x (Apache), como auxiliar de caché con aceleración.

Todos los parches de seguridad disponibles para la versión del sistema operativo que esté utilizando. No es conveniente utilizar un sistema con posibles vulnerabilidades como Servidor Proxy.

Ubuntu 8.0.4

Instalación Squid

Para la instalación se debe seguir los siguientes pasos:

No se instala por defecto, pero se encuentra en los repositorios de Ubuntu, por lo que puede ser instalado a través de Synaptic, Aptitude o apt-get

1. Desde una ventana de terminal digite apt-get install squid

2. Abrir el archivo squid.conf con el comando gedit /etc/squid/squid.conf

3. Encontrar la línea: visible_hostname e ingresar el nombre hostname visible_hostname where

Configuración básica.

Squid utiliza el archivo de configuración localizado en /etc/squid/squid.conf, y podrá trabajar sobre este utilizando su editor de texto simple preferido. Existen un gran número de parámetros, de los cuales recomendamos configurar los siguientes:

http_port

cache_dir

Al menos una Lista de Control de Acceso

Al menos una Regla de Control de Acceso

Parámetro http_port:

El estándar indica que los Puertos Registrados (rango desde 1024 hasta 49151) recomendados para Servidores Proxy pueden ser el 3128 y 8080 a través de TCP.

De modo predefinido Squid utilizará el puerto 3128 para atender peticiones, sin embargo se puede especificar que lo haga en cualquier otro puerto disponible o bien que lo haga en varios puertos disponibles a la vez. No es recomendable configurar el servicio de Proxy transparente ya que se pierde el objetivo del servicio limitar el uso del Internet a los usuarios.

Para configurar el puerto del servicio editamos el archivo con la siguiente línea

#
#    You may specify multiple socket addresses on multiple lines.
#
# Default: http_port 3128
http_port 3128
http_port 8080

Si desea incrementar la seguridad, puede vincularse el servicio a una IP que solo se pueda acceder desde la red local. Considerando que el servidor utilizado posee una IP 192.168.1.254, puede hacerse lo siguiente:

#
#    You may specify multiple socket addresses on multiple lines.
#
# Default: http_port 3128
http_port 192.168.1.254:3128
http_port 192.168.1.254:8080

Parámetro cache_mem.

El parámetro cache_mem establece la cantidad ideal de memoria para lo siguiente:

Objetos en tránsito.

Objetos frecuentemente utilizados (Hot).

Objetos negativamente almacenados en el caché.

El parámetro cache_mem especifica un límite máximo en el tamaño total de bloques acomodados, donde los objetos en tránsito tienen mayor prioridad.

cache_mem 16 MB

Parámetro cache_dir:

Este parámetro se utiliza para establecer que tamaño se desea que tenga el caché en el disco duro para Squid, de modo tal que encontrará la siguiente línea:

cache_dir ufs /var/spool/squid 100 16 256

Se puede incrementar el tamaño del caché hasta donde lo desee el administrador. Mientras más grande sea el caché, más objetos se almacenarán en éste y por lo tanto se utilizará menos el ancho de banda. La siguiente línea establece un caché de 700 MB:

cache_dir ufs /var/spool/squid 700 16 256

Los números 16 y 256 significan que el directorio del caché contendrá 16 directorios subordinados con 256 niveles cada uno. No modifique esto números, no hay necesidad de hacerlo.

Controles de acceso.

Es necesario establecer Listas de Control de Acceso que definan una red o bien ciertas máquinas en particular. A cada lista se le asignará una Regla de Control de Acceso que permitirá o denegará el acceso a Squid

Listas de control de acceso.

Regularmente una lista de control de acceso se establece con la siguiente sintaxis:

acl [nombre de la lista] src [lo que compone a la lista]

Si se desea establecer una lista de control de acceso que abarque a toda la red local, basta definir la IP correspondiente a la red y la máscara de la sub-red. Por ejemplo, si se tiene una red donde las máquinas tienen direcciones IP 192.168.1.n con máscara de sub-red 255.255.255.0, podemos utilizar lo siguiente:

acl miredlocal src 192.168.1.0/255.255.255.0

También puede definirse una Lista de Control de Acceso especificando un archivo localizado en cualquier parte del disco duro, y la cual contiene una lista de direcciones IP. Ejemplo:

acl permitidos src "/etc/squid/permitidos"

El archivo /etc/squid/permitidos contendría algo como siguiente:

192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.15
192.168.1.16
192.168.1.20
192.168.1.40

Lo anterior estaría definiendo que la Lista de Control de Acceso denominada permitidos estaría compuesta por las direcciones IP incluidas en el archivo /etc/squid/permitidos.

Reglas de Control de Acceso.

Estas definen si se permite o no el acceso hacia Squid. Se aplican a las Listas de Control de Acceso. Deben colocarse en la sección de reglas de control de acceso definidas por el administrador, es decir, a partir de donde se localiza la siguiente leyenda:

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

La sintaxis básica es la siguiente:

http_access [deny o allow] [lista de control de acceso]

En el siguiente ejemplo consideramos una regla que establece acceso permitido a Squid a la Lista de Control de Acceso denominada permitidos:

http_access allow permitidos

También pueden definirse reglas valiéndose de la expresión !, la cual significa no. Pueden definirse, por ejemplo, dos listas de control de acceso, una denominada lista1 y otra denominada lista2, en la misma regla de control de acceso, en donde se asigna una expresión a una de estas. La siguiente establece que se permite el acceso a Squid a lo que comprenda lista1 excepto aquello que comprenda lista2:

http_access allow lista1 !lista2

Este tipo de reglas son útiles cuando se tiene un gran grupo de IP dentro de un rango de red al que se debe permitir acceso, y otro grupo dentro de la misma red al que se debe denegar el acceso.

Parámetro chache_mgr.

De modo predefinido, si algo ocurre con el caché, como por ejemplo que muera el procesos, se enviará un mensaje de aviso a la cuenta webmaster del servidor. Puede especificarse una distinta si acaso se considera conveniente.

Iniciando, reiniciando y añadiendo el servicio al arranque del sistema.

Una vez terminada la configuración, ejecute el siguiente mandato para iniciar por primera vez Squid:

service squid Star

Si necesita reiniciar para probar cambios hechos en la configuración, utilice lo siguiente:

service squid restart

Si desea que Squid inicie de manera automática la próxima vez que inicie el sistema, utilice lo siguiente:

chkconfig squid on

Lo anterior habilitará a Squid en todos los niveles de corrida.

Depuración de errores

Cualquier error al inicio de Squid solo significa que hubo errores de sintaxis, errores de dedo o bien se están citando incorrectamente las rutas hacia los archivos de las Listas de Control de Acceso.

Puede realizar diagnóstico de problemas indicándole a Squid que vuelva a leer configuración, lo cual devolverá los errores que existan en el archivo /etc/squid/squid.conf.

service squid reload

Cuando se trata de errores graves que no permiten iniciar el servicio, puede examinarse el contenido del archivo /var/log/squid/squid.out con el mandato less, more o cualquier otro visor de texto:

less /var/log/squid/squid.out

Listas de control de acceso: Bloqueo de Dominios de Destino.

Es conveniente definir una Lista de Control de Acceso especificando los dominios bloqueados en un archivo localizado en cualquier parte del disco duro, y la cual contiene una lista de los dominios:

acl bloqueados dstdomain "/etc/squid/bloqueados"

Por ejemplo: www.minegocio.com, www.google.com, www.yahoo.com

martes, 13 de octubre de 2009

Desarrollo web : PHP o ASP.NET

Introduccion:

Antes de empezar quiero decir que me declaro un ferviente admirador y seguidor de php, sobre todo con el giro que dio a Orientacion a objetos, esto hizo que el lenguaje sea mucho mas poderoso y profesional, ahora el objetivo de este blog, es dar pautas para las personas que estan pensando en incursionar en el apasionante mundo del desarrollo web, aun recuerdo los primeros pasos de las aplicaciones web cuando el html daba sus primero pasos y ya solo el hecho de tener diseñar un pagina web era un reto, ahora con el avance de la tecnologia web tenemos aplicaciones web sumamente poderosas que llegan a funcionar como si estuvieran instalada localmente en un PC gracias a la tecnologia AJAX, que no estan nueva que digamos , y que no es un invento de microsoft, sino que nace con el todo poderoso java, ahora incluso la conexion a bases de datos es algo tan normal en un website asi como librerias que ayudan a que el explorador se vuelve mas que un visor de paginas con bonitos colores, sino que se convierta en cliente de sistemas informaticos que apoyan a los objetivos de la empresa desde que cualquier lugar del mundo y desde cualquier sistema operativo e incluso desde cualquier dispositivo movil que tenga un explorador web... interesante no?.

Ventajas PHP5

- Facil y rapido de instalar.

- Automaticamente se configuran las opciones basicas, es decir te lo deja listo para programar.

- las aplicaciones contruidas con PHP son extremadamente ligeras

- Es el mejor medio educativo para dar los primeros pasos en POO y en el desarrollo web

- Hay full informacion en internet sobre el lenguaje como la pagina (http://www.phpclasses.org)

- Existen lilbrerias desarrolladas en PHP que permiten hacer cualquier cosa, hasta reconocimeinto de caracteres utilizando inteligencia artificial con redes competitivas.

- Tiene IDE's bastante buenos y robustos, como PHP designer.

- Obviamente es de uso Libre

Desventajas PHP5

- No existe un framework amigable para PHP (Desde mi punto de vista), he probado symphony , P4A , kumbia y todos ellos no tienen una interfaz grafica que te guie .

- Para agregarle funciones avanzadas como extensiones te va llevar lago de tiempo hasta investigar y editar los arhcivos de configuracion.

- Los IDE's no son integrados a un framework.

- EL desarrollo en PHP puede llegar hacer largo y complicado cuando utilizas arquitectura MVC con POO, es decir cuando haces desarrollo empresarial

- las configuraciones de seguridad en apache estan bajo tu total administracion, la mayoria de las instaladores de PHP y apache tipo wamp, xamp, y appserver, vienen seteados con seguridad baja, por lo que si haces un desarrollo para una empresa debes tomar en cuenta que necesitas tiemo para afinar la seguridad de tu servidor web.

- El sitio de PHP no brinda mayor ayuda, sobre el lenguaje, desde mi punto de vista suponen que eres experto en linux, por que aquellos pasos claves y basicos no te los explican.

- No tiene un debuger facil de implementar lo cual es escencial para un desarrollador, en mi humilde experiencia se que existen ,pero nunca he logrado activarlos son muy complicados,
insisto desde mi punto de vista.

- El codigo esta a la vista del cualquier perosna con acceso al servidor, por lo que te pueden meter mano en el codigo, e incluso obtener las claves de la acceso a la base de datos, todo eso tu lo tienes que controlar.

-La conexion a base de datos con my SQL es un juego de niños, pero si te toca interatuar con otras bases como informix u oracle si tendras que pasrte algunos dias investigado sobre el tema


Ventajas ASP.NET con c#

- Tiene un framework poderoso, facil de usar y super amigable.

- Su IDE esta integrado al farmework

- El debuger se configura y activa automaticamente, es decir despues de la instalacion esta listo para ser utilizado.

- Lo recomiendo cuando se desee construir un sistema web complicado con muchos modulos ya que te va hacer la vida mas facil al contruirlo y al dar mantenimiento.

- Te permite aplciar arquitectura MVC sin complicaciones.

- Su mantenimiento es claro no te pierdes en el codigo.

- Si lo instalas con vs Studio tendras un sin numero de librerias para utilizar en tu aplicacion, solo te relajas y construyes tu aplicacion web.

- Si deseas agregar funcionalidades adicionales a tu web, es cuestion de buscar las librerias en internet las encuentras en muchos sitios o tambien puedes buscar en la pagina de microsoft, y claro por ser microsoft vienen con sus wizards y ejemplos ( de nuevo te relajas y sigues construyendo tu sistema web)

- puedes compilar tu codigo delicado como dll's, es decir el Modelo y el controlador de tu sistema web, asi estas seguro que no sera legible por nadie mas, y solo tu vista queda legible.

- Si instalas asp.net con vs Studio adicionalmente tienes la posibilidad de crear proyectos para equipos mobiles con controles especificos para estos dispositivos, puedes crear webservices que pueden ser consumidos por cualquier plataforma incluso php.

- Los controles web vienen con templates modificables

-Al publicar tu aplicacion con el IIS por default el sito queda protegido puedo asegurar que es asi desde el framewor 2.0, incluso cuando hay errores en el runtime el servidor el envia al usuario una pagina de error estandard, es decir no le muestra el detalle de la exepcion, mientras que si navegas desde el servidor te dejara ver el error que provoco la caida de la aplicacion.

- Desde vs2005 puedes usar tecnologia AJAX solo arrastras y continuas construyendo tu aplicacion web

- Tienes la posibilidad de publicar tu sitio web generando un proyecto de instalacion web, esto le entregas al adminsitrador y con dos clics la aplicacion se instala donde debe estar, o puedes tambien publicar tu sitio desde el mismo visual studio seleccionando donde esta tu IIS en la red y el resto lo hace microsoft por ti.

-Puedes conectarte a cualquier base de datos con la misma facilidad, solo necesitas el driver del database y utilizar un libreria ODBC que viene por defecto con framework 2.0 en adelante.

Desventajas ASP.NET

- Claro como todo en la vida tanta maravilla tiene un precio, ASP.NET al venir con visual studio profesional tiene un precio, la licencia que activa al visual studio. lo bueno es que de ahi en adelante no le debes nada mas microsoft y puedes hacer las aplicaciones que quieras y distribuir a los clientes que desees sin ningun pago ni restriccion.

Hay tambien versiones de ASP.NET libres las puedes encontrar en http://www.asp.net/downloads/essential/, las cuales talvez no tengan todas las cosas que he descrito pero si la gran mayoria, incluso hay visual studio libre si deseas profundizar en entorno .NET.

- Para publicar tu sitio debes teber un servidor windows habilitado el IIS, debes pagar por la licencia del servidor windows pero no por IIS ni por los clientes que se contecten a tu web.

- No lo recomiendo para personas que estan dando sus primeros pasos en aplicaciones web, ya que al ser tan dinamico y facil de utilizar, no te permitira ver mas alla de lo evidente (sono como a leon O)y no tendras un conocimiento web solido lo cual te puede evitar de muchos dolores de cabeza cuando se presenten fallas en la aplicacion o en la contruccion de tu sistema web.

-Los sitios ocupan mas espacio en disco

Conclusiones:

En conclusion PHP5 como lo dije antes es un lenguaje poderoso con mucho futuro pero me parece que esta huerfano, la empresa que lo creo no le da la importancia que tiene, prueba de eso es el framework Zend es el mas complicado de utilizar y el menos amigable,y es creado por la casa de PHP, tambien es verdad que hay muy buenos intentos llenos de ganas y valentia para sacar adelante a PHP pero vienen de comunidades que obiamente no tienen los recursos como para desarrollar un "Visual Studio" para PHP, lo cual hace que pierda terreno frente a ASP.net, por lo tanto es logico que si vas a desarrollar una aplicacion web empresarial, desde mi punto de vista y por las horas de vuelo que llevo en le area debes utilizar ASP.net con C#, ahora si deseas desarrollar una aplicacion que no es complicada o si deseas aprender a desarrollar aplicaciones web como se debe, utiliza PHP5, pero sin ningun framework es mi consejo, solo asi te daras cuenta que hay atras de un framework y valoraras las herramientas que dispones para hacer tu aplicacion como javascript , CSS, el viejo html, y las utilizaras mejor cuando utilices un framework como el de ASP.net ya que en el fondo siguen utilizando la mismas herramientas.

domingo, 4 de octubre de 2009

VALE LA PENA PROTEGER ESPECIES ANIMALES

Hoy pasaron por la TV un documental del grupo Tierra, me dejo haciendo algunas reflexiones y talvez llegue un poco a comprender porque hay poblaciones donde se matan especies para fines comerciales, como todos sabemos hay muchas especies que estan en peligro de extinsion ya sea porque son cazadas descontroladamente o porque su medio ambiente esta desapareciendo, en cualquiera de estos casos hemos escuchado noticias que nos dejan el corazon chiquito al enterarnos de este comportamiento incrompresible de los humanos contra los animales, seguramente hemos pensado como es posible que una persona albergue tanta maldad tanta inconsiencia frente a una inminente desapracicion de especies que son importanes para el ecosistema y por ende para nuestra futura existencia... bueno hasta aqui creo que son palabras que todos hemos escuchado o sentido en algun momento, pero el reportaje que vi hoy justamente se hacia la siguiente pregunta y fue lo que cambio de cierta manera mi punto de vista frente a estas noticias tan desagradables, ¿Es dable gastar dinero protegiendo especies animales en peligro de existencion habieno tanta pobreza en el mundo?, se exponian casos de la india donde hay personas que mueren de inanicion, y en este pais se queria implementar un plan de proteccion animal con dinero del estado, y comentaba el experto en cuidado animal que es dificil hacer comprender a la autoridades la importancia de la proteccion animal y peor aun lograr que den parte de su presupuesto para el cuidado animal, incluso se han hecho campañas en los poblados donde se han dado estos hechos lamentables y la realidad que sea ha encontrado es que las personas lo hacen por que no tienen otra forma de llevar alimento a sus casas, explicarles de un futuro terrible para la humanidad sin animales queda sin piso pues tienen que pensar en el presente de sus familias..... y aqui hacian una reflexion mas tenaz, la conservacion de las especies en extinsion es un lujo de los paisas ricos de occiendente que no entiende la realidad de paises del tercer mundo?.... wow no.... me dejo sin palabras... me puse en un momento en los zapatos de esas personas, y hablo de los dueños de pequenas parcelas que después de todo un año de trabajo duro de toda la familia esperan recibir dinero para poder alimentarse, ahora si esa es mi realidad ... que haria yo si mi cosecha o mi ganado es asechado por alguna especie en exticion? o por mi pobreza es mas facil quemar la paja seca para poder sembrar mi cultivo mas rapido sin importarme que el habitat se alguna especie sea destrudido como sucede con el jabali enano....que haria para poder llevar un plato de comida a mis hijos.... depues de todo las personas que hacen estas cosas ya no parecen tan malvadas....lo hacen a veces por amor a sus familias pero que hacer al respecto cierto.... los cientificos respindieron a la pregunta que plantee al principio indicando que si vale la pena todo el dinero que pueda invertiri en preservar una especie animal en extinsion, pero que esta conservacion debe venir de la mano con el compromiso de los gobiernos de apoyar a los grupos mas vulnerables invirtiendo menos dinero en armas y en la guerra y mas en su poblacion y en el cuidado de sus especies animales.

Como conclusion puedo decir que no es bueno señalar o criticar el acto de una persona si no se tiene el conocimiento de todas las variables que entran en la ecuacion, y claro si estamos en posibilidad de tomar la decision de suspender alguna actividad que daña al planeta hagamoslo y si esta en nuestras manos dar soluciones alternativas de sustento economico ecologico a las pobalciones rurales alejadas de las grandes cuidades hagamoslo, cualquier cosa que hagamos hoy en pro del planeta sera para el beneficio de nuestras futuras generaciones.

viernes, 2 de octubre de 2009

INSTALANDO FIREWALL CON REDHAT E 5

Actualmente estoy empezando en mi trabajo un proyecto de instalacion de un firewall, gracias a nuestro super administrado de red elegimos red hat, se preguntan cual es el problema.. cierto, pues el problema es que soy nuevo en linux, he realizado algunos experimentos en la U con linux pero nada mas, esta es la primera vez que pondre un servidor linux en produccion y para colmo red hat, no conozco nada de este sistema operativo y he esuchado que es complejo su uso, todos los trabajos realizados anteriormente por mi persona en linux los he hecho con ubuntu me parece un buen sistema operativo y un buen intento de parecer un windows pero falta mucho para que lo llegue a reemplazar los usuarios desktop necesitamos algo mas facil de usar y productivo, es decir no tener que entrar a la famosa pantallita negra para arreglar el sonido del pc o esas cosas que hacen que linux sea para genios informaticos.

Bueno volviendo al tema el comienzo de la instalacion ha sido un poco traumatica, despues de luhcar con la configuracion RAID y con las particiones he logrado instalar el sistema operativo, pero cuando estaba a punto de cantar vicoria el sistema por momentos se volvia inestable, despues de pasar todo el dia de hoy revisando discos duros, particiones y configuraciones de RAID en linux he dado con la respuesta de la inestabilidad, tan solo tenia que acudir a la pagina del fabricante pero como buen informatico los manuales e intrucciones de instalacion se los utiliza cuando ya no sabemos que mas hacer, por que sera que somos mal llevados lo logico seria empezar por ahi no?, bueno resulta que el SERVIDOR DELL OPTIPLEX 7200 no es compatible con linux, segun lapagina de DELL el hardware solo es compatible con windows.... lo se malas noticias y mas aun se que se preguntan quien compro el equipo sin verificar eso... bueno gracias a Dios no fui yo, fue el encargado de infraestructura que cometio el error despues de una charla comprensiva con mi jefe y el super adminsitrador y su famosa frase yo te dije que revises eso primero, he aprendido mi primera leccion en linux...windows manda en compatibilidad con harware y si vas a instalar linux verifica que la maquina sea compatible.

miércoles, 18 de febrero de 2009

Ecualización del histograma de una imagen


La ecualización del histograma consiste, en una expansión del histograma de la imagen, dotando al mismo de mayor linealidad y haciendo que éste ocupe el ancho del espectro de tonalidades grises por completo


Ventajas


- Al ecualizar el histograma, vemos como los tonos que antes estaban más agrupados, ahora se han separado, ocupando todo el rango de grises, por lo que la imagen se está enriqueciendo al tener niveles de gris más distintos entre sí, mejorando, por tanto, la apariencia visual de la imagen.


- Un aumento del contraste: esta ventaja es consecuencia del punto anterior, ya que si hacemos que el histograma de la imagen ocupe todo el rango de grises, estamos aumentando la distancia entre el tono más claro y el más oscuro, convirtiendo a éstos, en blanco y negro y consecuentemente aumentando el contraste de la imagen.


- Constituye una regulación óptima y automática del contraste de la imagen. Evitando ajustes manuales que no llegan a localizar el equilibrio exacto en una imagen del blanco y el negro.


Desventajas


-Pérdida de información: puede ocurrir que a algunos pixeles que en la imagen original tenían distintos niveles de gris se les asigne, tras la ecualización global, al mismo nivel de gris. Por otro lado, hay casos en los que dos niveles de gris muy próximos se separen, dejando huecos en el histograma.


-Las bandas horizontales debido a una deficiente digitalización pueden resultar intensificadas, resaltando aún más este error indeseado.



A continuacion el codigo fuente en Java:

import ij.*;

import ij.process.*;

import ij.gui.*;

import java.awt.*;

import ij.plugin.filter.*;

public class Filtro_Equalizacion implements PlugInFilter

{ ImagePlus imp;
public int setup(String arg, ImagePlus imp)

{ this.imp = imp;

return DOES_ALL;

}
public void run(ImageProcessor ip)

{ int [] vec= ip.getHistogram();

int I=255;

for (int k=1; k<>

{

vec[k]=vec[k-1]+vec[k];

}
int w=ip.getWidth();

int h=ip.getHeight();

for(int i =0; i

for(int j= 0; j<=h;j++)

{

int img =(int)(ip.getPixel(i, j));

img=vec[img]*((I-1)/(i*j));

ip.putPixel(i,j,i,img);

}

}

}
}

Definicion de Contraste y Brillo

El contraste incrementa el cambio de luminosidad entre las zonas más oscuras o más claras de una fotografía, simulando a su vez, un mejor enfoque y claridad de imagen.El retoque del contraste es muy adecuado en fotografías un poco claras.

El contraste se define como la diferencia relativa en intensidad entre un punto de una imagen y sus alrededores.

Un ejemplo simple es el contraste entre un objeto de brillo constante sobre un fondo de un brillo constante. Si ambas superficies tienen el mismo brillo, el contraste será nulo, y el objeto tanto física como perceptivamente será indistinguible del fondo. Según se incrementa la diferencia en brillo el objeto será perceptivamente distinguible del fondo una vez alcanzado el umbral de contraste, que se sitúa alrededor del 0.3% de diferencia en brillo.

Calculo de contraste segun Michelson en imagenes periodicas simples



Donde CM es el contraste de Michelson, Lmax es el mayor valor de brillo de la imagen, y Lmin es el menor valor de brillo de la imagen.


A continuacion el codigo fuente en Java:

import ij.*;

import ij.process.*;

import ij.gui.*;

import java.awt.*;

import ij.plugin.filter.*;
public class Filter_Contraste implements PlugInFilter{

ImagePlus imp;
public int setup(String arg, ImagePlus imp)

{ this.imp = imp;

return DOES_8G;

}
public void run(ImageProcessor ip)

{ int w=ip.getWidth();

int n=ip.getHeight();

for(int i =0; i

for(int j= 0; j<=n;j++)

{

int p =ip.getPixel(i,j);

p = (int)(p*2+50);

if (p >255){

p=255;

}

ip.putPixel(i,j,p);

}

}

}
}


UMBRALIZACIÓN

Umbralizacion o binarizacion de Imagenes


Una imagen binaria es una imagen en la cual cada píxel puede tener solo uno de dos valores posibles 1 o 0. Cuando una imagen esta en esas condiciones es mucho mas fácil encontrar y distinguir características estructurales.


La forma mas común de generar imágenes binarias es mediante la utilización del valor umbral de una imagen a escala de grises; es decir se elige un valor limite (o bien un intervalo) a partir del cual todos los valores de intensidades mayores serán codificados como 1 mientras que los que estén por debajo serán codificados a cero.


Por ejemplo si de la imagen que se muestra a continuacion quisiera realizarse este tipo de operación de tal forma que los píxeles mayores a 128 sean considerados como 1 y los que son menores o iguales a 128 como cero




A continuacion el codigo fuente en Java:


import ij.*;

import ij.process.*;

import ij.gui.*;

import java.awt.*;

import ij.plugin.filter.*;
public class Filter_Umbralizacion1 implements PlugInFilter

{ ImagePlus imp;
public int setup(String arg, ImagePlus imp)

{ this.imp = imp;

return DOES_8G;

}
public void run(ImageProcessor ip) {

int w=ip.getWidth();

int n=ip.getHeight();

for(int i =0; i

for(int j= 0; j

int p =ip.getPixel(i,j);

//p = (int)(p*2+50);

if (p <50){

p=0;

}else if(p>=50){

p=255; }

ip.putPixel(i,j,p);

}

}

}
}


martes, 10 de febrero de 2009

UMBRALIZACIÓN

Técnica de segmentación (partición de la imagen en áreas con significado)
en imágenes con fondo uniforme y objetos a extraer



Tipos de Umbralización utilizando el histograma

–P-tile
–Modales
–Iterativos
–Adaptativos
–Variables

Codigo Fuente de funcion java:

import java.applet.*;
import java.awt.*;
import java.awt.Image.*;
import java.awt.event.*;
import java.awt.image.renderable.ParameterBlock;
import java.io.*;
import java.util.Hashtable;
import java.util.Vector;
import javax.media.jai.*;
import javax.media.jai.JAI;
import javax.media.jai.PlanarImage;
import javax.media.jai.Histogram;
import javax.media.jai.operator.HistogramDescriptor;
import javax.media.jai.RenderedOp;
import javax.media.jai.ROI;
import javax.media.jai.widget.ScrollingImagePanel;


public class umbralizacion extends Applet implements ItemListener, ActionListener{
//declaramos como variables globales todas las que deban ser accedidas por más de un método
public Choice menu;
private Button boton;
Image foto;
String fotoelegida;
int marcador,max1,max2,media1,media2 ;
int opciones[]=new int[7];
int cadena[]=new int[256];
//en el método init inicializamos la varible opciones y el entorno gráfico inicial
public void init() {
String eleccion;
for (int i=0; i<7; marcador="0;" eleccion="llaves" menu="new" fotoelegida="eleccion+" foto="getImage(getDocumentBase(),fotoelegida);" boton="new" fotoelegida="menu.getSelectedItem()+" foto="getImage(getDocumentBase(),fotoelegida);" marcador="menu.getSelectedIndex();//marcador" image1 =" JAI.create(" bins =" {256};" low =" {0.0D};" high =" {256.0D};" hist =" new" pb =" new" region =" null;" dst =" JAI.create(" hist =" (Histogram)" cadena =" hist.getBins(0);" max1="cadena[0];" media1="0;" media2="256;" max2="cadena[128];" i="0;">=max1) {
max1=cadena[i];
media1=i;
}

}

for (int j=128; j<>=max2) {
max2=cadena[j];
media2=j;
}

}

repaint(); //dibujamos en pantalla,la imagen elegida junto con su histograma

}

}

public void actionPerformed(ActionEvent e) {
//si se pulsa el botón Procesar imagen,realizamos la umbralización
RenderedOp image1 = JAI.create("fileload",fotoelegida);
int valor=opciones[marcador];//sólo realizamos el proceso si no lo hemos hecho antes
if (valor==0){
//declaramos las variables necesarias,teniendo en cuenta que el cambio de tipos
//numéricos en Java pasa por la creación de objetos numericos.
Integer mx1 = new Integer(max1);
Integer mx2 = new Integer(max2);
Integer m1 = new Integer(media1);
Integer m2 = new Integer(media2);
double vari1=0;
double vari2=0;
double vartemp1=0;
double vartemp2=0;
double f1;
double num;
double den1;
double f2;
double den2;
for ( int k=5; k<10;k++) ent =" new" f1="ent.doubleValue();" cad1 =" new" num=" Math.pow(f1,2.0F)/(-2.0F);" den1=" Math.log(cad1.doubleValue()/mx1.doubleValue());" vartemp1=" num/den1;" vari1="vari1+" cad2 =" new" den2=" Math.log(cad2.doubleValue()/mx2.doubleValue());" vartemp2=" num/den2;" vari2="vari2+" vari1="vari1/5;" vari2="vari2/5;" a="(0.5D/vari1-0.5D/vari2);" b="(m2.doubleValue()/vari2)-(m1.doubleValue()/vari1);" c="0.5D*(Math.pow(m1.doubleValue(),2.0F)/vari1)-0.5D*(Math.pow(m2.doubleValue(),2.0F)/vari2)+Math.log(mx2.doubleValue()/mx1.doubleValue());" u="(-1.0D*b" umbral=" new" bp =" new" procesada =" JAI.create(" ancho =" procesada.getWidth();" alto =" procesada.getHeight();" panel =" new" window =" new" max="1;//Para">max2) {
max=max1;
}
else {
max=max2;
}
g.drawRect( 349,49,2*257,402);
g.setColor(Color.white);
g.fillRect( 350,50,2*256,400 );
g.setColor(Color.black);
g.drawString("Histograma de "+ fotoelegida,370,440);
for ( int n=0; n<255;n++) {//representamos el histograma normalizado a su máximo
if (max!=0){
g.setColor( Color.black );
g.drawRect(350+n*2,400-(cadena[n]*350)/max,2,(cadena[n]*350)/max);
g.setColor(Color.blue);
g.fillRect(350+n*2,400-(cadena[n]*350)/max,1,(cadena[n]*350)/max-1);
}
}
}
}

miércoles, 28 de enero de 2009

Histogramas

Dada una imagen en niveles de grises, siendo el rango de 256 colores (de 0 a 255). El histograma de la imagen es en una gráfica en la que se muestra el número de píxeles de cada color que aparece en la imagen.



El análisis del histograma permite comparar contrastes e intensidades entre imágenes. El histograma podría ser alterado para producir cambios en la imagen.



Por ejemplo, el histograma es utilizado para binarizar una imagen digital, es decir, convertirla en una imagen en blanco y negro, de tal manera que se preserven las propiedades "esenciales" de la imagen. La forma usual de binarizar una imagen es eligiendo un valor adecuado u (valor umbral) dentro de los niveles de grises, tal que el histograma forme un "valle" en ese nivel. Todos los niveles de grises menores que u se convierten en 0 (negro), y los mayores que u se convierten en 255 (blanco).








El histograma de una imagen a color RGB consiste en tres gráficas siendo cada una el histograma de cada color primario







Código fuente en Matlab para Histograma


canalvideo=videoinput('winvideo',1);


preview(canalvideo);


frame=getsnapshot(canalvideo);


%image(frame);


delete(canalvideo);


prompt = {'Nombre:'};


title = 'ANALISIS CORNEAL';


lines = 1;


def = {'mi imagen'};


answer = inputdlg(prompt,title,lines,def);


assignin('base','imfile',answer{1});


imwrite(frame,strcat(answer{1},'.jpg'));


% guarda la imagen , se usa strcat %porque se van a introducir muchas imagenes, concatena el nombre con la%extension (primera vez) % %T=dir('*.jpg');


% a=imread(T.name);


otra OPCIONNNNNNNNNN %a=imread(strcat(answer{1},'.jpg'));


% lee % planeR=a( :, :,1);


% reconoce la intensidad del color rojo en la imagen% planeG=a( :, :,2);


% reconoce la intensidad del color verde en la imagen% planeB=a( :, :,3);


% reconoce la intensidad del color azul en la imagen% % imwrite(planeR,'plano1.jpg');


% imwrite(planeG,'plano2.jpg');


% EL COLOR AMARILLO SE OBTIENE ENTRE EL PLANO ROJO Y EL PLANO VERDE,QUE% CORRESPONDEN AL PLANO1 Y AL PLANO2, POR ESTO DEBEMOS HACER EL PLANO 3% OSEA EL AZUL EN NEGRO


martes, 20 de enero de 2009


Filtro de Media

De entre la multitud de máscaras de filtro paso bajo destaca especialmente la máscara de media, que es la que efectúa el promedio de los valores del entorno. El filtro espacial de media reemplaza el valor de un píxel por la media de los valores del punto y sus vecinos. Su efecto es el difuminado o suavizado de la imagen y se aplica junto con el de mediana para eliminar ruidos. Este filtro lo implementamos con la siguiente máscara para un tamaño 3x3:
1/9 1/9 1/9
1/9 1/9 1/9
1/9 1/9 1/9

Normalmente el tamaño de la máscara se toma en función de la cantidad de suavizado que queramos aplicar en cada momento. La visualización del resultado es el único medio de saber si hemos elegido el tamaño adecuado.

Se puede observar que el efecto final del filtro de la media es un suavizado de la imagen por reducción o redistribución del valor de los píxeles. Este filtro tiene el resultado opuesto a los de detección de bordes, donde el objetivo de los filtros es acentuar las diferencias, por esta razón el filtro de la media es un filtro paso bajo. También hay que notar que este filtro no modifica la imagen en las zonas donde el valor de los píxeles son el mismo, en oposición a los detectores de bordes que ponen estas regiones a cero.

En resumen, la media, como el resto de los filtros de suavizado, suaviza los contornos y otros detalles de forma de los objetos aparezcan menos definidos.

En este applet podemos observar los efectos de las diferentes máscaras de filtrado paso bajo que hemos visto y experimentar con filtros paso bajo propios, sólo tenemos que cumplir la condición de que todos los coeficientes han de ser positivos y sumar 1.


ALGORITMO DE FILTROS DE IMAGENES

ALGORITMO FILTRO DE LA MEDIANA

A
B=P;
n=5;
for i = 2:n-1,
for j = 2:n-1,
B(i,j)=(B(i-1,j)+B(i,j-1)+B(i,j)+B(i,j+1)+B(i+1,j))/5;
end;
end
B


ALGORITMO FILTRO DE LA MEDIA

=[25,25,25,25,25;25,35,45,128,25;25,45,35,35,25;25,45,35,35,25;25,25,25,25,25]
A=P;
n=5;
for i = 2:n-1,
for j = 2:n-1,
A(i,j)=(A(i-1,j-1)+A(i-1,j)+A(i-1,j+1)+A(i,j-1)+A(i,j)+A(i,j+1)+A(i+1,j-1)+A(i+1,j)+A(i+1,j+1))/9;
end;
end


Suavizado de imágenes con filtros no lineales.

Filtro de mediana



Una de las técnicas no lineales más utilizadas para el procesado de imágenes, en cuanto a la eliminación de ruido, es el filtrado de mediana. Esta técnica fue desarrollada por Tukey (1977) y Pratt (1978) a finales de los años setenta, y partió de la idea de conseguir un suavizado de imágenes y eliminación de ruido aplicando una técnica no lineal, pero de simple implementación.

Al ser un filtrado no lineal, hay que empezar destacando las diferencias entre un filtrado lineal y otro que no lo sea. En ambos casos, se ha de recorrer la imagen píxel a píxel, y operando con los píxeles cercanos para obtener un suavizado de la imagen, que reduzca el ruido. En el caso del filtrado lineal, la operación que se implementa es la convolución, en este caso bidimensional, de una matriz de píxeles con otra matriz de coeficientes, que define el comportamiento del filtro:

En el caso de un filtro no lineal la operación no es la convolución, sino que se le aplica algún algoritmo u operación a la matriz de píxeles. En el caso del filtrado de mediana, la operación es bien sencilla, y los efectos de suavizado son, en determinados casos, espectaculares.

La idea es que en un conjunto de píxeles cercanos, valores muy alejados del resto, serán valores que corresponden a píxeles ruidosos. La operación consiste en analizar una matriz de píxeles de N x N, y reemplazar el píxel central por el valor de la mediana de todos ellos. Y por supuesto repetir el algoritmo recorriendo toda la imagen.

Aplicando este método escogeremos, por razones obvias, ventanas de N x N con N impar, para tener bien diferenciado el píxel central. Tamaños habituales son ventanas de 3x3, de 5x5, y de hasta 7x7. Esto nos lleva a pensar en el hecho de la elección del tamaño de ventana como algo importante, puesto que un valor pequeño puede no eliminar bien el ruido, mientras que un valor demasiado alto es capaz de distorsionar la imagen. Para la elección de la ventana, en definitiva, no existe una regla fija, sino que se trata de escoger el orden que mejor resultados dé con una determinada imagen. En general, se suele decir que un tamaño de ventana es bueno si el número de píxeles ruidosos dentro de la ventana es menor que la mitad de píxeles de la ventana.