#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. На чем основаны ваши предположения? Если вы не верите, что это работает, просто попробуйте. Когда вы объявляете переменную, вы объявляете не объект, а ссылку на объект в памяти. Ссылка не заботится о внутреннем состоянии данных объекта, на которое она указывает.