logo

OpenCV: segmentación mediante umbrales

En este artículo se presenta una técnica básica para la segmentación de objetos llamada Umbral . Pero antes de entrar en más detalles, a continuación se ofrece una breve descripción general de OpenCV. OpenCV (Open Source Computer Vision) es una biblioteca multiplataforma de código abierto de funciones de programación destinadas a realizar tareas de visión por computadora en tiempo real en una amplia variedad de campos tales como:
  • reconocimiento facial
  • Sistemas de reconocimiento de iris
  • Reconocimiento de gestos
  • Interacción persona-computadora (HCI)
  • Robótica móvil
  • Identificación de objetos
  • Segmentación y reconocimiento
  • Visión estéreo estereopsis: percepción de profundidad desde 2 cámaras
  • realidad aumentada
También incluye una sólida biblioteca de aprendizaje automático estadístico que contiene varios clasificadores diferentes que se utilizan para respaldar las áreas anteriores. Para utilizar OpenCV, simplemente importe o incluya las bibliotecas necesarias y comience a utilizar la gran variedad de funciones disponibles. Umbral es una técnica de segmentación muy popular que se utiliza para separar un objeto de su fondo. En el artículo siguiente he descrito varias técnicas utilizadas para umbralizar imágenes en escala de grises (8 bits) . El proceso de umbralización Implica comparar cada valor de píxel de la imagen (intensidad de píxel) con un umbral específico. Esto divide todos los píxeles de la imagen de entrada en 2 grupos:
  1. Píxeles con un valor de intensidad inferior al umbral.
  2. Píxeles que tienen un valor de intensidad superior al umbral.
A estos 2 grupos ahora se les asignan valores diferentes según los distintos tipos de segmentación. OpenCV admite 5 esquemas de umbral diferentes en imágenes en escala de grises (8 bits) usando la función: Umbral doble (InputArray src OutputArray dst doble umbral doble maxval int tipo) Parámetros:
  • InputArray src: Imagen de entrada (Mat 8 bits o 32 bits)
  • OutputArray dst: Imagen de salida (mismo tamaño que la entrada)
  • doble umbral: establecer el valor umbral
  • double maxval: maxVal utilizado en los tipos 1 y 2
  • int type*: especifica el tipo de umbral que se utilizará. (0-4)
  • *A continuación se proporciona una lista de tipos de umbrales. Imagen de entrada origen' title= La imagen RGB de entrada se convierte primero a una imagen en escala de grises antes de realizar el umbral. OpenCV: segmentación mediante umbrales' title= Tipos de umbral
      Umbral binario (tipo int = 0) 0_130' title= De los dos grupos obtenidos anteriormente, al grupo que tiene miembros con una intensidad de píxeles mayor que el umbral establecido se le asigna Max_Value o, en el caso de una escala de grises, un valor de 255 (blanco). Los miembros del grupo restante tienen la intensidad de sus píxeles establecida en 0 (negro). EQ1' title= Si el valor de intensidad de píxeles en (x y) en la imagen de origen es mayor que el umbral, el valor en la imagen final se establece en maxVal. Umbral binario invertido (tipo int = 1) 1_130' title= Inv. El umbral binario es lo mismo que el umbral binario. La única diferencia esencial es que en el umbral Inv.Binary al grupo que tiene intensidades de píxeles superiores al umbral establecido se le asigna "0", mientras que los píxeles restantes que tienen intensidades inferiores al umbral se establecen en maxVal. eq2' title= Si el valor de intensidad de píxeles en (x y) en la imagen de origen es mayor que el umbral, el valor en la imagen final se establece en 0; de lo contrario, se establece en maxVal. Truncar umbral (tipo int = 2) 2_150' title= El grupo que tiene intensidades de píxeles superiores al umbral establecido se trunca al umbral establecido o, en otras palabras, los valores de píxeles se configuran para que sean los mismos que el umbral establecido. Todos los demás valores siguen siendo los mismos. eq3' title= Si el valor de intensidad de píxeles en (x y) en la imagen de origen es mayor que el umbral, el valor en la imagen final se establece en el umbral; de lo contrario, no se modifica. Umbral a cero (tipo int = 3) OpenCV: segmentación mediante umbrales' title= Una técnica de umbral muy simple en la que establecemos la intensidad de los píxeles en "0" para todos los píxeles del grupo que tienen un valor de intensidad de píxeles inferior al umbral. ecuación4' title= Si el valor de intensidad de píxeles en (x y) en la imagen de origen es mayor que el umbral, el valor en (x y) en la imagen final no cambia. Todos los píxeles restantes se establecen en "0". Umbral a cero invertido (tipo int = 4) OpenCV: segmentación mediante umbrales' title= De manera similar a la técnica anterior, aquí configuramos la intensidad de píxeles en "0" para todos los píxeles del grupo que tienen un valor de intensidad de píxeles mayor que el umbral. eq5' title= Si el valor de intensidad de píxeles en (x y) en la imagen de origen es mayor que el umbral, el valor en (x y) en la imagen final se establece en "0". Todos los valores de píxeles restantes no cambian.
    Para compilar programas OpenCV necesita tener la biblioteca OpenCV instalada en su sistema. Publicaré un tutorial sencillo para lo mismo en los próximos días. Si ya instaló OpenCV, ejecute el siguiente código con la imagen de entrada de su elección. CPP
    // CPP program to demonstrate segmentation // thresholding. #include  #include  #include  #include  using namespace cv; int main(int argc char** argv) {  if (argc != 2)   {  cout << ' Usage: '  '   ' << endl;  return -1;  }  int threshold_value = 0;  // Valid Values: 0 1 2 3 4  int threshold_type = 2;   // maxVal useful for threshold_type 1 and 2  int maxVal = 255;   // Source image  Mat src = imread(argv[1] 1);  cvNamedWindow('Original' CV_WINDOW_NORMAL);  imshow('Original' src);  Mat src_gray dst;  // Convert the image to GrayScale  cvtColor(src src_gray CV_BGR2GRAY);  // Create a window to display results  cvNamedWindow('Result' CV_WINDOW_NORMAL);  createTrackbar('Threshold' 'Result'   &threshold_value 255);  while (1)   {  threshold(src_gray dst threshold_value   maxVal threshold_type);  imshow('Result' dst);  waitKey(1);  } }