【图像分割】基于主动轮廓模型实现图像分割附matlab代码

b214ce4b270d00be7e49db189f947696.png

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法  神经网络预测 雷达通信  无线传感器

信号处理 图像处理 路径规划 元胞自动机 无人机

⛄ 内容介绍

主动轮廓模型算法是目前流行的图像分割算法, 其主要优点是无论图像的质量如何, 总可以抽取得到光滑、封闭的边界. 本文综述了主动轮廓模型算法的发展概况, 并分类介绍了各算法的特点. 此外, 本文还给出了算法发展的方向, 以及今后研究所面临的关键问题.

⛄ 部分代码

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% interate.m implements the core of the snakes (active contours) algorithm.

% It is called by the snk.m file which is the GUI frontend. If you do not

% want to deal with GUI, look at this file and the included comments which

% explain how active contours work.

%

% To run this code with GUI

%   1. Type guide on the matlab prompt.

%   2. Click on "Go to Existing GUI"

%   3. Select the snk.fig file in the same directory as this file

%   4. Click the green arrow at the top to launch the GUI

%

%   Once the GUI has been launched, you can use snakes by

%   1. Click on "New Image" and load an input image. Samples image are

%   provided.

%   2. Set the smoothing parameter "sigma" or leave it at its default value

%   and click "Filter". This will smooth the image.

%   3. As soon as you click "Filter", cross hairs would appear and using

%   them and left click of you mouse you can pick initial contour location

%   on the image. A red circle would appead everywhere you click and in

%   most cases you should click all the way around the object you want to

%   segement. The last point must be picked using a right-click in order to

%   stop matlab for asking for more points.

%   4. Set the various snake parameters (relative weights of energy terms

%   in the snake objective function) or leave them with their default value

%   and click "Iterate" button. The snake would appear and move as it

%   converges to its low energy state.​

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [smth] = interate(image, xs, ys, alpha, beta, gamma, kappa, wl, we, wt, iterations);

% image: This is the image data

% xs, ys: The initial snake coordinates

% alpha: Controls tension

% beta: Controls rigidity

% gamma: Step size

% kappa: Controls enegry term

% wl, we, wt: Weights for line, edge and terminal enegy components

% iterations: No. of iteration for which snake is to be moved

%parameters

N = iterations; 

smth = image;

% Calculating size of image

[row col] = size(image);

%Computing external forces

eline = smth; %eline is simply the image intensities

[grady,gradx] = gradient(smth);

eedge = -1 * sqrt ((gradx .* gradx + grady .* grady)); %eedge is measured by gradient in the image

%masks for taking various derivatives

m1 = [-1 1];

m2 = [-1;1];

m3 = [1 -2 1];

m4 = [1;-2;1];

m5 = [1 -1;-1 1];

cx = conv2(smth,m1,'same');

cy = conv2(smth,m2,'same');

cxx = conv2(smth,m3,'same');

cyy = conv2(smth,m4,'same');

cxy = conv2(smth,m5,'same');

for i = 1:row

    for j= 1:col

        % eterm as deined in Kass et al Snakes paper

        eterm(i,j) = (cyy(i,j)*cx(i,j)*cx(i,j) -2 *cxy(i,j)*cx(i,j)*cy(i,j) + cxx(i,j)*cy(i,j)*cy(i,j))/((1+cx(i,j)*cx(i,j) + cy(i,j)*cy(i,j))^1.5);

    end

end

% imview(eterm);

% imview(abs(eedge));

eext = (wl*eline + we*eedge -wt * eterm); %eext as a weighted sum of eline, eedge and eterm

[fx, fy] = gradient(eext); %computing the gradient

%initializing the snake

xs=xs';

ys=ys';

[m n] = size(xs);

[mm nn] = size(fx);

    

%populating the penta diagonal matrix

A = zeros(m,m);

b = [(2*alpha + 6 *beta) -(alpha + 4*beta) beta];

brow = zeros(1,m);

brow(1,1:3) = brow(1,1:3) + b;

brow(1,m-1:m) = brow(1,m-1:m) + [beta -(alpha + 4*beta)]; % populating a template row

for i=1:m

    A(i,:) = brow;

    brow = circshift(brow',1)'; % Template row being rotated to egenrate different rows in pentadiagonal matrix

end

[L U] = lu(A + gamma .* eye(m,m));

Ainv = inv(U) * inv(L); % Computing Ainv using LU factorization

%moving the snake in each iteration

for i=1:N;

    

    ssx = gamma*xs - kappa*interp2(fx,xs,ys);

    ssy = gamma*ys - kappa*interp2(fy,xs,ys);

    

    %calculating the new position of snake

    xs = Ainv * ssx;

    ys = Ainv * ssy;

    

    

    %Displaying the snake in its new position

    imshow(image,[]); 

    hold on;

    

    plot([xs; xs(1)], [ys; ys(1)], 'r-');

    hold off;

    pause(0.001)    

end;

⛄ 运行结果

⛄ 参考文献

[1]吴北海. 基于主动轮廓模型的医学图像分割[D]. 河北工业大学.

[2]高梅, and 余轮. "基于主动轮廓模型的图像分割算法." 漳州师范学院学报(自然科学版) (2007).

❤️ 关注我领取海量matlab电子书和数学建模资料

❤️部分理论引用网络文献,若有侵权联系博主删除

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值