OpenCV Thresholding Pythonban a cv2.threshold() PlatoBlockchain adatintelligenciával. Függőleges keresés. Ai.

OpenCV küszöbérték Pythonban a cv2.threshold() segítségével

Bevezetés

A küszöbérték egy egyszerű és hatékony technika a kép alapvető szegmentálására és binarizálására (bináris képpé alakítására), ahol a pixelek vagy 0 or 1 (Vagy 255 ha egész számokat használ ezek ábrázolására).

Jellemzően a küszöbértéket használhatja egyszerű háttér-előtér szegmentálás végrehajtására egy képen, és ez minden képponthoz egy egyszerű technika változataira csapódik le:

if pixel_value > threshold:
    pixel_value = MAX
else:
    pixel_value = 0

Ezt a lényeges folyamatot ún Bináris küszöbérték. Most – többféle módon módosíthatja ezt az általános elképzelést, beleértve a műveletek megfordítását (a > jele a < jel), beállításával a pixel_value hoz threshold a maximális/0 érték helyett (csonkításként ismert), megtartva a pixel_value magát, ha a felett van threshold vagy ha az alatt van threshold.

Mindezek kényelmesen implementálva vannak az OpenCV-ben:

  • cv2.THRESH_BINARY
  • cv2.THRESH_BINARY_INV
  • cv2.THRESH_TRUNC
  • cv2.THRESH_TOZERO
  • cv2.THRESH_TOZERO_INV

… ill. Ezek viszonylag „naiv” módszerek abból a szempontból, hogy igen egyszerűek, nem veszik figyelembe a kontextust a képekben, ismeretekkel rendelkeznek arról, hogy milyen alakzatok gyakoriak stb. Ezekhez a tulajdonságokhoz – sokkal költségesebb és nagyobb teljesítményű számítástechnikát kellene alkalmaznunk. technikák.

Most még a „naiv” módszerekkel is – néhány heurisztikákat lehet bevezetni a jó küszöbök megtalálásához, ezek közé tartozik az Otsu-módszer és a Triangle-módszer:

  • cv2.THRESH_OTSU
  • cv2.THRESH_TRIANGLE

Jegyzet: Az OpenCV küszöbérték kezdetleges technika, és érzékeny a fényváltozásokra és a színátmenetekre, a szín heterogenitására stb. Legjobb viszonylag tiszta képeken alkalmazni, miután elmosta őket a zaj csökkentése érdekében, anélkül, hogy a szegmentálni kívánt objektumokban nagy színvariáns lenne.

Az egyetlen küszöbértékkel kapcsolatos alapvető küszöbértékekkel kapcsolatos problémák megoldásának másik módja a adaptív küszöbérték amely a kép minden kis régiójára alkalmaz egy küszöbértéket, nem pedig globálisan.

Egyszerű küszöbölés OpenCV-vel

Az OpenCV Python API-jában a küszöbérték a következőn keresztül történik cv2.threshold() metódus – amely elfogad egy képet (NumPy tömb, egész számokkal ábrázolva), a küszöbértéket, a maximális értéket és a küszöbértéket (hogyan threshold és a maximum_value használt):

img = cv2.imread('objects.jpg')

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)


blurred = cv2.GaussianBlur(img, (7, 7), 0)

ret, img_masked = cv2.threshold(blurred, 220, 255, cv2.THRESH_BINARY)

A visszatérési kód csak az alkalmazott küszöbérték:

print(f"Threshold: {ret}") 

Itt, hiszen a küszöb 220 és használtuk a THRESH_BINARY módszer – minden fenti pixelérték 220 -re fog növekedni 255, míg minden alatta lévő pixelérték 220 -ra lesz leeresztve 0, fekete-fehér képet hozva létre, „maszkkal”, az előtérben lévő objektumokat lefedve.

Miért 220? A kép megjelenésének ismerete lehetővé teszi néhány hozzávetőleges találgatást arról, hogy milyen küszöböt választhat. A gyakorlatban ritkán kíván kézi küszöböt beállítani, és egy pillanat alatt kitérünk az automatikus küszöbválasztásra.

