OpenCV Edge Detection Pythonissa cv2.Canny() PlatoBlockchain Data Intelligencen kanssa. Pystysuuntainen haku. Ai.

OpenCV Edge Detection Pythonissa cv2.Canny()

esittely

Reunojen tunnistus on jotain, jota teemme luonnollisesti, mutta se ei ole yhtä helppoa, kun on kyse sääntöjen määrittämisestä tietokoneille. Vaikka erilaisia ​​menetelmiä on kehitetty, John F. Canny kehitti hallitsemismenetelmän vuonna 1986, ja sitä kutsutaan osuvasti Canny-menetelmäksi.

Se on nopea, melko vankka ja toimii juuri niin hyvin kuin se voisi toimia kyseisellä tekniikalla. Oppaan loppuun mennessä osaat suorittaa reaaliaikaisen reunantunnistuksen videoissa ja tuottaa jotain seuraavilla tavoilla:

Canny-reunan tunnistus

Mikä on Canny-menetelmä? Se koostuu neljästä erillisestä operaatiosta:

  • Gaussin tasoitus
  • Gradientien laskeminen
  • Ei-maksimivaimennus
  • Hystereesin kynnys

Gaussin tasoitus käytetään ensimmäisenä askeleena tulokuvan silittämiseen ja kohinan pehmentämiseen, jolloin lopputulos on paljon puhtaampi.

Kuvan gradientit ovat olleet käytössä aikaisemmissa reunantunnistussovelluksissa. Erityisesti Sobel- ja Scharr-suodattimet perustuvat kuvan gradienteihin. Sobel-suodatin tiivistyy kahteen ytimeen (Gx ja Gy), missä Gx havaitsee vaakasuuntaiset muutokset, kun Gy havaitsee pystysuuntaiset muutokset:

G

x

=

[

-
1

0

+
1

-
2

0

+
2

-
1

0

+
1

]

G

y

=

[

-
1

-
2

-
1

0

0

0

+
1

+
2

+
1

]

Kun liu'utat ne kuvan yli, ne kumpikin "poimivat" (korostavat) viivat omassa suunnassaan. Scharr-ytimet toimivat samalla tavalla eri arvoilla:

G

x

=

[

+
3

0

-
3

+
10

0

-
10

+
3

0

-
3

]

G

y

=

[

+
3

+
10

+
3

0

0

0

-
3

-
10

-
3

]

Nämä suodattimet, kun ne on yhdistetty kuvan päälle, tuottavat ominaisuuskarttoja:

OpenCV Edge Detection Pythonissa cv2.Canny() PlatoBlockchain Data Intelligencen kanssa. Pystysuuntainen haku. Ai.

Kuvan luotto: Davidwkennedy

Näille ominaisuuskartoille voit laskea gradientin suuruus ja gradientti suunta – eli kuinka voimakas muutos on (kuinka todennäköistä on, että jokin on reuna) ja mihin suuntaan muutos osoittaa. Koska Gy tarkoittaa pystysuuntaista muutosta (Y-gradientti) ja Gx tarkoittaa vaakasuuntaista muutosta (X-gradientti), voit laskea suuruuden yksinkertaisesti soveltamalla Pythagoraan lausetta saadaksesi hypoteenuksen kolmion muodostamasta "vasemmasta" ja "oikeat" ohjeet:

$$
{G} ={sqrt {{{G} _{x}}^{2}+{{G} _{y}}^{2}}}
$$

Suuruuden ja suunnan avulla voit tuottaa kuvan, jonka reunat on korostettu:

OpenCV Edge Detection Pythonissa cv2.Canny() PlatoBlockchain Data Intelligencen kanssa. Pystysuuntainen haku. Ai.

Kuvan luotto: Davidwkennedy

Kuitenkin – näet kuinka paljon melua myös tiilien rakenteesta jäi kiinni! Kuvan gradientit ovat erittäin herkkiä kohinalle. Tästä syystä Sobel- ja Scharr-suodattimia käytettiin komponenttina, mutta se ei ollut ainoa lähestymistapa Cannyn menetelmässä. Gaussin tasoitus auttaa tässäkin.

Ei-maksimivaimennus

