Как получить поле смещения или вектор контрольной точки, когда у нас есть 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