Определение ориентации сетки и свойств

У меня есть коллекция из множества точек, расположенных в виде сетки. Учитывая эти точки, как мне определить свойства этой сетки, такие как вращение, расстояние между линиями и т. Д.? Если бы был какой-то алгоритм для подгонки к этим данным множества параллельных и перпендикулярных линий, я мог бы усреднить расстояние между линиями, угол и т. Д. И т. Д. Каков наилучший способ сделать это?

ОБНОВЛЕНИЕ: данные, с которыми я работаю, выглядят примерно так:

Это будет чище в будущем, но мне просто нужен какой-то способ для интерполяции и анализа этой сетки, как шаблон.

3 ответа

Если точки расположены на сетке, то квадрат расстояния между двумя точками равен d² × (м² + n²), где d - это постоянная сетки (предположим, что это двумерная прямоугольная сетка с одинаковой постоянной в обоих основных направлениях).), а m, n - целые числа, определяющие (аффинное) различие между двумя точками (или, проще, число интервалов сетки между двумя точками вдоль осей "x" и "y"). Итак:

  • вычислить квадрат расстояния между точкой и всеми другими точками;
  • разделив их на минимальное, вы получите рациональные числа, которые дают вам подсказки о постоянной сетки d и относительных "координатах" m, n.

Если у вас есть только изображение сетки, вы можете попробовать radon функция из "панели инструментов обработки изображений". Это даст вам углы, и из преобразования радона вы можете пересчитать расстояние между линиями точек на вашем изображении.

Вот пример кода для radon функция

% First we generate a grid of points on image
ImgW        = 400;
ImgH        = 300;
DIdx                    = ImgH + round(rand(1)*ImgH/10);
ImgGrid                 = zeros(ImgH,ImgW);
ImgGrid(1:DIdx:end)     = 1;

% Then we calculate radon transform
theta                   = 0:0.1:180;
[R,xp]                  = radon(ImgGrid,theta);

% Then we calculate standard deviation for each angle of R
Rstd                    = std(R);
% and find maximal value of std(R) columnwise
[RstdMax,RstdIdx]       = max(Rstd);
ThMax                   = theta(RstdIdx);

% Now we show results
figure('Color','w');
subplot(2,2,1);     imshow( ImgGrid );
                    axis on;
                    colormap(hot(255));
                    title('Grid image');
                    line( ImgW/2+[-1 +1]*min(ImgW,ImgH)/2*cosd(-ThMax), ...
                          ImgH/2+[-1 +1]*min(ImgW,ImgH)/2*sind(-ThMax), 'Color','y' );
subplot(2,2,3);     plot(xp,R(:,RstdIdx),'.-');
                    title(sprintf('Profile at %.2f deg (the yellow line)',ThMax));

subplot(2,2,2);     imagesc( log10(R+1), 'Xdata',theta, 'Ydata',xp );
                    axis on;
                    colormap(hot(255));
                    xlabel('\theta (degrees)');
                    ylabel('x''');

subplot(2,2,4);     plot(theta,Rstd,'.-');
                    title('std(R)');

НО в общем случае это не даст вам векторы решетки для сетки! Это даст вам только расстояние между линиями точек вместо этого. Если вам нужны векторы решетки, вы должны пересчитать их. Но если вам повезет, и ваша решетка будет прямоугольной... надеюсь, вы поняли; о)

Вам еще больше повезет, если у вас есть (x,y) координаты ваших точек. Подход, предложенный CST-Link, несколько "слишком грубый". Я предпочел бы рассчитать "структурный фактор" для ваших очков (см. http://en.wikipedia.org/wiki/Structure_factor и ссылки на учебник в конце статьи) и проанализировать его максимумы.

Если у вас есть координаты каждой точки, все может быть не так сложно.

Было бы неплохо провести PCA по этим координатам. Первый главный компонент будет осью вдоль длинной стороны вашей сетки, второй главный компонент будет осью более короткой стороны.

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

Другие вопросы по тегам