„OpenCV“: segmentacija naudojant slenkstį

„OpenCV“: segmentacija naudojant slenkstį
Šiame straipsnyje yra pagrindinė objektų segmentavimo technika, vadinama Slenkstis . Bet prieš pereinant į žemiau pateiktą detalę yra trumpa „OpenCV“ apžvalga. OPENCV (Atvirojo kodo kompiuterio matymas) yra kryžminės platformos atvirojo kodo programavimo funkcijų biblioteka, kuria siekiama atlikti realaus laiko kompiuterio matymo užduotis įvairiose srityse, tokiose kaip:
  • Veido atpažinimas
  • Rainelės atpažinimo sistemos
  • Gestų atpažinimas
  • Žmogaus ir kompiuterio sąveika (HCI)
  • Mobilioji robotika
  • Objekto identifikavimas
  • Segmentacija ir pripažinimas
  • Stereopsis Stereo regėjimas: gylio suvokimas iš 2 kamerų
  • Papildyta realybė
Tai taip pat apima tvirtą statistinės mašinų mokymosi biblioteką, kurioje yra daugybė skirtingų klasifikatorių, naudojamų aukščiau pateiktoms sritims palaikyti. Norėdami naudoti „OpenCv“, tiesiog importuokite arba įtraukite reikiamas bibliotekas ir pradėkite naudoti daugybę galimų funkcijų. Slenkstis yra labai populiari segmentavimo technika, naudojama objekto atskyrimui nuo jo fono. Žemiau esančiame straipsnyje aš aprašiau įvairius metodus, naudojamus slenksčiui pilkos spalvos vaizdai (8 bitų) . Procesas slenkstis Apima kiekvienos vaizdo taško vaizdo (pikselio intensyvumo) vertės palyginimą su nurodytu slenksčiu. Tai padalija visus įvesties vaizdo taškus į 2 grupes:
  1. Pikseliai, kurių intensyvumo vertė yra mažesnė už slenkstį.
  2. Pikseliai, kurių intensyvumo vertė yra didesnė už slenkstį.
Šioms 2 grupėms dabar suteikiamos skirtingos vertės, atsižvelgiant į įvairius segmentų tipus. „OpenCV“ palaiko 5 skirtingas slenksčio schemas „GreyScale“ (8 bitų) vaizduose, naudodamiesi funkcija: Dvigubas slenkstis („InputArray Src OutputArray“ DST Dvigubas slenkstis Dvigubas maxval int tipas) Parametrai:
  • „InputArray Src“: įvesties vaizdas (MAT 8 arba 32 bitų)
  • „OutputArray DST“: išvesties vaizdas (tokio pat dydžio kaip įvestis)
  • Dvigubas slenkstis: nustatykite slenksčio vertę
  • „Double MaxVal“: „MaxVal“ naudojamas 1 ir 2 tipuose
  • int tipas*: nurodo naudojimo slenksčio tipą. (0-4)
  • *Žemiau pateikiami slenksčių tipų sąrašas. Įvesties vaizdas orig Įvesties RGB vaizdas pirmiausia paverčiamas pilkos spalvos vaizdu, prieš pradedant slenkstį. „OpenCV“: segmentacija naudojant slenkstį Slenksčio tipai
      Dvejetainė slenkstis (int type = 0) 0_130 Iš dviejų grupių, gautų anksčiau, grupė, kurių nariai, kurių taškų intensyvumas yra didesnis nei nustatyta, yra priskyrimas Max_Value arba pilkos spalvos, kai vertė yra 255 (balta). Likusios grupės nariai savo pikselių intensyvumus nustato kaip 0 (juoda). Eq1 Jei pikselio intensyvumo vertė, esanti (x y) šaltinio vaizde, yra didesnė už slenkstį, galutinio vaizdo vertė nustatyta kaip „MaxVal“. Apverstas dvejetainis slenkstis (int tipas = 1) 1_130 Inv. Dvejetainė slenkstis yra tas pats, kas dvejetainė slenkstis. Vienintelis esminis skirtumas yra „Inv.binary“ slenksčio nustatymas grupei, turintiems didesnį taškų intensyvumą, nei nustatytas slenkstis, priskiriamas „0“, tuo tarpu likę taškai, kurių intensyvumas mažesnis nei slenkstis, yra nustatyta kaip „MaxVal“. Eq2 Jei pikselio intensyvumo vertė, esanti (x y) šaltinio vaizde, yra didesnė už slenkstį, galutinio vaizdo vertė nustatyta kaip 0, ji nustatyta kaip „MaxVal“. TRUNCATE slenkstis (int type = 2) 2_150 Grupė, kurios taškų intensyvumas yra didesnis už nustatytą slenkstį, yra sutrumpinta pagal nustatytą slenkstį, arba, kitaip tariant, taškų vertės yra tokios pačios kaip ir nustatyto slenksčio. Visos kitos vertės išlieka tos pačios. Eq3 Jei pikselio intensyvumo vertė, esanti (x y) šaltinio vaizde, yra didesnė už slenkstį, galutinio vaizdo vertė yra nustatyta kaip slenkstis, ji nesikeičia. Slenkstis iki nulio (int tipas = 3) „OpenCV“: segmentacija naudojant slenkstį Labai paprasta slenksčio technika, kai mes nustatėme taškų intensyvumą iki „0“ visiems grupės taškams, kurių taškų intensyvumo vertė yra mažesnė už slenkstį. Eq4 Jei pikselio intensyvumo vertė, esanti (x y) šaltinio vaizde, yra didesnė už slenkstį, vertė, esanti (x y) galutiniame paveikslėlyje, nesikeičia. Visi likę taškai yra „0“. Slenkstis iki nulio apverstos (int tipas = 4) „OpenCV“: segmentacija naudojant slenkstį Panašiai kaip ir ankstesnėje technikoje, mes nustatėme taškų intensyvumą iki „0“ visiems grupės taškams, kurių taškų intensyvumo vertė yra didesnė už slenkstį. Eq5 Jei pikselio intensyvumo vertė, esanti (x y) šaltinio vaizde, yra didesnė už slenkstį, vertė, esanti (x y) galutiniame paveikslėlyje, nustatyta kaip „0“. Visa likusi pikselio vertė nesikeičia.
    Norėdami sudaryti „OpenCv“ programas, turite įdiegti „OpenCv“ biblioteką savo sistemoje. Ateinančiomis dienomis paskelbsiu paprastą mokymo programą. Jei jau įdiegėte „OpenCv“, paleiskite žemiau pateiktą kodą su pasirinktu įvesties atvaizdu. 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  );      }   }