Huomattava ongelma Sobel-suodattimessa on, että reunat eivät ole todella selkeitä. Ei ole niin, että joku otti kynän ja piirsi viivan luodakseen kuvan viivapiirroksen. Kuvissa reunat eivät yleensä ole niin selkeitä, koska valo leviää vähitellen. Voimme kuitenkin löytää yhteisen viivan reunoista ja tukahduttaa loput pikselit sen ympäriltä, ​​jolloin saadaan sen sijaan puhdas, ohut erotusviiva. Tämä tunnetaan nimellä Non-Max Supression! Ei-maksimipikselit (pienemmät kuin se, johon vertaamme niitä pienessä paikallisessa kentässä, kuten 3×3-ytimessä) tukahdutetaan. Käsite soveltuu useampaankin tehtävään, mutta sidotaanpa se nyt tähän kontekstiin.

Hystereesin kynnys

Monet ei-reunat voidaan ja todennäköisesti tullaan arvioimaan reunoiksi valaistusolosuhteiden, kuvan materiaalien jne. vuoksi. Eri syistä johtuen nämä virhelaskelmat tapahtuvat – on vaikea tehdä automaattista arviota siitä, mikä reuna varmasti on ja mikä ei 't. Voit rajata kaltevuudet ja sisällyttää vain vahvimmat, olettaen, että "oikeat" reunat ovat voimakkaampia kuin "väärennetyt" reunat.

Kynnys toimii samalla tavalla kuin tavallisesti – jos gradientti on alemman kynnyksen alapuolella, poista se (nollaa se pois), ja jos se on tietyn yläkynnyksen yläpuolella, pidä se. Kaikki alarajan ja ylärajan välissä on "harmaalla vyöhykkeellä". Jos jokin kynnysten välissä oleva reuna on kytketty a lopullinen reuna (kynnyksen ylittävät) – niitä pidetään myös reunoina. Jos ne eivät ole yhteydessä toisiinsa, ne ovat todennäköisesti väärin lasketun reunan osia.

Se on hystereesikynnys! Itse asiassa se auttaa puhdistamaan lopullisen tulosteen ja poistamaan vääriä reunoja riippuen siitä, mitä luokittelet vääräksi reunaksi. Hyvien kynnysarvojen löytämiseksi yleensä kokeillaan erilaisia ​​kynnysarvojen ala- ja ylärajoja tai käytetään automatisoitua menetelmää, kuten Otsun menetelmää tai kolmiomenetelmää.

Ladataan kuva sisään ja harmaasävytetään se (Canny, aivan kuten Sobel/Scharr vaatii kuvien harmaasävyttämistä):

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('finger.jpg', cv2.IMREAD_GRAYSCALE)
img_blur = cv2.GaussianBlur(img, (3,3), 0)

plt.imshow(img_blur, cmap='gray')

OpenCV Edge Detection Pythonissa cv2.Canny() PlatoBlockchain Data Intelligencen kanssa. Pystysuuntainen haku. Ai.

Sormen lähikuva toimii hyvänä testialustana reunojen havaitsemiseen – sormenjälkeä ei ole helppo erottaa kuvasta, mutta voimme arvioida sellaisen.

Reunojen tunnistus kuvissa cv2.Canny()

Cannyn algoritmia voidaan soveltaa OpenCV:n avulla Canny() menetelmä:

cv2.Canny(input_img, lower_bound, upper_bound)

Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!

Oikean tasapainon löytäminen ala- ja ylärajan välillä voi olla hankalaa. Jos molemmat ovat alhaisia ​​- sinulla on vähän reunoja. Jos alaraja on matala ja yläraja korkea - sinulla on melua. Jos molemmat ovat korkealla ja lähellä toisiaan, sinulla on vähän reunoja. Oikeassa kohdassa on juuri tarpeeksi rakoa rajojen välillä, ja ne ovat oikeassa mittakaavassa. Koe!

Syötekuva sumentuu Canny-menetelmällä, mutta usein sen sumennus on hyödyllistä. ennen sekin menee sisään. Menetelmä soveltaa tuloon 5 × 5 Gaussin sumennuksen ennen muiden toimintojen suorittamista, mutta tämänkin sumennuksen kanssa voi silti tunkeutua kohinaa läpi, joten olemme sumentaneet kuvan ennen sen syöttämistä algoritmiin:


