我需要做的就是分割移动图像的一部分,这绝对不是一件简单的事情。这被称为可变形模型分割,并且有很多相关文献。此外,您的固定图像与移动图像非常不同,这并没有帮助。
以下是一些初始想法,但您可能需要更详细的内容来适用于您的应用程序。
I1=imread('fixed.png');
I2=imread('moving.png');
model=im2bw(I1,0.54);
imshowpair(I1,Model);
这是一种简单的阈值分割方法,用于隔离图像中间的那个斑点。0.54的值是通过调整得到的,您肯定可以更好地分割您的固定图像。
这是已分割的固定图像,紫色部分在内部,绿色部分在外部。
现在,让我们将这个掩膜变形以适应移动后的图像:
masked = activecontour(I2,model, 20, 'Chan-Vese');
imshowpair(I2,masked);
结果:
![enter image description here](https://istack.dev59.com/arevy.webp)
您可以通过循环自动化处理所有图像,使每个后续的掩模变形到下一个帧。同时尝试不同的 activecontour
参数。
以下是我能想到的另一种方法:
在以下代码中,Istart
是原始固定图像,Mask
是该图像上的分割区域(您在问题中称之为“fixed”),而 Istep
是移动的图像。
我首先将分割区域转换为二进制掩码,这并非绝对必要:
t=graythresh(Mask);
BWmask=im2bw(Mask, t);
让我们显示遮蔽后的原始图像:
imshowpair(BWmask, Istart)
![开始遮罩](https://istack.dev59.com/ivbMf.webp)
下一步是在起始图像和步骤图像之间进行基于强度的配准计算:
[optimizer, metric] = imregconfig('monomodal');
optimizer.MaximumIterations = 300;
Tform=imregtform(Istart, Istep, 'affine', optimizer, metric);
根据这个变换来调整遮罩的形状:
WarpedMask=imwarp(BWmask, Tform, 'bicubic', 'Outputview', imref2d(size(Istart)));
现在让我们来看一下结果:
imshowpair(WarpedMask, Istep);
![遮罩步骤](https://istack.dev59.com/O84Uw.webp)
虽然并不完美,但这是一个开始。我认为你的主要问题在于你的遮罩包含了不同于彼此的元素(中间的那个 blob 与中间的较暗软组织)。如果我是你,我会尝试将这些结构分别分割。
祝好运!