Sin categoría

Procesamiento de imágenes, estiramiento lineal y openCV

Procesamiento de imágenes, estiramiento lineal y openCV

En un intento de reconocer objetos examinando imágenes, se aplican varias técnicas de procesamiento y análisis de imágenes. Este artículo describe brevemente el algoritmo de estiramiento lineal y su uso en OpenCV.

La técnica de estiramiento lineal se puede aplicar a las imágenes donde la falta sustancial de contraste puede resultar en una identificación falsa de los objetos, su relación espacial y su importancia. La mejora del contraste por estiramiento lineal se puede aplicar a imágenes con variaciones muy bajas o muy altas de brillo. Para aplicar el algoritmo de estiramiento lineal, una imagen debe convertirse en escala gris y los píxeles de 8 bits y sus valores se registran en histograma.

El histograma contendrá los 256 niveles grises (0 - 255) en los llamados contenedores y cada valor de píxel tendrá lugar en el contenedor representado con su propio valor. Cuando se crea el histograma y la imagen, se identifican los valores máximo (OMAX) y mínimo (omina).

El estiramiento lineal se aplica al histograma de la siguiente manera:

La fórmula anterior puede representarse mediante la versión simplificada del código C ++ de la siguiente manera:

#Include usando el espacio de nombres STD; int main () const int nmin = 0; const int nmax = 255; const int omin = 60; const int omax = 65; int espacio = (nmax - nmin) / (omax - omin); int bins = (omax - omin); para (int j = 0; j <= bins; j++ )   std::cout << j + OMIN << ": " << NMIN + ( j * space ) << endl;   return 0; 

COMPILAR:

G ++ contenedores.contenedores CPP -O

PRODUCCIÓN:

60: 0 61: 51 62: 102 63: 153 64: 204 65: 255 

El código C ++ anterior es una versión realmente simplificada del algoritmo de estiramiento lineal. En la siguiente sección vamos a usar la biblioteca OpenCV para hacer esta tarea.

Usando la biblioteca OpenCV podemos aprovechar la función CVNormaly. Esta función toma como mínimo cinco argumentos (imagen original, nueva imagen, nmin, nmax y tipo de normalización). El siguiente código OpenCV C ++ toma la imagen de muestra como un solo argumento. El siguiente código C ++ aplicará la función CVNormalizal a una imagen de muestra y creará un histograma para la imagen original y normalizada.

#Include "CV.H "#include" Highgui.h "void create_histogram_image (iPlImage*, iPlImage*); int estructura // para la imagen de salida de escala de gris iPlimage *gray_img = cvcreateImage (cvsize (fuente-> ancho, fuente-> altura), iPl_depth_8u, 1); // Estable , Cv_rgb2gray); // crear una nueva estructura de imagen // para mantener la imagen de histograma iPlimage *hist_img = cvCreateImage (CVSize (300,240), 8, 1); cvSet (hist_img, cvscalarall (255), 0); // Creación de una nueva estructura de imagen estructura de imagen // para mantener la imagen de salida estirada iPlImage *estirado_img = cvCreateImage (cvSize (fuente-> ancho, fuente-> altura), iPl_depth_8u, 1); // Crear una nueva estructura de imagen // para mantener la imagen de HISTOGRAM IPLIMAGE *STRINSTED_HIST_IMG = CVCreateMage (CVSIZE (300,240), 8, 1);cvset (estirado_hist_img, cvscalarall (255), 0); // Cree una nueva estructura de imagen // para mantener la imagen de salida estirada iPlimage *Equalize_img = cvCreateImage (cvSize (fuente-> ancho, fuente-> altura), iPl_depth_8u, 1); // CVNormalize la llamada de función para aplicar el estiramiento lineal CVNormalize (Gray_img, STRINGED_IMG, 0, 255, CV_MINMAX); // Crear histograma de la imagen original create_histogram_image (gray_img, hist_img); // Crear histograma de la nueva imagen. create_histogram_image (estirado_img, estirado_hist_img); // Muestra todas las imágenes CVNamedWindow ("Imagen original de escala de grises", 1); CVShowImage ("Imagen original de escala de grises", Gray_img); cvnamedwindow ("imagen estirada a escala gris", 1); CVShowimage ("Imagen estirada a escala de grises", estirado_img); cvnamedWindow ("Histograma de imagen a escala gris", 1); CVShowImage ("Histograma de imagen a escala de gris", hist_img); cvnamedwindow ("histograma de imagen estirada", 1); CVShowImage ("Histograma de imagen estirado", estirado_hist_img); // espere indefinidamente para la tecla de tecla CVWaitkey (0); regresar 0;  void create_histogram_image (iPlimage* Gray_img, iPlimage* Hist_img) cvhistogram* Hist; int hist_size = 256; rango de flotación [] = 0,256; flotante* rangos [] = rango; flotante max_value = 0.0; Float w_scale = 0.0#000000; ">; // Crear matriz para contener los valores de histograma hist = cvcreatehist (1, & hist_size, cv_hist_array, rangos, 1); // Calcule los valores de histograma cvcalchist (& gray_img, hist, 0, null); // obtiene el Valores mínimos y máximos del histograma cvgetminMaxhistValue (Hist, 0, & max_value, 0, 0); // Establecer la altura utilizando el valor Maximim CvScale (Hist-> Bins, Hist-> Bins, ((FLOAT) HIST_IMG-> altura)/ altura) max_value, 0); // Calcule el ancho w_scale = ((float) hist_img-> width)/hist_size; // traza el histograma para (int i = 0; i < hist_size; i++ )   cvRectangle( hist_img, cvPoint((int)i*w_scale , hist_img->altura), cvPoint ((int) (i+1)*w_scale, hist_img-> altura -cvround (cvgetReal1d (hist-> bins, i))), cvscalar (0), -1, 8, 0);  

COMPILAR:

G ++ 'PKG-Config OpenCV--CFlags-Libs' Normalize.cpp -o normalizar 

EJECUTAR:

./Muestra de normalización.png 

PRODUCCIÓN:

muestra.PNG (imagen RGB original)

En el siguiente paso, hemos convertido la imagen RGB en una escala de grises:

Usando CVNormalize, hemos aplicado el estiramiento lineal:

Ahora podemos comparar histogramas de ambas imágenes.

Histograma de la imagen original a escala de grises:

Histograma de la nueva imagen estirada:

Cisco CCNA - Dirección IP Rango de Clase B
Bits de red 16 bits de red disponibles (x) 10xxxxxx xxxxxxxxx hosts Hosts Esto nos dejan con 14 bits designados para el número de redes. Ya que hay......
Joomla - Error La respuesta XML que se devolvió del servidor no es válida
Hoy he tenido un problema para instalar un Joomla 1.5 en mi servidor VPS. De hecho, pude instalarlo pero sin datos de muestra. El mensaje de error que...
El sistema de gestión de contenido de Joomla Docker Implementación y uso
El sistema de gestión de contenido de Joomla Docker Implementación y uso...