2013-08-06 2 views
1

Я разрабатываю инструмент, который позволяет вам крутить/заключать предметы на 3d-том. Я хочу сэкономить время, пометка «ломтиками» 1 и 3 и «заполнение» фрагмента 2 из этой информации.Интерполирование между двумя плоскостями в 3d-пространстве

Два простых решений являются:

1. slice2 = slice1 AND slice3 (gets the overlap between the two) 
2. slice2 = slice2 OR slice3 (true for any pixel true in either image) 

Это нормально и быстро, но я бы предпочел, чтобы сделать что-то более интеллектуальное, делая форму какого-то средней/интерполяции между ними. Вы можете представить это как попытку найти скалистое лицо, которое соединяет плоскость на уровне видения и какое-то плато в воздухе.

Пример: Заполните ломтиками 2-4 из этой 3d-матрицы. (Создано с использованием montage) slices one through five

Не стесняйтесь придумывать совершенно новые идеи. Я собираюсь высказать свои мысли до сих пор ниже.

Некоторые вещи, о которых я думал, могут помочь вам, ответчик, но что я не смог успешно использовать.
- Вы можете сделать bwperim для каждого изображения.
- Вы можете попробовать «усреднить» изображения (или средневзвешенное значение).

Лучшее, что я получил до сих пор:

Добавить изображения. Дает вам наложение и два периметра:
- внутренний периметр (внутри которого обязательно будет 1)
- и внешний периметр (внутри которого сомнительно).
Вы также можете замаскировать область, которая> 0 И < 2, которая является маской этой сомнительной области.
Запуск bwdist на два-периметре изображения и маски, которые:

masked bwdist image

Не знаю, как идти дальше, хотя. Линия, которая приняла «максимальный» контур вдоль этой области, будет работать, но я не уверен, как это сделать.

Любые идеи по исправлению моей идеи или любых других идей приветствуются!

Спасибо.

+1

Использование 'bwmorph (маски, 'Skel', инф) делает ОК ответ. Чтобы сделать эту работу, я бы применил ее к срезам [1 5], чтобы получить срез 3. Затем срезы [1 3], чтобы получить 2 ... – Frederick

ответ

2

Я понял это сегодня, после прочтения: «Полуавтоматическая сегментация трехмерных объектов в медицинских изображениях» Шенка и др. и др.

вот функция, которую я написал:

function out = interp_shape(top,bottom,num) 


if nargin<2; 
    error('not enough args'); 
end 
if nargin<3; 
    num = 1; 
end 
if ~num>0 && round(num)== num; 
    error('number of slices to be interpolated must be integer >0'); 
end 

top = signed_bwdist(top); % see local function below 
bottom = signed_bwdist(bottom); 

r = size(top,1); 
c = size(top,2); 
t = num+2; 

[x y z] = ndgrid(1:r,1:c,[1 t]); % existing data 
[xi yi zi] = ndgrid(1:r,1:c,1:t); % including new slice 

out = interpn(x,y,z,cat(3,bottom,top),xi,yi,zi); 
out = out(:,:,2:end-1)>=0; 

function im = signed_bwdist(im) 
im = -bwdist(bwperim(im)).*~im + bwdist(bwperim(im)).*im; 

enter image description here

Смежные вопросы