Фон
Я работаю с очень большими наборами данных со спутников Radar Synthetic Aperture. Их можно рассматривать как изображения с высокой яркостью с высоким динамическим диапазоном порядка 10 тыс. Пикселей на стороне.
В последнее время я разрабатываю приложения одномасштабного варианта метод алгоритма определения масштаба шкалы Lindeberg для определения линейных характеристик в изображении SAR. Это усовершенствование использования направленных фильтров или использование преобразования Hough Transform, которые ранее использовались, потому что они менее дорогостоящи по сравнению с другими. (Я представлю некоторые недавние результаты в JURSE 2011 в апреле, и я могу загрузить препринт, если это будет полезно).
Используемый мной код генерирует массив записей, по одному на пиксель, каждый из которых описывает сегмент хребта в прямоугольнике справа от пикселя и ограничен соседними пикселями.
struct ridge_t { unsigned char top, left, bottom, right };
int rows, cols;
struct ridge_t *ridges; /* An array of rows*cols ridge entries */
Запись в ridges
содержит сегмент хребта, если ровно два из top
, left
, right
и bottom
имеют значения в диапазоне 0 - 128. Предположим, что у меня есть:
ridge_t entry;
entry.top = 25; entry.left = 255; entry.bottom = 255; entry.right = 76;
Затем я могу найти начало сегмента хребта (x1, y1) и end (x2, y2):
float x1, y1, x2, y2;
x1 = (float) col + (float) entry.top / 128.0;
y1 = (float) row;
x2 = (float) col + 1;
y2 = (float) row + (float) entry.right / 128.0;
Когда эти отдельные сегменты хребта визуализируются, я получаю изображение примерно так (очень маленький угол гораздо большего изображения):
Каждая из этих длинных кривых выводится из серии крошечных сегментов хребта.
Это тривиально, чтобы определить, связаны ли два соседних местоположения, которые содержат сегменты хребта. Если у меня есть ridge1
at (x, y) и ridge2
at (x + 1, y), то они являются частями одной и той же строки, если 0 <= ridge1.right
<= 128 и ridge2.left
= ridge1.right
.
Проблема
В идеале я хотел бы сшить все сегменты хребта в линии, чтобы затем я мог перебирать каждую строку, найденную на изображении, для применения дальнейших вычислений. К сожалению, мне трудно найти алгоритм для этого, который является как низкой сложностью, так и эффективен с точки зрения памяти и подходит для многопроцессорности (все важные соображения при работе с действительно огромными изображениями!)
Один из подходов, который я рассмотрел, - это просмотр изображения до тех пор, пока я не найду хребет, у которого есть только один связанный сегмент хребта, а затем идущий по результирующей линии, отмечающий любые гребни в строке, как было посещено. Однако это не подходит для многопроцессорности, потому что нет способа сказать, нет ли другой нитки, идущей по одной и той же линии с другого направления (скажем) без дорогостоящей блокировки.
Что читатели предлагают в качестве возможного подхода? Кажется, что-то вроде того, что кто-то понял бы эффективный способ сделать в прошлом...