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:

  • crear un histograma de la imagen original
  • Establecer nuevos valores máximos (nmax) y nuevos mínimos (nmin)
  • Calcule el número de contenedores en el histograma original donde el valor de los contenedores = (OMAX - OMIN)
  • Calcule el espacio para un nuevo histograma para que espacio = (nmax - nmin) / (omax - omin)
  • Cree un nuevo histograma con posiciones correspondientes para nuevos contenedores (NB) representados por
  • Use un nuevo histograma para crear una nueva imagen

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:

Tutoriales de Linux relacionados:

  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Bucles anidados en guiones Bash
  • Mastering Bash Script Loops
  • Cómo trabajar con la API REST de WooCommerce con Python
  • Cosas para instalar en Ubuntu 20.04
  • ¿Con qué frecuencia tiene que reiniciar su servidor de Linux??
  • Comparación de Linux Apache Prefork vs Worker MPMS
  • Cosas que hacer después de instalar Ubuntu 20.04 fossa focal Linux
  • Mint 20: Mejor que Ubuntu y Microsoft Windows?
  • Optimización de rendimiento de Linux: herramientas y técnicas