2011-10-10 105 views
0

我目前正在研究一个涉及像素级二进制图像处理(细化,聚类等)的项目。许多使用的算法涉及检查相邻像素的属性。像素对象定义为:如何链接/指向C#中的特定对象?

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

我可以创建包含用于顺序处理它们在图像中的所有像素的列表,但我想每个像素的列表中的链接到他们的位置在网格上以有效地得到其相邻像素的属性。

例如,如果我有地图[7,7]用9个像素[A至I]在地图, http://i.imgur.com/lTzSM.jpg 和我想检查每个像素的每个邻居的ClusterNumber的值。在列表中遍历8次查找每个像素的邻居似乎是非常低效的,并且使用该网格来检查邻居会更容易。有没有办法在网格中引用pixel,以便我可以访问其属性作为列表中当前像素的邻居?我曾想过创建一个包含列表中像素索引的int[,] map = new int[width,height],但是当像素从列表中移除时会产生问题,并且每次将像素从列表中移除时都需要更新地图。

另外,有一种方法,我可以链接/点在类的像素的邻居本身使得(示意图)我可以访问了邻居的属性

//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; 

任何意见/指导,将不胜感激。

回答

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

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

这里需要初始化期间分配的所有邻居像素。如果当前像素位于边缘附近,则只需将其指定为空。但是,当你使用它们时,不要忘记检查空值。

+0

谢谢。如果我理解正确,这将是邻居像素的克隆,而不是链接/指向像素本身。如果邻居像素的任何属性发生更改,我将需要重新分配它,并在删除邻居像素后将其分配给空值。如果在neigboring像素上发生事件(例如,ClusterNumber变化),我该如何将它指向它的邻居像素? – pantz

+0

不,如果您只是简单地指定一个值,例如'_neighborN = myExistingPixel',您将会引用一个对象。看看链表和双链表的实现(你可以轻松地谷歌他们) –

+0

我不知道这一点。我认为它不会反过来,所以'neigborN'的更改不会反映在'myExistingPixel'上。如何更改'neigborN'的属性,这将反映在'myExistingPixel'上? – pantz

相关问题