RGB2GRAY HISTOGRAMA ECUALIZACIÓN DE HISTOGRAMA RGB2HSL
Enviado por otiqperes • 12 de Agosto de 2013 • 1.119 Palabras (5 Páginas) • 335 Visitas
INTRODUCCIÓN
Cuando se realiza el procesamiento de imágenes muchas veces se manejan dichas imágenes en tonos de grises, ya que como se ha manejado con anterioridad, esto permite que el procesamiento sea más rápido que si se trabaja con las tres capas de color. De igual modo, se ha dicho que la mayoría de quienes trabajan con visión artificial, no suelen manejar el procesamiento con el modelo RGB, por lo que en esta práctica se busca realizar el diseño de un programa de un modelo HSL.
La ecualización del histograma de una imagen es una transformación que pretende obtener para una imagen un histograma con una distribución uniforme.
El modelo HSL, que es similar a HSV o HSI, define un modelo de color en términos de sus componentes constituyentes. El modelo HSL se representa gráficamente como un cono doble o un doble hexágono. Los dos vértices en el modelo HSL se corresponden con el blanco y el negro, el ángulo se corresponde con el matiz, la distancia al eje con la saturación y la distancia al eje blanco-negro que corresponde a la luminancia. Como los modelos HSI y el HSV, es una deformación no lineal del espacio de color RGB.
El objetivo del reconocimiento de patrones es la clasificación de objetos en un cierto número de categorías o clases. Los dos enfoques en el reconocimiento de patrones han sido el estadístico (o teoría de la decisión) y el sintáctico.
En este trabajo se busca realizar el reconocimiento de figuras geométricas, para ello se realizó una detección de bordes, se encontró la firma del objeto y se llevó a cabo la clasificación.
La detección de bordes es una técnica de análisis digital que se puede aplicar a imágenes de muestras 2-D y 3-D. Un borde puede ser llamado como la frontera entre dos regiones diferentes en una imagen. Un borde puede ser el resultado de cambios en la absorción de la
luz (color/sombra), textura, etc., y en su forma más simple, puede ser identificado grabando los cambios en la intensidad de luz sobre un número de píxeles (procesamiento de escala de grises).
Después de detectar el borde y para llevar a cabo el proceso de la firma utilizamos otro método para ordenar los pixeles de manera adecuada, el cual es el código de la cadena.
Los códigos de la cadena se utilizan para representar un conjunto de puntos, que constituyen una línea recta o no. Para la definición del código de la cadena, se tiene en cuenta la localización de un pixel (i,j) y sus ocho vecinos en las direcciones cuantizadas de 45°.
Para cada borde se obtiene un código de la cadena comenzando en un extremo del mismo y terminando en el extremo opuesto.
La firma de la forma de un objeto es la representación funcional de su contorno. El proceso que se sigue consiste en extraer el objeto de la imagen, determinar su contorno y el centro de masa, luego se orienta su eje principal respecto al eje horizontal y se obtiene las coordenadas polares de cada punto del contorno del objeto, con estas y el método de interpolación cúbica se determina una matriz característica de la relación polar estandarizada a la que se denominará firma de objeto.
Esto es posible hacer para objetos de diferentes formas, de manera que a partir de las firmas se puede construir una base de datos de las formas de los objetos de interés. La
identificación de la forma de un objeto p uede realizarse comparado la firma del mismo con las firmas de los objetos pertenecientes a la base de datos mediante la operación de correlación.
RGB2GRAY
for (i=0;i<fil;i++)
{
for (j=0;j<col;j++)
{
//Se obtiene los valores del pixel en un punto i ,j
pixel.val[0]=((uchar *)(img->imageData+i*img->widthStep))[j*img->nChannels+0];
pixel.val[1]=((uchar *)(img->imageData+i*img->widthStep))[j*img->nChannels+1];
pixel.val[2]=((uchar *)(img->imageData+i*img->widthStep))[j*img->nChannels+2];
//operación para realizar la converción a grises
int salida=(pixel.val[2]*0.299) + (pixel.val[1]*0.541) +(pixel.val[0]*0.144);
//Asignación de los valores para la nueva imagen en grises
((uchar *)(gris->imageData+i*gris->widthStep))[j*gris->nChannels+0]=salida;
((uchar *)(gris->imageData+i*gris->widthStep))[j*gris->nChannels+1]=salida;
((uchar *)(gris->imageData+i*gris->widthStep))[j*gris->nChannels+2]=salida;
//Se obtiene el valor de gris para el histograma
pos= salida;
//Se guarda el número de grises
histo[pos]++;
}
}
Histograma
for (i=0;i<fil;i++)
{
for (j=0;j<col;j++)
{
//Se obtiene los valores del pixel en un punto i ,j
pixel.val[0]=((uchar *)(img->imageData+i*img->widthStep))[j*img->nChannels+0];
pixel.val[1]=((uchar *)(img->imageData+i*img->widthStep))[j*img->nChannels+1];
pixel.val[2]=((uchar *)(img->imageData+i*img->widthStep))[j*img->nChannels+2];
//operación para realizar la converción a grises
int salida=(pixel.val[2]*0.299) + (pixel.val[1]*0.541) +(pixel.val[0]*0.144);
//Asignación de los valores para la nueva imagen en grises
((uchar *)(gris->imageData+i*gris->widthStep))[j*gris->nChannels+0]=salida;
((uchar *)(gris->imageData+i*gris->widthStep))[j*gris->nChannels+1]=salida;
((uchar *)(gris->imageData+i*gris->widthStep))[j*gris->nChannels+2]=salida;
//Se obtiene el valor de gris para el histograma
pos= salida;
//Se guarda el número de grises
histo[pos]++;
}
}
int maximo=0;
int mini=0;
//Se obtiene la cantidad del gris que más abunda en la imagen
for (i=0;i<256;i++)
{
if (histo[i]>maximo)
{
maximo=histo[i];
}
}
//Se realiza una normalización para tener una altura máxima predefinida
for (i=0;i<256;i++)
{
histo[i]= (histo[i]*300)/maximo;
}
//Se crea el espacio para colocar una nueva imagen del histograma
IplImage*histograma=cvCreateImage(cvSize(256,300),8U,3);
cvSetZero(histograma);
for (i=0;i<256;i++)
{
//Se declaran coordenadas para crear rectangulos
xini=i;
yini=300-histo[i];
xfin=i+1;
yfin=300;
//Las barras del histograma se crean como reactangulos
cvRectangle(histograma,cvPoint(xini,yini),cvPoint(xfin,yfin),CV_RGB(i,i,200),1,8,0);
}
Para la ecualización de histograma se requiere obtener el histograma y para ello se realizó lo siguiente:
int area= fil*col;
float proba=0;;
IplImage*ehistograma=cvCreateImage(cvSize(256,300),8U,3);
...