«Все, что мне нужно сделать, это сегментировать часть движущихся изображений», это, безусловно, нетривиальная задача. Это называется сегментацией по деформируемым моделям, и на эту тему есть много литературы. Кроме того, ваше фиксированное изображение сильно отличается от движущегося изображения, что не помогает.
Вот несколько идей для начала, но вам, вероятно, потребуется более подробно изучить ваше приложение.
I1=imread('fixed.png');
I2=imread('moving.png');
model=im2bw(I1,0.54);
imshowpair(I1,Model);
Это простая сегментация с пороговым значением для выделения этого пятна в середине изображения. Значение 0,54 было получено путем возни, вы, безусловно, можете лучше сегментировать фиксированное изображение.
Вот сегментированное фиксированное изображение, фиолетовое внутри, зеленое снаружи.
![Сегментированный фиксированный](https://i.stack.imgur.com/BtDLp.png)
Теперь давайте деформируем эту маску, чтобы она соответствовала перемещенному изображению:
masked = activecontour(I2,model, 20, 'Chan-Vese');
imshowpair(I2,masked);
Результат:
![введите здесь описание изображения](https://i.stack.imgur.com/arevy.png)
Вы можете автоматизировать это в цикле по всем вашим изображениям, деформируя каждую последующую маску до следующего кадра. Попробуйте также другие параметры activecontour
.
Редактировать здесь — это еще один способ, который я могу придумать:
В следующем коде Istart
— это исходное фиксированное изображение, Mask
— это сегментированная область на этом изображении (тот, который вы назвали «фиксированным» в своем вопросе), а Istep
— это перемещенное изображение.
Сначала я превратил сегментированную область в бинарную маску, в этом нет строгой необходимости:
t=graythresh(Mask);
BWmask=im2bw(Mask, t);
Давайте отобразим замаскированное исходное изображение:
imshowpair(BWmask, Istart)
![маскированный запуск](https://i.stack.imgur.com/ivbMf.png)
Следующим шагом было вычисление регистрации на основе интенсивности между начальным и ступенчатым изображениями:
[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://i.stack.imgur.com/O84Uw.png)
Это не идеально, но это начало. Я думаю, что ваша главная проблема заключается в том, что ваша маска содержит элементы, которые отличаются друг от друга (эта средняя капля по сравнению с более темной мягкой тканью в середине). Если бы я был там, я бы попытался сегментировать эти структуры отдельно.
Удачи!
person
Cape Code
schedule
13.01.2014