edge = cv2.Canny(img_blur, 20, 30)

fig, ax = plt.subplots(1, 2, figsize=(18, 6), dpi=150)
ax[0].imshow(img, cmap='gray')
ax[1].imshow(edge, cmap='gray')

Tämä johtaa:

OpenCV Edge Detection Pythonissa cv2.Canny() PlatoBlockchain Data Intelligencen kanssa. Pystysuuntainen haku. Ai.

Arvot 20 ja 30 Nämä eivät ole mielivaltaisia ​​- olen testannut menetelmää useilla parametreilla ja valinnut joukon, joka näytti tuottavan kunnollisen tuloksen. Voimmeko yrittää automatisoida tämän?

Automaattinen kynnysarvo cv2.Canny():lle?

Löydätkö optimaalisen joukon kynnysarvoja? Kyllä, mutta se ei aina toimi. Voit tehdä oman laskelman jostakin hyvästä arvosta ja säätää sitten aluetta a:lla sigma tuon kynnyksen ympärillä:

lower_bound = (1-sigma)*threshold
upper_bound = (1+sigma)*threshold

Kun sigma, sanotaan, 0.33 – rajat tulevat olemaan 0.66*threshold ja 1.33*threshold, jolloin sen ympärillä on noin 1/3. Kuitenkin löytää threshold se on vaikeampaa. OpenCV tarjoaa meille Otsun menetelmän (sopii hyvin bimodaalisille kuville) ja Triangle-menetelmän. Kokeillaan molempia ja otetaan kolmantena vaihtoehtona yksinkertainen mediaani pikseliarvoista:

otsu_thresh, _ = cv2.threshold(img_blur, 0, 255, cv2.THRESH_OTSU)
triangle_thresh, _ = cv2.threshold(img_blur, 0, 255, cv2.THRESH_TRIANGLE)
manual_thresh = np.median(img_blur)

def get_range(threshold, sigma=0.33):
    return (1-sigma) * threshold, (1+sigma) * threshold

otsu_thresh = get_range(otsu_thresh)
triangle_thresh = get_range(triangle_thresh)
manual_thresh = get_range(manual_thresh)

print(f"Otsu's Threshold: {otsu_thresh} nTriangle Threshold: {triangle_thresh} nManual Threshold: {manual_thresh}")

Tämä johtaa:

Otsu's Threshold: (70.35, 139.65) 
Triangle Threshold: (17.419999999999998, 34.58) 
Manual Threshold: (105.18999999999998, 208.81)

Nämä ovat aika erilaisia! Aiemmin nähmiemme arvojen perusteella voimme ennakoida kolmiomenetelmän toimivan tässä parhaiten. Manuaalinen kynnys ei ole kovin tietoinen, koska se ottaa vain mediaanipikselin arvon ja päätyy korkeaan peruskynnykseen, joka kerrotaan edelleen laajalle alueelle tälle kuvalle. Otsun menetelmä kärsii tästä vähemmän, mutta kärsii siitä huolimatta.

Jos ajamme Canny() menetelmä näillä kynnysarvoilla:

edge_otsu = cv2.Canny(img_blur, *otsu_thresh)
edge_triangle = cv2.Canny(img_blur, *triangle_thresh)
edge_manual = cv2.Canny(img_blur, *manual_thresh)

fig, ax = plt.subplots(1, 3, figsize=(18, 6), dpi=150)
ax[0].imshow(edge_otsu, cmap='gray')
ax[1].imshow(edge_triangle, cmap='gray')
ax[2].imshow(edge_manual, cmap='gray')

Huomautus: Funktio odottaa useita argumentteja, ja kynnyksemme ovat yksi monikko. Me voimme tuhoaminen monikko useiksi argumenteiksi lisäämällä sen eteen *. Tämä toimii myös luetteloissa ja joukoissa, ja se on loistava tapa toimittaa useita argumentteja sen jälkeen, kun ne on hankittu ohjelmallisesti.

Tämä johtaa:

