Как интерполировать координаты вектора на изображении с помощью MATLAB? - PullRequest
3 голосов
/ 01 марта 2010

Например, если у меня есть вектор, описывающий прямоугольник

xy=[165  88; 
    401  88; 
    401 278; 
    165 278];

на изображении.

Как мне получить следующий вектор

[165  88; % increase X -     hold y
 166  88; 
 167  88;
   ...  ;
 399  88;
 400  88;
 401  88; % hold     x - increase y
 401  89;
 401  90;
 401  91;
   ...  ;
 401 276;
 401 277;
 401 278; % decrease X -     hold y
 400 278;
 399 278;
 398 278;
   ...  ;
 167 278;
 166 278;
 165 278; % hold     x - decrease y
 165 277;
 165 276;
   ...  ;
 165  87];

с использованием встроенной функции MATLAB или мне нужно написать ее, используя FOR LOOPS?

Алгоритм должен работать для общего вектора с n-точками и координатами xy.

Ответы [ 3 ]

4 голосов
/ 01 марта 2010

Если у вас есть набор инструментов для обработки изображений, вы можете сделать это, создав изображение многоугольника с последующим нахождением контура:

xy=[165 88; 401 88; 401 278; 165 278];
%# create the image - check the help for impolygon for how to make sure that
%# your line is inside the pixel
img = poly2mask(xy(:,1),xy(:,2),max(xy(:,1))+3,max(xy(:,2))+3);
figure,imshow(img) %# show the image

%# extract the perimeter. Note that you have to inverse x and y, and that I had to
%# add 1 to hit the rectangle - this shows one has to be careful with rectangular 
%# polygons
boundary = bwtraceboundary(logical(img),xy(1,[2,1])+1,'n',8,inf,'clockwise');

%# overlay extracted boundary
hold on, plot(boundary(:,2),boundary(:,1),'.r')

Отредактировано, чтобы показать, как использовать bwtraceboundary и предупредить о смещении пикселей с помощью прямоугольников.

0 голосов
/ 01 марта 2010

Быстрый и грязный способ нарисовать прямые в матрице вне экрана - вычислить формулу a*X+b*Y=c.

Пусть h и w будут шириной и высотой вашего буфера:

X = repmat([0:w-1], h, 1)
Y = repmat([0:h-1]', 1, w)

Для каждой пары точек (x1, y1) -> (x2, y2) a, b и c равны:

a = y2-y1
b = x1-x2
c = x1*y2-x2*y1

Теперь вычисляем прямолинейность:

st = a*X+b*Y-c
st(abs(st)>1) = 1
st = 1 - abs(st)

Matrix st - это матрица w * h, содержащая сглаженную прямую, проходящую через точки (x1, y1) и (x2, y2). Теперь перейдем прямо к линии, маскируя ненужные части:

[xs] = sort([x1 x2])
st = st .* [zeros(h, xs(1)) ones(h, xs(2)-xs(1)) zeros(h, w-xs(2))]
[ys] = sort([y1 y2])
st = st .* [zeros(ys(1), w) ; ones(ys(2)-ys(1), w) ; zeros(h-ys(2), w)]

Мы только что нарисовали одну линию вручную без какого-либо явного зацикливания. Однако нет никаких гарантий эффективности кода: -)

Наконец: добавьте еще одно измерение к каждой формуле выше (оставлено в качестве упражнения для читателя).

0 голосов
/ 01 марта 2010

Одно решение с использованием IND2SUB:

xy=[165 88; 401 88; 401 278; 165 278];
xmin = min(xy(:,1))-1;
xmax = max(xy(:,1));
ymin = min(xy(:,2))-1;
ymax = max(xy(:,2));

ncol=xmax-xmin;
nrow=ymax-ymin;

[xn yn]=ind2sub([nrow ncol],1:nrow*ncol);
xypairs = [xn'+xmin yn'+ymin];
...