Ábrázoljuk az eredményt! Az OpenCV ablakok kissé bonyolultak lehetnek, ezért az eredeti képet, az elmosódott képet és az eredményeket a Matplotlib segítségével ábrázoljuk:

fig, ax = plt.subplots(1, 3, figsize=(12, 8))
ax[0].imshow(img)
ax[1].imshow(blurred)
ax[2].imshow(img_masked)

Küszöbösítési módszerek

Amint korábban említettük, többféleképpen használhatja a küszöböt és a maximális értéket egy függvényben. Kezdetben megnéztük a bináris küszöböt. Készítsünk egy listát a módszerekről, és alkalmazzuk őket egyenként, ábrázolva az eredményeket:

methods = [cv2.THRESH_BINARY, cv2.THRESH_BINARY_INV, cv2.THRESH_TRUNC, cv2.THRESH_TOZERO, cv2.THRESH_TOZERO_INV]
names = ['Binary Threshold', 'Inverse Binary Threshold', 'Truncated Threshold', 'To-Zero Threshold', 'Inverse To-Zero Threshold']

def thresh(img_path, method, index):
    img = cv2.imread(img_path)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    blurred = cv2.GaussianBlur(img, (7, 7), 0)
    ret, img_masked = cv2.threshold(blurred, 220, 255, method)

    fig, ax = plt.subplots(1, 3, figsize=(12, 4))
    fig.suptitle(names[index], fontsize=18)
    ax[0].imshow(img)
    ax[1].imshow(blurred)
    ax[2].imshow(img_masked)
    plt.tight_layout()

for index, method in enumerate(methods):
    thresh('coins.jpeg', method, index)

THRESH_BINARY és a THRESH_BINARY_INV egymás inverzei, és binarizálnak egy képet közöttük 0 és a 255, hozzárendelve őket a háttérhez, illetve az előtérhez, és fordítva.

THRESH_TRUNC között binarizálja a képet threshold és a 255.

THRESH_TOZERO és a THRESH_TOZERO_INV között binarizálni 0 és az aktuális pixelérték (src(x, y)). Nézzük a kapott képeket:

OpenCV Thresholding Pythonban a cv2.threshold() PlatoBlockchain adatintelligenciával. Függőleges keresés. Ai.

Tekintse meg gyakorlatias, gyakorlati útmutatónkat a Git tanulásához, amely tartalmazza a bevált gyakorlatokat, az iparág által elfogadott szabványokat és a mellékelt csalólapot. Hagyd abba a guglizást a Git parancsokkal, és valójában tanulni meg!

OpenCV Thresholding Pythonban a cv2.threshold() PlatoBlockchain adatintelligenciával. Függőleges keresés. Ai.
OpenCV Thresholding Pythonban a cv2.threshold() PlatoBlockchain adatintelligenciával. Függőleges keresés. Ai.
OpenCV Thresholding Pythonban a cv2.threshold() PlatoBlockchain adatintelligenciával. Függőleges keresés. Ai.
OpenCV Thresholding Pythonban a cv2.threshold() PlatoBlockchain adatintelligenciával. Függőleges keresés. Ai.

Ezek a módszerek elég intuitívak – de hogyan automatizálhatunk egy jó küszöbértéket, és mit is jelent a „jó küszöbérték”? Az eddigi eredmények többsége nem ideális maszkot tartalmazott, nyomokkal és foltokkal. Ez az érmék fényvisszaverő felületeinek különbsége miatt történik – nem egyenletes színűek, mivel a bordák eltérő módon verik vissza a fényt.

Bizonyos mértékig leküzdhetjük ezt, ha jobb globális küszöböt találunk.

Automatikus/Optimalizált Thresholding OpenCV-vel

Az OpenCV két hatékony globális küszöbkeresési módszert alkalmaz – az Otsu-módszert és a Triangle módszert.

Otsu módszere azt feltételezi, hogy működik bimodális képeket. A bimodális képek olyan képek, amelyek színhisztogramja csak két csúcsot tartalmaz (azaz csak két különálló pixelértékük van). Tekintettel arra, hogy a csúcsok egy-egy osztályhoz tartoznak, mint például a „háttér” és az „előtér” – az ideális küszöb ezeknek a közepén van.

