miércoles, 18 de febrero de 2009

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.