Opencv-python používa Gaborov filter na realizáciu extrakcie funkcií binárnej textúry oblasti prstovej žily

Opencv Python Uses Gabor Filter Realize Binary Texture Feature Extraction Finger Vein Area



Napísal som o extrakcii oblasti ROI, ale pre extrahovanú oblasť je potrebné extrahovať jej vlastnosti, aby mohla byť použitá v neskoršom porovnávaní funkcií.

Tento článok hlavne zaznamenáva, ako som urobil extrakciu funkcií binárnych textúr pre obrázky prstových žíl



princíp:



Jednoduchá metóda na porovnanie extrakcie funkcií: Gaborov filter sa používa na extrakciu textúr všetkými smermi a potom sú navzájom zlúčené kvôli binarizácii. Princíp je veľmi jednoduchý, ale môj proces je veľmi ťažký. Prvá vec, ktorú je potrebné pochopiť, je filter Gabor, tento článok Môže vám poskytnúť približnú predstavu.



V opencv-python je tiež veľmi jednoduché získať gaborov filter.

kern=cv.getGaborKernel(ksize, sigma, theta, lambd, gamma[, psi[, ktype]])

Stačí veta kódu. Keď uvidíte tento dlhý zoznam parametrov, mali by ste pochopiť, prečo je tento proces veľmi ťažký. Pretože parametre sú ovplyvnené Gaborovým filtrom, môžete hľadaniu vhodných parametrov venovať veľa času.

Tento blog Umožňuje vám mať prvý obrázok každého parametra, ale tento blog používa jazyk C ++, zoznam parametrov sa môže trochu líšiť, urobil som jasné zhrnutie podľa zoznamu parametrov Pythonu:



''' The meaning of gaborkernel parameters: The first parameter: size The size of the core, generally an odd number The second parameter: σ represents the standard deviation of the Gaussian function, the larger the standard deviation, the more ripples The third parameter: θ represents the angle of the ripple, radian system np.pi/5 The fourth parameter: λ represents the wavelength, the longer the wavelength, the denser The fifth parameter: γ represents the ratio of the length to the length of the ellipse, when it is 1, it is a circle Sixth parameter: psi represents phase shift, -180~180 change, generally take 0 The seventh parameter: type, generally in Python is ktype=cv.CV_64F or ktype=cv.CV_32F '''

Prax:

Proces hľadania parametrov je neúnosný. Výsledky získané pri použití mnohých a mnohých kombinácií na obrázku sú všetky biele alebo celé čierne. A keď som ho použil na obrázok, zistil som, že ak je tretím parametrom a, môžete získať nejaké textúry, potom je tento parameter tiež efektívny, keď je to + np.pi / 2 (vertikálne), ale vyžaduje, aby ste ho našli . (Parametre som hľadal celé popoludnie a našiel som iba TAT, ktorý som sotva sledoval.)

fimg = cv.filter2D(ROI,cv.CV_8UC3,kern)

Rozumiem cv.filter2D ako použitie jadra Kern na filtrovanie obrazu. Oficiálne vysvetlenie: Táto funkcia použije na obrázok ľubovoľný lineárny filter. Podpora miestnej prevádzky. Keď je časť clony mimo obraz, táto funkcia interpoluje abnormálnu hodnotu pixelu podľa zadaného okrajového režimu. cv.CV_8UC3 je hraničný režim uvedený vyššie

použitie:

Potom som dostal tieto dva obrázky v dvoch ortogonálnych smeroch:

Ako vidíte, smer textúry je zvislý.

Ďalši krok:

Neviem, čo ďalej, len sa riadim svojimi predstavami. Návrh učiteľa je: Môžete sa pokúsiť pridať obrázky ihneď po filtrovaní podľa Gaborovej strany všetkými smermi. Uistite sa však, že je nastavený parameter gabor

(Trochu povedané, táto úprava parametrov je pre mňa skutočne nechutná)

Moja cesta je, Priamo použite dva existujúce obrázky - „Binárne s prahovou hodnotou“ - „Objednajte dva obrázky s bitwise_or (superponované) -“ Získajte konečný obraz morfologického spracovania (uzavretá operácia, korózia).

(Uvažoval som nad morfologickým spracovaním pred operáciou OR, vyskúšal som na fungovanie veľa a veľa rôznych tvarov jadra, ale efekt nie je dobrý. V súčasnosti je už konečný efekt dobrý. Nakoniec som sa rozhodol použiť jednoduchý a priama metóda. Nerobte tieto zvončeky a píšťalky.)

Nakoniec prilepte môj kód (nemusí byť schopný spustiť): zdrojový kód môže ísť Môj github Stiahnite si, zodpovedajúci súbor je feature_binary.py

def feature_binary(path='0',img=None): #img is the ROI image processed by get_ROI kern = cv.getGaborKernel((17,17),4,0,10,0.5,0,ktype=cv.CV_64F) kern2 = cv.getGaborKernel((17,17),4,np.pi/2,10,0.5,0,ktype=cv.CV_64F) if path!='0': img=cv.imread(path,0) ROI=cv.cvtColor(img,cv.COLOR_BGR2GRAY) fimg = cv.filter2D(ROI,cv.CV_8UC3,kern) fimg2=cv.filter2D(ROI,cv.CV_8UC3,kern2) ret,fimg_b=cv.threshold(fimg,230,255,cv.THRESH_BINARY_INV) ret,fimg2_b=cv.threshold(fimg2,245,255,cv.THRESH_BINARY_INV) #respectively binarized orimg=cv.bitwise_or(fimg_b,fimg2_b) result=close_operation(orimg,kernel,kernel) result=cv.erode(result,kernel1) return result

Toto je efekt:

Miesto, kde sa cíti ako krvná cieva, je biele. Neoveril som, či sa dá použiť ako funkcia.

Potom pošlite obrázok mojich ladiacich parametrov a operácií na pamiatku

Nakoniec, prosím, jemne nastriekajte, ak efekt nie je dobrý, schopnosť je obmedzená

Ak to pomôže, Nech sa páči, drahý ~