logo

OpenCV: segmentazione utilizzando la soglia

In questo articolo viene presentata una tecnica di base per la segmentazione degli oggetti chiamata Soglia . Ma prima di entrare più nel dettaglio, di seguito è riportata una breve panoramica di OpenCV. OpenCV (Open Source Computer Vision) è una libreria open source multipiattaforma di funzioni di programmazione volte a eseguire attività di visione artificiale in tempo reale in un'ampia varietà di campi come:
  • Riconoscimento facciale
  • Sistemi di riconoscimento dell'iride
  • Riconoscimento dei gesti
  • Interazione uomo-computer (HCI)
  • Robotica mobile
  • Identificazione degli oggetti
  • Segmentazione e riconoscimento
  • Stereopsis stereovisione: percezione della profondità da 2 telecamere
  • Realtà aumentata
Include anche una solida libreria statistica di machine learning che contiene una serie di classificatori diversi utilizzati per supportare le aree di cui sopra. Per utilizzare OpenCV è sufficiente importare o includere le librerie richieste e iniziare a utilizzare la miriade di funzioni disponibili. Soglia è una tecnica di segmentazione molto popolare utilizzata per separare un oggetto dal suo sfondo. Nell'articolo qui sotto ho descritto varie tecniche utilizzate per la soglia immagini in scala di grigi (8 bit) . Il processo di soglia comporta il confronto di ciascun valore di pixel dell'immagine (intensità dei pixel) con una soglia specificata. Questo divide tutti i pixel dell'immagine in ingresso in 2 gruppi:
  1. Pixel con valore di intensità inferiore alla soglia.
  2. Pixel con valore di intensità maggiore della soglia.
A questi 2 gruppi vengono ora assegnati valori diversi a seconda dei vari tipi di segmentazione. OpenCV supporta 5 diversi schemi di soglia sulle immagini in scala di grigi (8 bit) utilizzando la funzione: Doppia soglia (InputArray src OutputArray dst double thresh double maxval int type) parametri:
  • InputArray src: immagine di input (Mat 8 bit o 32 bit)
  • OutputArray dst: immagine di output (stessa dimensione dell'input)
  • doppia soglia: imposta il valore di soglia
  • double maxval: maxVal utilizzato nel tipo 1 e 2
  • int type* :Specifica il tipo di soglia da utilizzare. (0-4)
  • *Di seguito viene fornito un elenco dei tipi di soglia. Immagine in ingresso orig' title= L'immagine RGB in input viene prima convertita in un'immagine in scala di grigi prima che venga eseguita la soglia. OpenCV: segmentazione utilizzando la soglia' title= Tipi di soglia
      Soglia binaria(int type=0) 0_130' title= Dei due gruppi ottenuti in precedenza al gruppo avente membri con intensità di pixel maggiore della soglia impostata viene assegnato Max_Value o nel caso di una scala di grigi un valore di 255 (bianco). I membri del gruppo rimanente hanno l'intensità dei pixel impostata su 0 (nero). EQ1' title= Se il valore dell'intensità dei pixel in (xy) nell'immagine sorgente è maggiore della soglia, il valore nell'immagine finale è impostato su maxVal. Soglia binaria invertita (int type=1) 1_130' title= Inv. La soglia binaria è uguale alla soglia binaria. L'unica differenza essenziale è che nella soglia Inv.Binary il gruppo con intensità di pixel superiori alla soglia impostata viene assegnato "0" mentre i restanti pixel con intensità inferiori alla soglia sono impostati su maxVal. eq2' title= Se il valore dell'intensità dei pixel in (xy) nell'immagine sorgente è maggiore della soglia, il valore nell'immagine finale è impostato su 0 altrimenti è impostato su maxVal. Tronca soglia(int type=2) 2_150' title= Il gruppo avente intensità di pixel maggiori della soglia impostata viene troncato alla soglia impostata o in altre parole i valori dei pixel vengono impostati in modo che siano uguali alla soglia impostata. Tutti gli altri valori rimangono gli stessi. eq3' title= Se il valore dell'intensità dei pixel in (xy) nell'immagine sorgente è maggiore della soglia, il valore nell'immagine finale viene impostato sulla soglia altrimenti rimane invariato. Soglia su zero (int type=3) OpenCV: segmentazione utilizzando la soglia' title= Una tecnica di soglia molto semplice in cui impostiamo l'intensità dei pixel su "0" per tutti i pixel del gruppo aventi un valore di intensità dei pixel inferiore alla soglia. eq4' title= Se il valore dell'intensità dei pixel in (xy) nell'immagine sorgente è maggiore della soglia, il valore in (xy) nell'immagine finale non cambia. Tutti i pixel rimanenti sono impostati su "0". Soglia a zero invertita (int type=4) OpenCV: segmentazione utilizzando la soglia' title= Similmente alla tecnica precedente, qui impostiamo l'intensità dei pixel su "0" per tutti i pixel del gruppo aventi un valore di intensità dei pixel maggiore della soglia. eq5' title= Se il valore dell'intensità dei pixel in (xy) nell'immagine sorgente è maggiore della soglia, il valore in (xy) nell'immagine finale è impostato su "0". Tutti i valori dei pixel rimanenti rimangono invariati.
    Per compilare programmi OpenCV è necessario che la libreria OpenCV sia installata sul tuo sistema. Nei prossimi giorni pubblicherò un semplice tutorial per lo stesso. Se hai già installato OpenCV, esegui il codice seguente con l'immagine di input di tua scelta. 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);  } }