Come calcolare un valore di "densità" per ciascun pixel all'inizio, in base alla sua vicinanza a tutti gli altri pixel. Quindi, rimuovi ripetutamente il pixel più "denso" finché non rimani sotto il p% rimanente nell'elenco.
Avresti bisogno di fare il calcolo della distanza per determinare la densità tra ogni dato due punti al massimo due volte. La prima volta sarebbe quando costruirai la lista originale - ogni pixel avrebbe bisogno di essere confrontato tra loro. Il secondo sarebbe quando rimuovete un pixel dall'elenco - dovreste calcolare quello rimosso contro ciascuno rimasto nell'elenco. Questo è per tenere conto dei valori di densità che cambiano man mano che ciascun pixel viene rimosso - ad esempio, 2 pixel direttamente uno accanto all'altro avranno un valore molto alto, ma una volta rimosso, il rimanente potrebbe avere un valore molto basso.
Un rapido pseudocodice (si noti che in questo esempio, le aree ad alta densità hanno un numero basso)
For I = 0 to MaxPixel
For J = I to MaxPixel
PixelDensity[I], PixelDensity[J] += DistanceBetween(Pixels[I], Pixels[J])
While PixelDensity.Count > TargetCount
RemovePixel = IndexOfSmallest(PixelDensity)
ForEach I in PixelDensity
PixelDensity[I] -= DistanceBetween(Pixels[I], Pixels[RemovePixel])
PixelDensity.Remove(RemovePixel)
Se la memoria è meno di una preoccupazione di tempo di calcolo, è possibile anche memorizzare la distanza tra due punti qualsiasi in un semplice array 2d. Inoltre, invece di una semplice distanza, potrebbe essere utile rendere il calcolo della distanza esponenziale - ciò eviterebbe qualcosa come avere due punti quasi uno sopra l'altro, ma molto lontano da tutto il resto, e avere entrambi passare attraverso.
Questa domanda è interessante in quanto è abbastanza semplice concettualizzare il problema, e notevolmente difficile trovare una risposta (che finirà nella nostra vita). – Beska
Come ho già detto, non deve essere perfetto. Sto pensando di utilizzare "blocchi predefiniti", n x n regioni con punti preselezionati in base al p% e che coprono l'array di pixel con questi. – user20493
Sì ... ci stavo pensando ... ma mi è venuto in mente che potresti finire con alcuni artefatti per colpa di quello. – Beska