2011-10-10 3 views
0

Je travaille actuellement sur un projet de manipulation d'images binaires au niveau des pixels (amincissement, clustering, etc.). La plupart des algorithmes utilisés impliquent la vérification des attributs des pixels voisins. Un objet pixel défini comme:Comment lier/pointer vers des objets spécifiques en C#?

Public class pixel 
{ 
int x, y; 
int NumberOfNeighbours; 
int ConnectivityNumber; 
int ClusterNumber; 
} 

je peux créer une liste contenant tous les pixels de l'image pour les traiter de manière séquentielle mais je veux relier chacun des pixels dans la liste à leur position sur une grille pour obtenir efficacement propriétés de ses pixels voisins.

Par exemple, si j'ai une carte [7,7] avec 9 pixels [A à I] sur la carte, http://i.imgur.com/lTzSM.jpg et je veux vérifier la valeur de la ClusterNumber de chaque voisin de chaque pixel. Il semble très inefficace de parcourir la liste 8 fois pour trouver les voisins de chaque pixel et il serait plus facile d'utiliser la grille pour vérifier les voisins. Y at-il un moyen de référencer un pixel dans la grille afin que je puisse accéder à ses propriétés en tant que voisin du pixel actuel dans la liste? J'ai pensé à créer un int[,] map = new int[width,height] contenant les index des pixels de la liste, mais cela crée un problème quand un pixel est retiré de la liste et que la carte doit être mise à jour chaque fois qu'un pixel est retiré de la liste.

Sinon, est-il possible que je peux relier/point de les voisins d'un pixel dans la classe elle-même telle que (schématiquement) Je pourrais accéder aux propriétés d'un voisin

//list[0].NeighborE == null 
//list[0].NeighborNE == B 
//list[0].neighborN == null 
//... 
//list[1].NeighborE == G 
//list[1].NeighborNE == D 
//list[1].NeighborN == C 
//list[1].NeighborNW == null 
... 
if (list[i].NeighborE.ClusterNumber > 2) 
    list[i].ClusterNumber = 2; 

serait appréciée Tous les conseils/conseils .

Répondre

0
Public class pixel 
{ 
    int x, y; 
    int NumberOfNeighbours; 
    int ConnectivityNumber; 
    int ClusterNumber; 

    //neighbors: 
    Pixel _neighborN; 
    Pixel _neighborNE; 
    ... 
    Pixel _neighborNW; 
} 

Ici, vous devez attribuer tous les pixels voisins lors de l'initialisation. Si les pixels actuels sont proches du bord, vous l'affectez simplement à null. Mais n'oubliez pas de vérifier les valeurs nulles lorsque vous opérez avec elles.

+0

Merci. Si je comprends bien, ce serait un clone du pixel voisin et non un lien/point vers le pixel lui-même. Je devrais le réaffecter si l'une des propriétés du pixel voisin change et l'affecter à null une fois qu'un pixel voisin est supprimé. Si l'événement (par exemple ClusterNumber change) se produit sur le pixel neigboring, comment puis-je le renvoyer au pixel dont il est le voisin? – pantz

+0

Non, vous aurez une référence à un objet si vous affectez simplement une valeur comme '_neighborN = myExistingPixel'. Jetez un oeil à la mise en œuvre de la liste liée et double liste liée (vous pouvez facilement les google) –

+0

Je ne savais pas cela. Je suppose que cela ne fonctionne pas dans l'autre sens, de sorte que les changements de 'neigborN' ne seront pas reflétés sur' myExistingPixel'. Comment changer une propriété de 'neigborN' qui se reflétera sur' myExistingPixel'? – pantz

Questions connexes