Ho etichettato i componenti collegati in un'immagine binaria e ho trovato le loro aree e caselle di delimitazione. I componenti non sono necessariamente riempiti e possono contenere buchi. Desidero identificare la componente che più somiglia ad un alunno. Per questo, vorrei anche estrarre ( solo ) le loro lunghezze esterne del perimetro, per calcolare la circolarità, poiché queste sono buone caratteristiche per il rilevamento degli alunni.
Ho intenzione di fare questo in modo sequenziale e poi spostare l'algoritmo in CUDA in seguito, quindi l'algoritmo dovrebbe essere parallelizzabile in una certa misura. Devo notare che questo lavoro è per la mia tesi, e non ti sto chiedendo di risolvere nulla per me, basta fornire un feedback sulla mia ricerca fino ad ora.
Ho studiato tonnellate di articoli per questo problema, ma sembra che la maggior parte di essi riguardi l'etichettatura dei componenti connessi e non l'estrazione delle caratteristiche. Ahimè, ho trovato tre candidati e due uno dei miei progetti:
-
Algoritmo Marching Squares . Sembra promettente (anche imbarazzantemente parallelo), ma sembra estrarre tutte le lunghezze del perimetro, compresi i contorni interni, senza modifiche, che probabilmente sovrastimeranno le lunghezze del perimetro. Tuttavia, dal momento che sto cercando l'allievo, un'area omogeneamente colorata, probabilmente non sopravvaluterà l'allievo. La sovrastima potrebbe anche produrre risultati negativi per altri blob di forma irregolare, che dovrebbero andare bene se non vengono selezionati.
-
l'algoritmo del codice catena ( utilizzato dalla funzione findContours di OpenCV): Sembra anche molto buono, e esistono soluzioni parallele, ma temo che potrebbe fallire se il criterio di arresto non è abbastanza buono (vedi qui , in basso vicino al criterio di arresto di Jacob). Tuttavia, dovrebbe essere in grado di estrarre solo il contorno esterno e dare buone approssimazioni .
-
Gli algoritmi dello scafo convesso : mentre esistono soluzioni parallele, temo che potrebbe rendere un blob più circolare di quanto non sia in realtà, se i punti sono sparsi in un modo che favorisce questo. Dovresti comunque dare buoni risultati per il blob dell'allievo.
-
Algorithm 1 : puoi avviare alcuni thread che tracciano da ciascun lato della bounding box del blob verso il lato opposto. Quando i thread "colpiscono" un pixel con l'etichetta del blob, lo contrassegnano come visitato e sommano i colpi. Quando viene tracciato un altro lato, i pixel visitati vengono ignorati, i pixel colpiti vengono sommati di nuovo ecc. E il totale viene restituito. -
Algorithm 2 : ho anche provato a contare il numero di pixel con un pixel di sfondo nel loro Quartiere di Moore , ma questo sovrastima il contorno se sono presenti sufficienti fori.
Gradirei alcuni suggerimenti prima di provare a codificare tutto dato che sono in programma. Di nuovo, sto solo chiedendo consulenza, non soluzioni.