OpenCV Thresholding Pythonban a cv2.threshold() PlatoBlockchain adatintelligenciával. Függőleges keresés. Ai.
Kép jóváírás: https://scipy-lectures.org/

A Gauss-féle elmosódásokkal bimodálisabbá tehet néhány képet, de nem mindegyiket.

Egy alternatív, sokszor jobban teljesítő algoritmus a háromszög algoritmus, amely kiszámítja a szürkeszintű hisztogram maximuma és minimuma közötti távolságot, és vonalat húz. Azt a pontot választjuk küszöbnek, ahol az a vonal maximálisan távol van a hisztogram többi részétől:

OpenCV Thresholding Pythonban a cv2.threshold() PlatoBlockchain adatintelligenciával. Függőleges keresés. Ai.

Mindkettő szürkeárnyalatos képet feltételez, ezért a bemeneti képet szürkévé kell konvertálnunk keresztül cv2.cvtColor():

img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)

ret, mask1 = cv2.threshold(blurred, 0, 255, cv2.THRESH_OTSU)
ret, mask2 = cv2.threshold(blurred, 0, 255, cv2.THRESH_TRIANGLE)

masked = cv2.bitwise_and(img, img, mask=mask1)

Futtassuk végig a képet mindkét módszerrel, és vizualizáljuk az eredményeket:

methods = [cv2.THRESH_OTSU, cv2.THRESH_TRIANGLE]
names = ['Otsu Method', 'Triangle Method']

def thresh(img_path, method, index):
    img = cv2.imread(img_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (7, 7), 0)

    ret, img_masked = cv2.threshold(blurred, 0, 255, method)
    print(f"Threshold: {ret}")

    fig, ax = plt.subplots(1, 3, figsize=(12, 5))
    fig.suptitle(names[index], fontsize=18)
    ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    ax[1].imshow(cv2.cvtColor(gray, cv2.COLOR_BGR2RGB))
    ax[2].imshow(cv2.cvtColor(img_masked, cv2.COLOR_BGR2RGB))

for index, method in enumerate(methods):
    thresh('coins.jpeg', method, index)

OpenCV Thresholding Pythonban a cv2.threshold() PlatoBlockchain adatintelligenciával. Függőleges keresés. Ai.
OpenCV Thresholding Pythonban a cv2.threshold() PlatoBlockchain adatintelligenciával. Függőleges keresés. Ai.

Itt a háromszög módszer jobban teljesít, mint Otsu módszere, mivel a kép nem bimodális:

import numpy as np

