2015-03-08 3 views
1

У меня есть объем (изображение) и минимальная ограничивающая рамка, которая обертывает определенную структуру. Я использовал следующий алгоритм для извлечения минимального ограничивающего прямоугольникаизвлечение минимальной ограничивающей рамки

http://uk.mathworks.com/matlabcentral/fileexchange/18264-minimal-bounding-box/content/minboundbox.m

Так что я получаю ограничивающий прямоугольник, который выглядит как этого

Minimal Bounding Box in the volume space

Теперь я хочу, чтобы создать новый том из MBB. Другими словами, я хочу сопоставить каждую точку в MBB с новым полем, которое является ось-параллельным.

я могу получить размеры новой коробки из угловых точек

dim = [0 0 0]; 
x = cp(:,1); 
y = cp(:,2); 
z = cp(:,3); 
dim(3) = sqrt((x(1)-x(2))^2 + (y(1)-y(2))^2 + (z(1)-z(2))^2); 
dim(1) = sqrt((x(1)-x(4))^2 + (y(1)-y(4))^2 + (z(1)-z(4))^2); 
dim(2) = sqrt((x(1)-x(5))^2 + (y(1)-y(5))^2 + (z(1)-z(5))^2); 

Теперь я могу применить матрицу вращения, возвращаемый алгоритмом minboundbox,

A = zeros(4,4); A(1:3, 1:3) = R; A(4,4) = 1; 
tform = affine3d(A); 
N = numel(img); 
[X,Y,Z] = ind2sub(size(img), 1:N); 
V = img(1:N); 
[Xt, Yt, Zt] = transformPointsForward (tform,X,Y,Z); 
Xt = reshape(Xt, size(img)); 
Yt = reshape(Yt, size(img)); 
Zt = reshape(Zt, size(img)); 

И теперь я застрял. Мне нужно:

  • интерполировать значения, связанные с этими координатами в регулярной сетке (любой метод я попытался вышел из памяти, изображение имеет следующий размер = (300,400,500));

  • экстракт только в регионе MBB.

любая идея, как я могу это сделать?

UPDATE главная проблема заключалась не в том, чтобы получить Xt, Yt, Zt ...

проблему, так как Xt, Yt и Zt виде нерегулярной сетки точек, с связаны определенные значения, как может Я получаю регулярную сетку с интерполированной точкой? Я попытался это, но он вышел из памяти

Vq = griddata(Xt, Yt, Zt, double(V), 1:dim(1), 1:dim(2), 1:dim(3)); 
+0

Сколько у вас очков? Вы пытались просто измерить, сколько памяти вам действительно нужно для выполнения этой команды, и посмотреть, поддерживает ли ваша система в первую очередь? –

+0

31000000 баллов ... дайте .... , но все-таки все они должны совмещаться в памяти вместе? Я думаю, и я надеюсь, что он интерполируется только локально, а не глобально. – user1384636

+0

AFAIK, нет функции, которая будет интерполировать локально, не выполняя цикл вручную через вспомогательные области и выполняя интерполяцию. Да, они должны вписываться в память + файл страницы; Вы пытались очистить свои старые (X, Y, Z) данные после преобразования? Это может спасти вам память. –

ответ

1

легче отобразить пространство МОВ в единичном куб, если вы хотите извлечь только область МОВ. Вот как я бы это сделать (заметим, что это в основном псевдокод, не будет гарантировать, что это работает. Я постараюсь его на моем MatLab например, на моем другом компьютере скоро ...)

Translation = eye(4) 
Translation(1:3, 4) = transpose(-cornerpoints(1,:)) 

BoxAxisX = transpose(cornerpoints(:,4) - cornerpoints(:,1)) 
BoxAxisX = BoxAxisX/norm(BoxAxisX) 

BoxAxisY = transpose(cornerpoints(:,5) - cornerpoints(:,1)) 
BoxAxisY = BoxAxisY/norm(BoxAxisY) 

BoxAxisZ = transpose(cornerpoints(:,2) - cornerpoints(:,1)) 
BoxAxisZ = BoxAxisZ/norm(BoxAxisZ) 

Rotation = eye(4) 
Rotation(1:3,1:3) = [ BoxAxisX, BoxAxisY, BoxAxisZ ] 

Scale = diag([ (1/dim(1)) (1/dim(2)) (1/dim(3)) 1 ]) 

A = affine3d(Scale * Rotation * Translation) 

[Xt, Yt, Zt] = transformPointsForward (A,X,Y,Z); 

% Now all your points that are within the box should satisfy unit constraints 
GoodIndices = Xt <= 1 && Xt >= 0 && Yt <= 1 && Yt >= 0 && Zt <= 1 && Zt >= 0 
GoodX = Xt(GoodIndices) 
... 

Основная идея заключается в чтобы вернуть коробку в единичный куб с одной точкой в ​​начале координат. Ниже приведены этапы:

  • Выберите базовую точку; это станет вашим началом.
  • Найдите векторы из базовой точки, которые образуют границы окна; это ваша текущая координатная рамка.
  • Построить матрицу поворота из этих векторов; Это матрица, идущая от стандартного базового вектора (X, Y, Z) до поворота вашего поля с использованием выбранной вами базовой точки. Инвертируйте эту матрицу.
  • Перевести коробку назад так, чтобы базовая точка была в начале координат
  • Теперь используйте эту матрицу инвертированного вращения и примените ее к своей коробке.
  • Обратите внимание: ваша коробка теперь ориентирована по оси в начале координат. Теперь все, что вам нужно сделать, - это масштабировать поле.

Причина, по которой я не использую матрицу вращения, которую они дают, заключается в том, что я действительно не знаю, к какой оси она пойдет, и к какой точке она вращается (вращая вокруг начала! Что!). Итак ... Просто построить матрицу вращения можно с помощью угловых точек, которые вы знаете, чтобы выбрать базовую точку.

Что касается исключений из памяти ... есть много сообщений о том, как уменьшить использование памяти. Этот размер изображения огромен, но .. (~ 240MB)

+0

Хорошо, но главная проблема заключалась не в том, как получить Xt, Yt, Zt (даже если я действительно ценю ур-метод, который является более гибким, чем мой) проблема, поскольку Xt, Yt и Zt образуют нерегулярную сетку точек, с некоторыми связанными значениями, как я могу получить регулярную сетку с интерполированной точкой? Я добавлю это к вопросу – user1384636