Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]algoritmo di ordinamento e colore

    ciao.
    Sto cercando di implementare un algoritmo che mi divida dei punti in base alla loro vicinanza.
    Ho la X e la y di tutti i punti, basta utilizzare un algoritmo di sort?
    il problema è che io voglio fare un sort in base alla vicinanza.
    Per adesso, non so se è giusto o sbagliato ho creato una mappa con un colore interpolato da 0 a 1 e su questa ho messo i miei punti.
    quando trovo un punto carico il colore dalla mappa(con la x e la y) e lo assegno al punto.
    Infine faccio il sort dei colori.

    Questa è una soluzione naif, e per adesso non l'ho nemmeno ultimata, ci sto lavorando con opencl.
    ma prima di buttarmici del tutto volevo sentire voi.
    mi chiedevo se la stessa cosa possa essere fatta in "linguaggo matematico" non in informatichese.
    grazie.

  2. #2
    Ma vicinanza tra un punto e l'altro o vicinanza rispetto all'origine?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    no, vicinanza tra un punto e gli altri.
    se uso un gradiente il colore in x e y mi da la vicinanza , perchè interpolato sia in x che in y.

  4. #4
    La "vicinanza di un punto a tutti gli altri" non vuol dire niente... E se ho capito bene, il tuo metodo del gradiente equivale in sostanza a valutare la distanza di ciascun punto rispetto all'origine.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    si, è vero ,ci sono arrivato adesso.
    ma è possibile ordinare in gruppi i punti vicini tra loro sia in x che in y?
    o meglio i punti che hanno una distanza dall origine simile?
    dato un valore di vicinanza minima?
    grazie.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    ti spiego a cosa mi serve:
    Esistono degli algoritmi che non ho fatto io (per fortuna) che estraggono i contorni dalle immagini, io per ogni punto che è un contorno ho la vicinanza dall'origine, ragruppando per valori simili posso estrarre le linee dei contorni (che sono i punti vicini)agendo su un fattore di "vicinanza".
    è possibile fare qualcosa del genere con un algoritmo di ordinamento?
    grazie.

  7. #7
    È una cosa su cui stavo lavorando anch'io ma che ho momentaneamente accantonato perché dovrei informarmi meglio; il codice che ho "buttato lì" fa un sampling dei punti derivanti da un sobel applicato sull'immagine (con probabilità maggiore di essere pescati per i punti più intensi), e quindi, partendo da un punto a caso, procede a cercare via via il punto più vicino.
    Fa questo andando a cercare, tra i punti rimasti, il punto che minimizza la distanza euclidea con il punto correntemente in esame (sostanzialmente è un selection sort). Non credo si possa usare un algoritmo di ordinamento migliore perché sulla vicinanza tra coppie di punti sul piano (o in generale, in R^n) non si può costruire una relazione d'ordine adeguata.
    codice:
    // Random choice for the first point
    std::swap(sobelPts[rand()%sobelPts.size()], sobelPts[0]);
    
    // Selection sort, since we aren't in a real "strict weak ordering" situation
    // (and sobelPts.size() is going to be small anyway)
    for(unsigned int i=0; i<sobelPts.size()-1; i++)
    {
        double minDist=1./0.;
        unsigned int swapIdx=i+1;
        for(unsigned int j=i+1; j<sobelPts.size(); j++)
        {
            double dist=sobelPts[i].Distance(sobelPts[j]);
            if(dist<minDist)
            {
                swapIdx=j;
                minDist=dist;
            }
        }
        std::swap(sobelPts[i+1], sobelPts[swapIdx]);
    }
    Quindi riesamina il vettore "ordinato", calcola la media delle distanze tra un punto e l'altro e, se trova un link sensibilmente più grande della media, scarta tutti i punti da lì in poi (in genere significa che da lì in poi ci sono dei punti che non c'entrano, o che, in ogni caso, il link è "sbagliato" e i dati lì non sono più affidabili).

    Per ottenere risultati decenti io ripetevo questo procedimento un migliaio di volte, calcolando per ogni tentativo una "fitness" (legata a quanti punti "buoni" del sobel vengono ricalcati dai link) e tenendo alla fine il tentativo con la fitness migliore (è un po' un algoritmo di tipo RANSAC).

    In ogni caso, credo che ci siano algoritmi migliori, sto studiando in questo periodo un libro di visione artificiale, se mi imbatto in qualcosa di interessante in proposito ti faccio sapere.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie, sempre gentile.
    ti volevo dire che cercando su google ci sono degli algoritmi detti di "clustering" che mi sto guardando e fanno quello che cercavi di fare, guarda qui .
    ma per il fatto di ricercare dei colori simili non puo essere una soluzione?
    perchè pensandoci è si la distanza dall origine, ma è anche la distanza dai punti vicini, non unisce le due cose interpolando sia in x sia in y su un unico colore?

    comunque grazie e ciao.

  9. #9
    Originariamente inviato da giuseppe500
    grazie, sempre gentile.
    ti volevo dire che cercando su google ci sono degli algoritmi detti di "clustering" che mi sto guardando e fanno quello che cercavi di fare, guarda qui .
    Ni, io ora sto cercando di tracciare un contorno ("unire i puntini"), non raggruppare datapoint; ho anche una questione di segmentazione dell'immagine in ballo, ma quella la riesco a risolvere abbastanza ricercando le componenti connesse per pixel (di fatto usando un floodfill su una copia riscalata dell'immagine).
    ma per il fatto di ricercare dei colori simili non puo essere una soluzione?
    perchè pensandoci è si la distanza dall origine, ma è anche la distanza dai punti vicini, non unisce le due cose interpolando sia in x sia in y su un unico colore?
    Stai semplicemente spostando il confronto dalla coppia (x, y) al colore, che cosa cambia? Non esiste comunque un ordinamento "assoluto" tra i colori - puoi ragionare in termini di luminosità, di distanza sul cilindro HSV, di distanza nel cubo RGB, ... Comunque se quello che ti serve è ordinare i punti per distanza dall'origine perché non usi un normale sort usando come funzione di confronto una funzione che confronta la distanza dall'origine (=norma euclidea)?
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Comunque se quello che ti serve è ordinare i punti per distanza dall'origine perché non usi un normale sort usando come funzione di confronto una funzione che confronta la distanza dall'origine (=norma euclidea)?
    il fatto è che se uso la distanza dall origine posso trovare col sort mettiamo una posizione con 20 in x e 0 in Y e una con 0 in X e 20in Y, non è corretto e non è quello che voglio fare .
    Ho un po paura di coprirmi di ridicolo non avendo una preparazione adeguata come la tua, ma quello che vorrei fare è una sorta di calcolo differenziale con l'uso dei gradienti di colore in x e in y ovvero prendendo i delta come pezzettini di incremento(dati dall'interpolazione) come nel calcolo differenziale.
    ciao.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.