Как получить поле смещения или вектор контрольной точки, когда у нас есть tfrom?

Я использую панель инструментов регистрации изображений, чтобы зарегистрировать два 3D изображения. Я регистрирую движущееся изображение на фиксированное изображение. Я использую "imregtform", чтобы сохранить tform.

tform = imregtform(moving,fixed,transformType,optimizer,metric)

например, это мой 'tform':

    1.0235    0.0022   -0.0607         0
   -0.0276    1.0002    0.0089         0
   -0.0170   -0.0141    1.1685         0
   12.8777    5.0311  -70.0325    1.0000

затем я использую Imwarp для переноса движущегося изображения в фиксированное изображение. В моем коде это так,

nii=load_untouch_nii(['mypath image.nii' ]);
I = nii.img; 
dii=nii.hdr.dime.pixdim(2:4);
Rfixed=imref3d(size(I),dii(2),dii(1),dii(3)); 
timg= imwarp(I, Rfixed, tform, 'OutputView', Rfixed);

'Timg' - это переданное изображение исходного изображения. Я проверил его, и оно работает нормально, но мне нужны контрольные точки или поле смещения этого преобразования. Другими словами, мне нужно знать, какой воксел (3d пиксель) перемещен в какую позицию. Если я знаю это, я могу нарисовать векторное поле. В методах регистрации деформируемых изображений, таких как пакет NiftyReg, предусмотрена команда контрольной точки, чтобы упростить ее для пользователей, но я не знаю, как это сделать в простой трехмерной аффинности в Matlab. Любая помощь будет оценена слишком высоко

1 ответ

Решение

Вы можете легко применить свое геометрическое преобразование к одной точке.

Вам просто нужно определить свою точку зрения как p=[x;y;z;1]

а затем получить pt от pt=p*tform;pt=pt(1:3)./pt(4); (поиск однородных координат для объяснения этого последнего деления). Это то, что imwarp делает внутри. Выполняет указанное умножение для каждого пикселя. p,

Чтобы затем получить смещение, вам нужно просто disp=pt-p;, Обратите внимание, что смещения, скорее всего, не являются целочисленными.

Обратите внимание, что в области регистрации деформируемых изображений, как правило, у вас будет другой tform для каждой контрольной точки (именно поэтому она называется деформируемой, а не жесткой)

РЕДАКТИРОВАТЬ: как @Ashish Uthama предлагает в комментариях, вы также можете сделать это с помощью встроенной функции Matlab transformpointsforward(), Я всегда буду пропагандистом философии "написание собственного кода", особенно в первый раз, чтобы вы понимали, что вы на самом деле делаете.

http://uk.mathworks.com/help/images/ref/affine3d.transformpointsforward.html

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