расширенное использование команды Matlab roipoly

Я новичок в Matlab и работаю над обработкой изображений. Я использую функцию roipoly для создания маски. Насколько я понимаю, я могу использовать это так:

I = imread('eight.tif');
c = [222 272 300 270 221 194];
r = [21 21 75 121 121 75];
BW = roipoly(I,c,r);
figure, imshow(I)
figure, imshow(BW)

Изображение показано ниже: image1

Одно наблюдение, которое у меня было, заключалось в том, что интерполяция между соседними точками, как указано в матрице c и r, выполняется с помощью «линейной интерполяции», в другом смысле между точками всегда проводится прямая линия. Возможно ли, что каким-то образом включены другие типы интерполяции, такие как интерполяция квадратичным или кубическим сплайном?

Предположим, что я действительно хотел сделать это, как показано на рисунке ниже. [Простите мой рисунок, он не очень хорош].

image2

Здесь кружками показаны точки на контуре. Я хотел, чтобы извлекаемая или создаваемая фигура имела форму, показанную линиями. Как видите, это возможно только в том случае, если мы делаем интерполяцию с помощью сплайнов или квадратных уравнений, а не линейной интерполяции, которую выполняет roipoly.

Как я могу это сделать ? Вы можете мне помочь?


person roni    schedule 02.08.2013    source источник


Ответы (1)


Вы можете использовать imellipse:

I = imread('eight.tif');
% roughly estimating ellipse values from your given c/r
c = [222 272 300 270 221 194];
r = [21 21 75 121 121 75];
xmin = min(c);
ymin = min(r);
width = range(c);
height = range(r);

h_im = imshow(I);
e = imellipse(gca,[xmin ymin width height]);
BW = createMask(e,h_im);

figure, imshow(I)
figure, imshow(BW)

Если вы не хотите использовать затмение, вы можете использовать interp1 или другие функции интерполяции для c и r :

% editing r and c so the shape closes - just take first value, append to end:
c = [222 272 300 270 221 194 222];
r = [21 21 75 121 121 75 21];
% adjust interpolation to suit
c2 = interp1(1:7,c,1:0.2:7,'pchip');
r2 = interp1(1:7,r,1:0.2:7,'pchip');
BW2 = roipoly(I,c2,r2);

пример интерполированного роиполи

person nkjt    schedule 02.08.2013
comment
Нет, это не сработает на самом деле. Нет никакой гарантии, что точки на контуре будут расположены так равномерно. Я хотел нарисовать фигуру, даже если точки не расположены в «хорошем» геометрическом узоре. Поэтому я специально задал свой вопрос об интерполяции. - person roni; 02.08.2013
comment
Вы имеете в виду, что они неравномерно расположены вокруг объекта или что желаемая форма не может быть приблизительно определена затмением? Пример был бы хорош, но пока посмотрите редактирование для использования interp1 или аналогичного. - person nkjt; 02.08.2013
comment
Спасибо. Это может сработать. Я буду пробовать это. И да, вы правильно поняли! Это работает блестяще. Я принял твой ответ! Не могли бы вы сказать мне, могу ли я написать свою собственную настраиваемую функцию, чтобы интегрировать ее в функцию roipoly? Не могли бы вы рассказать мне о правилах... - person roni; 03.08.2013
comment
Еще вопрос @nkjt. Поскольку мы имеем дело с двумерными наборами данных, не лучше ли использовать interp2? - person roni; 03.08.2013
comment
Для interp2 вам понадобятся X, Y и Z - Z является функцией X и Y, interp2 интерполирует его по некоторым новым значениям XI и YI. - person nkjt; 03.08.2013