img = cv2.imread('coins.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)

histogram_gray, bin_edges_gray = np.histogram(gray, bins=256, range=(0, 255))
histogram_blurred, bin_edges_blurred = np.histogram(blurred, bins=256, range=(0, 255))

fig, ax = plt.subplots(1, 2, figsize=(12, 4))

ax[0].plot(bin_edges_gray[0:-1], histogram_gray)
ax[1].plot(bin_edges_blurred[0:-1], histogram_blurred)

OpenCV Thresholding Pythonban a cv2.threshold() PlatoBlockchain adatintelligenciával. Függőleges keresés. Ai.

Azonban világos, hogy a háromszög módszer hogyan tudott dolgozni a képpel, és kielégítőbb eredményt produkálni.

Az OpenCV Thresholding korlátai

A küszöbölés az OpenCV-vel egyszerű, könnyű és hatékony. Ennek ellenére meglehetősen korlátozott. Amint bevezeti a színes elemeket, az egyenetlen hátteret és a változó fényviszonyokat – a globális küszöbérték mint koncepció túl merevvé válik.

A képek általában túl összetettek ahhoz, hogy egyetlen küszöb is elegendő legyen, és ez részben megoldható adaptív küszöbérték, ahol sok helyi küszöbértéket alkalmaznak egyetlen globális helyett. Bár korlátozott, az adaptív küszöbérték sokkal rugalmasabb, mint a globális küszöbérték.

Következtetés

Az elmúlt években a bináris szegmentációt (mint amit itt tettünk) és a többcímkés szegmentációt (ahol tetszőleges számú osztályt kódolhat) sikeresen modellezték mély tanulási hálózatokkal, amelyek sokkal erősebbek és rugalmasabbak. Ezenkívül globális és helyi kontextust is kódolhatnak az általuk szegmentált képekbe. A hátránya az, hogy adatokra van szükség a képzésükhöz, valamint időre és szakértelemre.

Menet közbeni, egyszerű küszöbérték meghatározásához használhatja az OpenCV-t. A pontos, termelési szintű szegmentálás érdekében érdemes neurális hálózatokat használni.

Továbblépve – Gyakorlati mélytanulás a számítógépes látáshoz

Érdeklődő természete arra készteti, hogy tovább menjen? Javasoljuk, hogy tekintse meg nálunk Tanfolyam: „Practical Deep Learning for Computer Vision with Python”.

OpenCV Thresholding Pythonban a cv2.threshold() PlatoBlockchain adatintelligenciával. Függőleges keresés. Ai.

Újabb számítógépes látás tanfolyam?

Nem végezzük az MNIST számjegyek osztályozását vagy az MNIST divatot. Régen kiszolgálták a részüket. Túl sok tanulási erőforrás összpontosít az alapvető adatkészletekre és alapvető architektúrákra, mielőtt a fejlett feketedoboz-architektúrákra hagyná a teljesítmény terhét.

Mi arra szeretnénk koncentrálni demisztifikáció, gyakorlatiasság, megértés, intuíció és a valódi projektek. Tanulni akar hogyan tudsz változtatni? Elvezetjük Önt az agyunk képfeldolgozási módjától a mellrák kutatási szintű mélytanulási osztályozójának megírásáig a mély tanulási hálózatokig, amelyek „hallucinálnak”, gyakorlati munkán keresztül megtanítjuk az alapelveket és az elméletet, felkészítve a know-how és eszközök ahhoz, hogy szakértővé váljon a mélytanulás alkalmazásában a számítógépes látás megoldásában.

Mi van benne?

  • A látás első alapelvei és hogyan lehet a számítógépeket „látni” tanítani
  • A számítógépes látás különböző feladatai és alkalmazásai
  • A szakma eszközei, amelyek megkönnyítik a munkáját
  • Adatkészletek keresése, létrehozása és felhasználása számítógépes látáshoz
  • A konvolúciós neurális hálózatok elmélete és alkalmazása
  • Tartományeltolódás, együttes előfordulás és egyéb torzítások kezelése az adatkészletekben
  • Transzfer Tanulás és mások képzési idejének és számítási erőforrásainak felhasználása az Ön javára
  • Korszerű emlőrák osztályozó felépítése és betanítása
  • Hogyan alkalmazzunk egy egészséges adag szkepticizmust a mainstream ötletekhez, és hogyan értsük meg a széles körben elfogadott technikák következményeit
  • A ConvNet „koncepcióterének” megjelenítése t-SNE és PCA segítségével
  • Esettanulmányok arról, hogy a vállalatok hogyan használják a számítógépes látástechnikákat a jobb eredmények elérése érdekében
  • Megfelelő modellértékelés, látens tér vizualizáció és a modell figyelmének azonosítása
  • Domainkutatás végzése, saját adatkészletek feldolgozása és modelltesztek létrehozása
  • Élvonalbeli architektúrák, az ötletek fejlődése, mi teszi őket egyedivé és hogyan valósítsuk meg őket
  • KerasCV – WIP-könyvtár a legkorszerűbb csővezetékek és modellek létrehozásához
  • Hogyan elemezze és olvassa el a dolgozatokat, és saját maga hajtsa végre azokat
  • Modellek kiválasztása az alkalmazástól függően
  • Végpontok közötti gépi tanulási folyamat létrehozása
  • Tájkép és intuíció a tárgyfelismeréshez a gyorsabb R-CNN-ekkel, RetinaNetekkel, SSD-kkel és YOLO-val
  • Példány és szemantikai szegmentáció
  • Valós idejű objektumfelismerés a YOLOv5 segítségével
  • YOLOv5 objektumdetektorok képzése
  • Transzformátorokkal való munkavégzés KerasNLP-vel (ipari erősségű WIP-könyvtár)
  • Transformers integrálása ConvNetekkel a képek feliratainak létrehozásához
  • Deepdream
  • Deep Learning modell optimalizálása számítógépes látáshoz

Időbélyeg:

Még több Stackabus