OpenCV Edge Detection Pythonissa cv2.Canny() PlatoBlockchain Data Intelligencen kanssa. Pystysuuntainen haku. Ai.

Kolmiomenetelmä toimi täällä melko hyvin! Tämä ei takaa, että se toimii hyvin myös muissa tapauksissa.

Reaaliaikainen reunantunnistus videoissa cv2.Canny()

Lopuksi käytetään Canny-reunatunnistusta videoon reaaliajassa! Näytämme käsiteltävän videon (jokainen kuva valmiina) käyttämällä cv2.imshow() joka näyttää ikkunan kehyksen kanssa, jonka haluamme näyttää. Tallennamme kuitenkin myös videon MP4-tiedostoon, jota voidaan myöhemmin tarkastella ja jakaa.

Käytämme videon lataamiseen OpenCV:tä käyttämällä VideoCapture() menetelmä. Jos menemme sisään 0 – se tallentaa nykyisestä verkkokamerasta, joten voit suorittaa koodin myös verkkokamerassasi! Jos annat tiedostonimen, se lataa tiedoston:

def edge_detection_video(filename):
    cap = cv2.VideoCapture(filename)
    
    fourcc = cv2.VideoWriter_fourcc(*'MP4V')
    out = cv2.VideoWriter('output.mp4', fourcc, 30.0, (int(cap.get(3)), int(cap.get(4))), isColor=False)
    
    while cap.isOpened():
        (ret, frame) = cap.read()
        if ret == True:
            frame = cv2.GaussianBlur(frame, (3, 3), 0)
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            edge = cv2.Canny(frame, 50, 100)
            out.write(edge)
            cv2.imshow('Edge detection', edge)
        else:
            break

        if cv2.waitKey(10) & 0xFF == ord('q'):
            break

    cap.release()
    out.release()
    cv2.destroyAllWindows()

edge_detection_video('secret_video.mp4')

- VideoWriter hyväksyy useita parametreja – lähtötiedostonimen, FourCC:n (neljä koodekkikoodia, jotka ilmaisevat videon koodaamiseen käytettyä koodekkia), kehysnopeuden ja resoluution monikkona. Jotta et arvaisi tai muuta videon kokoa – olemme käyttäneet alkuperäisen videon leveyttä ja korkeutta, joka on saatu VideoCapture esimerkki, joka sisältää tietoja itse videosta, kuten leveyden, korkeuden, kehysten kokonaismäärän jne.

Kun sieppaus avataan, yritämme lukea seuraavan kehyksen cap.read(), joka palauttaa tuloskoodin ja seuraavan kehyksen. Tuloskoodi on True or False, joka ilmaisee seuraavan kehyksen olemassaolon tai sen puuttumisen. Vain kun kehys on olemassa, yritämme käsitellä sitä edelleen, muuten katkaisemme silmukan. Suoritamme jokaisen kelvollisen kehyksen Gaussin sumennuksen läpi, muunnamme sen harmaasävyiksi ja suoritamme cv2.Canny() siihen ja kirjoita se käyttämällä VideoWriter levylle ja näytä käyttämällä cv2.imshow() suoraa näkymää varten.

Lopuksi vapautamme sieppaus- ja videokirjoittimen, koska ne molemmat työskentelevät levyllä olevien tiedostojen kanssa ja tuhoavat kaikki olemassa olevat ikkunat.

Kun suoritat menetelmän a secret_video.mp4 syöttö – näet ikkunan ja kun se on valmis, työhakemistossasi oleva tiedosto:

OpenCV Edge Detection Pythonissa cv2.Canny() PlatoBlockchain Data Intelligencen kanssa. Pystysuuntainen haku. Ai.

Yhteenveto

Tässä oppaassa olemme tutustuneet Cannyn reunantunnistuksen toimintaan ja sen komponentteihin – Gaussin tasoitus, Sobel-suodattimet ja kuvagradientit, Non-Max Supression ja Hystereesi Thresholding. Lopuksi olemme tutkineet menetelmiä automaattiseen kynnysalueen hakuun Cannyn reunantunnistukseen cv2.Canny(), ja käytti tekniikkaa videossa tarjoten reaaliaikaisen reunantunnistuksen ja tallentaen tulokset videotiedostoon.

