Fast Hough Transform ( Fast Hough Transform , prescurtare FHT) este o modificare a transformării Hough care vă permite să identificați parametric linii (precum și, cu modificări suplimentare , segmente și patrulatere ) cu o complexitate de calcul mai mică datorită utilizării faptului de autointersectare a liniilor discrete considerate.
Algoritmul a fost propus pentru prima dată de M. L. Brady în 1992, [1] a fost ulterior reinventat de mai multe ori de diverși autori. [2] [3]
Să fie dată o imagine de dimensiune . Luați în considerare linii diadice (linii drepte de un tip special) constând din pixeli din imagine fiecare (un pixel pe coloană).
Fie intensitatea celui de-al treilea pixel aparținând dreptei diadice dată de parametrii ; — Jumătatea imaginii acestei linii diadice.
Imaginea transformării discrete Hough este definită prin următoarea formulă:
Calculul direct al tuturor valorilor necesită operații: enumerarea peste diferite valori ale parametrilor , , enumerarea pentru fiecare pereche de valori .
La rândul său, algoritmul FHT, bazat pe luarea în considerare a intersecțiilor segmentelor între ele, necesită acțiuni, operațiunile sunt necesare pentru o linie dreaptă (pentru imagini pătrate ). Conform teoremei formulate de T. M. Khanipov [4] , este imposibil să se adauge linii diadice cu complexitate computațională asimptotic mai mică.
Algoritmul se bazează pe principiul „ împărțiți și cuceriți ”. Problema este de a găsi sumele valorilor pixelilor de-a lungul segmentelor care conectează marginile „stânga” și „dreapta” ale imaginii. Imaginea este împărțită în jumătate, în fiecare parte problema este rezolvată independent. Pentru a obține suma finală pe fiecare dintre segmente, se adaugă răspunsurile din jumătățile „stânga” și „dreapta” ale acestuia.
În algoritmul FHT, pixelii liniilor arbitrare sunt aproximați discret prin linii diadice. Pixelii aproximării diadice a unei linii drepte din imaginea de dimensiune sunt eliminați din linia dreaptă inițială cu cel mult pixeli. [5]
Segmentele sunt parametrizate de centrele pixelilor conectați. Prin urmare, împărțirea unui segment în subsegmente alcătuiește doar aproximativ segmentul inițial. Eroarea de aproximare cu pași de recursivitate este cumulativă, dar nu mai mult de pixeli. [5] Discretizarea segmentului la pixeli astfel construiti se numeste aproximare diadica .
Mai mult , un model este un set de pixeli care conțin un element în fiecare verticală a imaginii. Abaterea modelului va fi valoarea , iar coordonata va fi valoarea . O schimbare de model va fi numită set
p ↗ ( A , b ) = { ( X i + A , y i + b ) | ( X i , y i ) ∈ p } {\displaystyle p\narrow (a,b)=\lbrace \left(x_{i}+a,y_{i}+b\right)\ |\(x_{i},y_{i})\in p \rbrace } Modelele diadice generative de lățime și pantă sunt definite recursiv. Pentru , modelul este format dintr-un pixel, iar pentru , este exprimat în termeni de .
Liniile diadice, predominant orizontale, în sus, sunt obținute din toate modelele generative deplasate vertical , construite cu toate coordonatele posibile din imagine .
Pentru un calcul aproximativ al transformării Hough, este necesar să se găsească sumele peste toate liniile diadice din imagine. În această sumă de linii, există puncte fiecare. Datorită tranziției recursive, această însumare se reduce la numărarea separată a jumătăților stângi, separat a jumătăților drepte, ceea ce ne permite să reducem calculul la calculul sumelor peste puncte fiecare.
Luați în considerare cuvintele binare formate din numerele 0 și 1. Mulțimea cuvintelor diadice este definită recursiv. va fi numit cuvânt diadic dacă are forma sau , unde este un cuvânt gol sau diadic. Toate cuvintele diadice cu lungimea nu mai mare de trei: 0, 1, 000, 010, 101, 111.
Pentru fiecare cuvânt diadic se consideră suma cumulativă . Vom spune că succesiunea de pixeli este o linie dreaptă diadică care leagă centrele pixelilor și .
Există exact linii diadice de lungime . Unul pentru fiecare pereche de și .
Algoritmul FHT este structurat după cum urmează: [6]
Starea inițială a matricei este imaginea originală a dimensiunii . Apoi, calculul are loc la rândul său la --lea nivel, pornind de la primul: la --lea nivel, matricea în starea curentă este împărțită în grupuri conform principiului egalității părții întregi a coordonatei celei de-a doua axe. după împărțire prin ; se obțin submatrice ; uniți-le pe cele adiacente în perechi (fără intersecții, acest lucru este posibil, deoarece dimensiunea matricei este o putere de două) și în această pereche numim prima submatrice care este situată pe coordonate mai mici de-a lungul celei de-a doua coordonate din matrice , iar celălalt - al doilea; în loc de primul din fiecare pereche, suma sa este scrisă cu secunda corespunzătoare, iar în loc de a doua - suma primei și secunde cu o deplasare ciclică cu unu la stânga. Astfel, imaginea Hough a unor astfel de linii este considerată astfel încât pentru orice pereche de puncte cu coordonate din această dreaptă, , este satisfăcută folosind aproximarea prin linii diadice. Pentru a calcula imaginea pentru restul liniilor, este suficient să rotiți imaginea și să efectuați aceeași operație și să adăugați rezultatele.
Matricele astfel obtinute la fiecare nivel sunt elemente ale piramidei FHT. Descrierea formală a piramidei FHT : Nivelul zero al piramidei FHT este imaginea originală (de dimensiune , iar ultima este imaginea Hough care conține sume de-a lungul liniilor drepte diadice de lungime . Pentru a descrie al treilea nivel al piramidei , imaginea originală este împărțită în dungi orizontale , unde este numărul dungii, . Pentru fiecare dungă, al treilea nivel al piramidei FHT stochează sume peste toate modelele de dungi posibile cu lungime și parametri .Numărul de astfel de modele pentru o dungă este , deci al treilea nivel al piramidei ocupă la fel de multă memorie ca imaginea originală.
Invarianța cantității de memorie cheltuită și capacitatea de a stoca fiecare nivel într-o matrice de aceeași dimensiune ca imaginea originală, fără pierderea interpretabilității, dă următoarea proprietate: este posibilă stocarea piramidei FHT sub forma unei matrice cu o dimensiune cu una mai mare decât dimensiunea imaginii originale (de-a lungul unei axe - numărul de niveluri, ), pentru restul - dimensiunea imaginii). [7]
Un exemplu de implementare în python:
import numpy ca np W = 2 ** 5 H = 2 ** 5 img = np . aleatoriu . aleatoriu ([ H , W ]) def calc_sums ( img , xmin , xmax ): res = np . zerouri ([ W , xmax - xmin ]) dacă xmax - xmin == 1 : res [:, 0 ] = img [:, xmin ] else : mid = ( xmin + xmax ) // 2 ans1 = calc_sums ( img , xmin ) , mid ) ans2 = calc_sums ( img , mid , xmax ) for x in range ( W ): for shift in range ( xmax - xmin ): res [ x , shift ] = ans1 [ x , shift // 2 ] + ans2 [ ( x + shift // 2 + shift % 2 ) % W , shift // 2 ] return res res = calc_sums ( img , 0 , W )
Algoritmul este implementat în biblioteca opencv [8] și poate fi folosit, de exemplu, pentru a găsi rapid punctul de fugă . [9]
Rezolvarea acestei probleme presupune utilizarea unui algoritm pentru cazul bidimensional.
Imaginea haf a planurilor va fi, de asemenea, tridimensională (planul este specificat prin trei coordonate ale vectorului perpendicular pe acesta). Fie dat de parametrizare , unde este coordonata intersecției planului cu limita imaginii pe rază , este coordonata punctului de intersecție cu limita imaginii paralelă cu raza din plan și este diferența dintre coordonatele celui de-al doilea și primul punct de intersecție a planului cu limitele imaginii. Primul punct se află la intersecția planurilor care conțin limita imaginii și planul paralel cu . Al doilea punct se află la intersecția planurilor care conțin limita imaginii, paralel cu și .
Vom numi un plan predominant perpendicular pe axa de coordonate dacă normala la acesta formează un unghi mai mic cu această axă decât cu celelalte două. Vom lua în considerare doar planele care sunt predominant perpendiculare pe axa y. Acestea sunt împărțite în 4 tipuri de pante, așa cum se arată în Figura 4. Fără pierderea generalității, vom presupune că planurile considerate sunt de tip I.
Construirea unei imagini Hough după enumerarea plană are complexitate asimptotică (numărul de planuri înmulțit cu numărul de operații pentru a însuma un plan), unde m, n, k sunt dimensiunile imaginii din fiecare dimensiune.
Transformarea Hough rapidă în acest caz va fi următorul algoritm:
Complexitatea unei astfel de transformări este suma complexității primului pas ( ) și a complexității celui de-al doilea pas ( ), care sunt calculate ca produsul dintre numărul de planuri considerate și numărul de operații pe plan. Total, , în termeni de un avion .
Imaginea haf a unei linii tridimensionale va fi de patru dimensiuni (doi parametri pentru fiecare dintre cele două puncte de pe linie). Fie dat prin parametrizare . sunt coordonatele x, y ale punctului din plan , sunt coordonatele x, y ale punctului de intersecție al dreptei cu limita imaginii paralelă cu planul .
Construcția imaginii-Hough prin enumerarea liniilor tridimensionale are complexitate asimptotică (numărul de linii înmulțit cu numărul de operații pentru însumarea unei linii), unde m, n, k sunt dimensiunile imaginii în fiecare dimensiune.
Transformarea Hough rapidă pentru un astfel de caz este formulată în mod similar cu definiția pentru cazul bidimensional. În cazul bidimensional, posibilitatea deplasării a fost doar de-a lungul unei axe, dar acum deplasarea va fi de-a lungul unei axe, de-a lungul celei de-a doua axe și de-a lungul a două axe în același timp.
Numărarea modelelor de lungime doi necesită (numărul de grupuri de planuri însumabile) înmulțit cu (complexitatea adunărilor pentru fiecare grup) operații. Numărarea modelelor de lungime 4 necesită operații. Lungimile modelului — , unde este definită ca , adică numărul lungimii modelului considerat. Însumând termenii (numărul de lungimi de model posibil pentru imaginea luată în considerare) folosind formula pentru suma unei progresii geometrice, obținem complexitatea algoritmului și complexitatea într-o linie dreaptă . Pentru , complexitatea va fi constantă.
Combinația dintre BPH și principiul a patru rușiÎn ciuda faptului că numărul de operații pe o linie este constant pentru aceeași dimensiune a imaginii în fiecare dimensiune, pentru toate liniile este necesar să se cheltuiască . Dar dacă nu sunt necesare toate liniile, ci este nevoie doar de o parte din ele, atunci se pot precalcula primii pași [10] , îi pot stoca în memorie și apoi se calculează sumele numai pentru acele linii care sunt necesare.
Acest concept a fost consacrat în metoda a patru ruși. Metoda este numită după descoperitorii V. Arlazarov , M. Kronrod, E. Dinits, I. Faradzhev.
În algoritmul original FHT pentru linii tridimensionale, se efectuează un calcul la fiecare nivel pentru linii de o anumită lungime. Pe de altă parte, puteți face un precalcul numai pentru primii pași, apoi puteți calcula pentru liniile necesare.
Pentru a determina numărul optim de pași de precalcul, este necesar să se rezolve următoarea ecuație ( este numărul de linii pe care algoritmul trebuie să le găsească):
În stânga este numărul de operații pentru a efectua precalculul. În dreapta este numărul de operații pentru a găsi sume de-a lungul liniilor solicitate. Fie necesar să se găsească toate liniile, apoi , atunci soluția ecuației va fi , iar laturile stângă și dreaptă sunt egale , ceea ce este mai mic decât fără precalcular. Cu toate acestea, pentru reducerea numărului de operații, este necesar să se plătească cu memorie în aceeași cantitate pe care o ocupă imaginea Hough (proprietatea de invarianță a memoriei ocupate la fiecare nivel de numărare prin algoritmul FHT).
Principiul de calcul se bazează pe utilizarea valorilor nu numai ale ultimului nivel al piramidei FHT (adică imaginea Hough în sine), ci și ale altor niveluri ale piramidei FHT.
Sarcina este împărțită în două subsarcini:
Presupunem fără pierderi de generalitate că . Aici vom lua în considerare doar modele predominant verticale cu o înclinare spre dreapta, adică și . Se folosește și parametrizarea și valoarea este egală cu , unde este dimensiunea imaginii de-a lungul axei .
Lăsați expansiunea binară a parametrului liniei drepte diadice să arate ca Apoi modelul poate fi scris după cum urmează ( - rotunjirea la cel mai apropiat număr întreg.):
calculate din datele sarcinii. este numărul de deplasări ale modelului considerat în banda , care este de asemenea cunoscută. Astfel, este necesar doar să restaurați biții .
Pentru recuperare este folosit un algoritm lacom: toți biții sunt mai întâi zero. Din moment ce , prin urmare, enumerarea se realizează de la un număr mai mare de deplasări la unul mai mic, de la nivel la nivelul 0. Dacă , atunci bitul corespunzător acestui nivel este setat la 1 și scade cu . Pasul se repetă până când ajunge la 0.
Valoarea parametrului se calculează prin . Prin acest parametru, parametrul se calculează după următoarea formulă:
, deci complexitatea algoritmului . [7]
Referindu-ne la figură, se poate observa că un segment arbitrar pe o linie dreaptă se calculează prin găsirea numărului minim de modele diadice care conțin părți de la începutul liniei până la sfârșitul segmentului dat, inclusiv, și numărul minim de modele care conțin segmentul de la începutul liniei drepte până la începutul segmentului dat, excluzând primul pixel al segmentului original. Adică, trebuie să găsiți sumele pentru două segmente cu începutul la marginea imaginii și coordonate diferite de sfârșit.
Pentru a calcula suma peste acest tip de segment de lungime (expansiunea sa binară ) , unde este suma peste modelul din banda --lea a --lea nivel al FHT=piramidă pentru o linie dreaptă cu parametri .
Suma interioară nu necesită un calcul complet la fiecare pas, deoarece se obține din precedentul în timp constant. Astfel, complexitatea algoritmului este proporțională cu numărul de termeni din suma externă, adică este . Deoarece rezultatul este calculat pentru două segmente de acest tip, complexitatea rezultată a algoritmului este de asemenea . Mai mult, este de remarcat faptul că un pixel poate fi multicanal. [7]
Metoda 2Segmentul poate fi compus din numărul minim de modele din cadrul segmentului. Pentru a căuta astfel de modele, trebuie să te uiți la nivelurile piramidei FHT, începând cu ultimele și terminând cu primele. Puteți filtra imediat acele modele care nu sunt incluse în segment. Dacă se găsește un model care se află complet în interiorul segmentului, atunci suma acestuia este inclusă în suma necesară, iar diviziunile sale la nivelurile următoare nu sunt luate în considerare. Această metodă este mai complexă din punct de vedere computațional decât prima, deoarece necesită enumerarea tuturor tiparelor care sunt mai mari de .
Similar cu calculul sumei peste un segment pentru calcularea sumei peste un patrulater din calculele intermediare ale imaginii Hough pentru avioane, cu alte cuvinte, piramida FHT pentru cazul avioanelor.
Presupunând că sunt cunoscuți parametrii planului pe care se află patrulaterul dat, suma dorită se calculează prin formula de includere-excludere luând suma peste patru dreptunghiuri, dintre care un vârf este vârful colțului planului diadic (noi notează-l cu litera , iar segmentele cu acest vârf prin segmentele de colț ). Să notăm coordonatele punctelor cele mai apropiate și cele mai îndepărtate de vârfurile patrulaterului dat prin și respectiv. Sumele segmentelor de colț marcate cu vârfuri la și sunt luate cu semnul plus, iar sumele celor cu vârfuri la și sunt luate cu semnul minus.
Pentru a găsi suma peste un segment unghiular arbitrar, este necesar să o împărțiți în segmente care sunt prezente în piramida FHT. Este necesar să se ia în considerare expansiunile binare ale lățimii și înălțimii segmentului. Similar cu cazul unidimensional, segmentul este împărțit orizontal în dungi verticale și vertical în nu mai mult decât dungi orizontale. Intersecția lor nu va da mai mult decât segmentele prezente într-o piramidă FPH tridimensională. Astfel, complexitatea calculării sumei pe un segment arbitrar echivalează cu operații. [7]
Deși există o anumită eroare în aproximarea unei linii drepte printr-un model diadic, totuși, experimentele arată că această eroare este suficient de mică încât în rezolvarea problemelor este posibil să se înlocuiască algoritmul tradițional de transformare Hough cu algoritmul FHT. [unsprezece]
Aplicând M-estimări problemei de regresie liniară , se pot obține funcții de bază radială . Ele formează o imagine „continuă”, care, la rândul ei, este eșantionată într-o histogramă 2D.
În continuare, convoluția imaginii este efectuată cu un nucleu discretizat corespunzător estimatorului M selectat. Pe baza imaginii primite Hough este calculată folosind FHT. Coordonata maximului în spațiul parametrilor - și va fi M-estimarea dorită.
Sarcina este formulată astfel: este necesar să se găsească un hiperplan care să împartă imaginea în 2 clase. Imaginea este reprezentată ca o histogramă de imagine normalizată .
este hiperplanul dorit care împarte imaginile în două clase , este clasa tuturor elementelor histogramei.
Statistici aditive utilizate ( --a coordonată ):
Există o serie de funcționale potrivite pentru problemele de separare a clusterelor cu diferite proprietăți cunoscute a priori și, în același timp, calculabile în termeni de statistici aditive. Merită menționat încă o dată că aceste funcționale nu sunt în general convexe și singura modalitate sigură de a le găsi valoarea optimă este enumerarea exhaustivă pe grilă în spațiul parametrilor suprafețelor de separare.
Algoritm naiv: Există linii discrete care intersectează histograma cu dimensiune liniară . Pentru fiecare dintre ele este necesar să se efectueze operații de calcul a ponderilor, matricelor de covarianță și, în final, a valorilor criteriului. Astfel, complexitatea computațională a algoritmului naiv este operațiile. În mod similar, se poate demonstra că pentru cazul tridimensional, complexitatea de calcul a algoritmului va fi .
În această etapă, se aplică suma cumulativă: suma elementelor corespunzătoare ale tuturor straturilor imaginii de intrare cu un indice care nu depășește este scrisă în elementul strat cu numărul imaginii de ieșire .
Suma valorilor pixelilor pentru orice linie a imaginii de ieșire este egală cu suma pentru acea parte a imaginii originale care nu se află sub această linie. În plus, suma de-a lungul oricărei linii drepte predominant orizontale din imaginea de ieșire este egală cu suma de-a lungul semiplanului superior delimitat de aceasta în imaginea originală. Pentru o exprimare similară a sumelor peste semiplanurile stângi prin linii drepte predominant verticale, în locul celei verticale, este necesară efectuarea sumei cumulate orizontale a imaginii.
Algoritm:
Dacă pur și simplu însumăm toate hiperplanurile, atunci în cazul bidimensional complexitatea este , în cazul tridimensional . (In -dimensional )
Însumarea peste hiperplanuri (linii drepte în 2D, planuri în 3D...) se poate face folosind FHT. Acest lucru ajută la reducerea complexității de la la pentru fiecare dintre imagini. Adică acum complexitatea este în cazul bidimensional , în cel tridimensional .
Deci algoritmul final este:
Complexitate: timp , memorie .
În cazul bidimensional, mai detaliat:
Dificultatea finală:
În cazul 3D mai detaliat:
Dificultatea finală:
Următoarele sunt doar câteva dintre problemele care pot fi rezolvate folosind transformarea Hough.