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:
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!
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.
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:
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)
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)
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”.
Ú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