Как мне связать / указать на определенные объекты в C #?

#c# #data-structures #image-processing

#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 раз, чтобы найти соседей каждого пикселя, и было бы проще использовать сетку, чтобы просто проверить соседей. Есть ли способ ссылаться на a 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;
  

Любые советы / рекомендации будут оценены.

Ответ №1:

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

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

Здесь вам нужно назначить все соседние пиксели во время инициализации. Если текущие пиксели находятся рядом с краем, вы просто присваиваете ему значение null. Но не забывайте проверять нулевые значения при работе с ними.

Комментарии:

1. Спасибо. Если я правильно понимаю, это будет клон соседнего пикселя, а не ссылка / точка на сам пиксель. Мне нужно будет переназначить его, если какое-либо из свойств соседнего пикселя изменится, и присвоить ему значение null после удаления соседнего пикселя. Если событие (например, изменение номера кластера) происходит в соседнем пикселе, как мне указать его обратно на пиксель, соседним с которым он является?

2. Нет, у вас будет ссылка на объект, если вы просто присвоите значение, например _neighborN = myExistingPixel . Взгляните на реализацию связанного списка и двойного связанного списка (вы можете легко их погуглить)

3. Я этого не знал. Я предполагаю, что это не работает наоборот, так что изменения в neigborN не будут отражены myExistingPixel . Как мне изменить свойство neigborN , которое отразится на myExistingPixel ?

4. На чем основаны ваши предположения? Если вы не верите, что это работает, просто попробуйте. Когда вы объявляете переменную, вы объявляете не объект, а ссылку на объект в памяти. Ссылка не заботится о внутреннем состоянии данных объекта, на которое она указывает.