Jatketaan – Käytännön syvällistä oppimista tietokonenäköön

Utelias luonteesi saa sinut haluamaan pidemmälle? Suosittelemme tutustumaan meidän Kurssi: "Käytännön syvällinen oppiminen tietokonenäön käyttöön Pythonilla".

OpenCV Edge Detection Pythonissa cv2.Canny() PlatoBlockchain Data Intelligencen kanssa. Pystysuuntainen haku. Ai.

Toinen tietokonenäkökurssi?

Emme luokittele MNIST-numeroita tai MNIST-muotia. He palvelivat osansa kauan sitten. Liian monet oppimisresurssit keskittyvät perustietosarjoihin ja perusarkkitehtuureihin, ennen kuin edistyneiden black-box-arkkitehtuurien annetaan kantaa suoritustaakka.

Haluamme keskittyä demystifikaatio, käytännöllisyys, ymmärtäminen, intuitio ja oikeita projekteja. Haluan oppia miten voitko vaikuttaa? Viemme sinut matkalle aivomme prosessoinnista kuvien tutkimiseen rintasyövän syväoppimisluokittajan kirjoittamiseen syväoppimisverkostoihin, jotka "halusinoivat", opettaen sinulle periaatteita ja teoriaa käytännön työssä ja varustamalla tietotaitoa ja työkaluja tullaksesi asiantuntijaksi syväoppimisen soveltamisessa tietokonenäön ratkaisemiseen.

Mitä on sisällä?

  • Näön ensimmäiset periaatteet ja kuinka tietokoneet voidaan opettaa "näkemään"
  • Tietokonenäön eri tehtävät ja sovellukset
  • Ammatin työkalut, jotka helpottavat työtäsi
  • Tietokokonaisuuksien etsiminen, luominen ja hyödyntäminen tietokonenäköä varten
  • Konvoluutiohermoverkkojen teoria ja sovellus
  • Verkkotunnuksen siirtymisen, samanaikaisen esiintymisen ja muiden vääristymien käsittely tietojoukoissa
  • Siirrä Oppiminen ja muiden koulutusajan ja laskennallisten resurssien hyödyntäminen hyödyksesi
  • Huippuluokan rintasyövän luokittelijan rakentaminen ja kouluttaminen
  • Kuinka soveltaa tervettä annos skeptisyyttä valtavirran ideoihin ja ymmärtää laajalti käytettyjen tekniikoiden vaikutukset
  • ConvNetin "konseptitilan" visualisointi t-SNE:n ja PCA:n avulla
  • Tapaustutkimuksia siitä, kuinka yritykset käyttävät tietokonenäkötekniikoita parempien tulosten saavuttamiseksi
  • Oikea mallin arviointi, piilevän tilan visualisointi ja mallin huomion tunnistaminen
  • Toimialuetutkimuksen suorittaminen, omien tietojoukkojen käsittely ja mallitestien laatiminen
  • Huippuluokan arkkitehtuurit, ideoiden eteneminen, mikä tekee niistä ainutlaatuisia ja miten ne toteutetaan
  • KerasCV – WIP-kirjasto uusimpien putkien ja mallien luomiseen
  • Kuinka jäsentää ja lukea papereita ja toteuttaa ne itse
  • Mallien valinta sovelluksesi mukaan
  • Luodaan päästä päähän koneoppimisputki
  • Maisema ja intuitio kohteen havaitsemisessa nopeampien R-CNN-, RetinaNet-, SSD- ja YOLO-verkkojen avulla
  • Instanssi ja semanttinen segmentointi
  • Reaaliaikainen objektintunnistus YOLOv5:n avulla
  • YOLOv5-objektitunnistimien koulutus
  • Työskentely Transformersin kanssa KerasNLP:n (teollisuuden vahvuus WIP-kirjasto) avulla
  • Transformersin integrointi ConvNet-verkkojen kanssa kuvien tekstitysten luomiseksi
  • Deepdream
  • Deep Learning -mallin optimointi tietokonenäköä varten

Aikaleima:

Lisää aiheesta Stackabus