【图像分割】基于matlab随机游走算法图像分割【含Matlab源码 149期】

举报
海神之光 发表于 2022/05/29 04:44:12 2022/05/29
【摘要】 一、获取代码方式 获取代码方式1: 通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。 获取代码方式2: 完整代码已上传我的资源:【图像分割】基于matlab随机游走算法图像分割【含M...

一、获取代码方式

获取代码方式1:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。

获取代码方式2:
完整代码已上传我的资源:【图像分割】基于matlab随机游走算法图像分割【含Matlab源码 149期】

备注:
订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);

二、随机游走算法简介

1 关于全局最优化求解
全局最优化是一个非常复杂的问题,目前还没有一个通用的办法可以对任意复杂函数求解全局最优值。上一篇文章讲解了一个求解局部极小值的方法——梯度下降法。这种方法对于求解精度不高的情况是实用的,可以用局部极小值近似替代全局最小值点。但是当要求精确求解全局最小值时,梯度下降法就不适用了,需要采用其他的办法求解。常见的求解全局最优的办法有拉格朗日法、线性规划法、以及一些人工智能算法比如遗传算法、粒子群算法、模拟退火算法等(可以参见我之前的博客)。而今天要讲的是一个操作简单但是不易陷入局部极小值的方法:随机游走算法。
2 随机游走算法操作步骤
设f(x)f(x)是一个含有nn个变量的多元函数,x=(x1,x2,…,xn)x=(x1,x2,…,xn)为nn维向量。
给定初始迭代点xx,初次行走步长λλ,控制精度ϵϵ(ϵϵ是一个非常小的正数,用于控制结束算法)。
给定迭代控制次数NN,kk为当前迭代次数,置k=1k=1。
当 k<Nk<N时,随机生成一个(−1,1)(−1,1)之间的nn维向量u=(u1,u2,⋯,un),(−1<ui<1,i=1,2,⋯,n)u=(u1,u2,⋯,un),(−1<ui<1,i=1,2,⋯,n),并将其标准化得到u′=u∑ni=1u2i√u′=u∑i=1nui2。令x1=x+λu′x1=x+λu′,完成第一步游走。
计算函数值,如果 f(x1)<f(x)f(x1)<f(x),即找到了一个比初始值好的点,那么kk重新置为1,将x1x1变为xx,回到第2步;否则k=k+1k=k+1,回到第3步。
如果连续NN次都找不到更优的值,则认为,最优解就在以当前最优解为中心,当前步长为半径的NN维球内(如果是三维,则刚好是空间中的球体)。此时,如果λ<ϵλ<ϵ,则结束算法;否则,令λ=λ2λ=λ2,回到第1步,开始新一轮游走。

三、部分源代码

clear ;
close all;
 
addpath 'algorithms'
out = ['results\'];
if ~exist(out)
    mkdir(out);
end
 
%% parameters            
only_name= '41004';
img_name = ['./imgs/' only_name '.jpg'];
ref_name = ['./scribbles/' only_name '.bmp'];
nei = 1;            % 0: 4-neighbors, 1: 8-neighbors
c = 0.0004;%1e-3;%         % restarting probability of RWR
sigma_c = 60;       % color variance
scale = 1.0;        % image resize
lambda = 2e-10;     % parameter for unitary
isKeepConnect = 0;  % 1: only consinder the connected regions with seeds;  0: otherwise.
reset(RandStream.getGlobalStream); % fix the random seed for initalization of GMM
 
saveProb = 0; % 1: save the probability image
%% main routine
img = imread(img_name); img = imresize(img,scale);
[K, labels, idx] = seed_generation(ref_name,scale);
 
%% RWR with prior
% run('vlfeat-0.9.13/toolbox/vl_setup');
st=clock;
[posteriors label_img] = do_RWR_prior(img,idx,labels,c,lambda,nei,sigma_c,isKeepConnect);
fprintf('subRW took %.2f second\n',etime(clock,st));
 
% display
[imgMasks,segOutline,imgMarkup]=segoutput(im2double(img),label_img); %clear imgMasks segOutline;
 
outPath = [out,'ours\'];
if ~exist(outPath)
    mkdir(outPath);
end
 
figure; clf;set(gcf,'Position',[100,500,size(img,2)*(K+1),size(img,1)]);
for k=1:K 
    prob_img = sc(posteriors(:,:,k),'prob_jet');
    if saveProb == 1
        imwrite(prob_img,[outPath,only_name,'_prob',num2str(k),'.png']);
    end
    subplot(1,K+1,k); imshow(prob_img); clear prob_img;
end;
subplot(1,K+1,K+1); imshow(imgMarkup);
figure,imshow((K-imgMasks)/(K-1));
 
imwrite(imgMarkup,[outPath,only_name,'_bound.png']);
imwrite((K-imgMasks)/(K-1),[outPath,only_name,'_binary.png']);

  
 

四、运行结果

在这里插入图片描述
在这里插入图片描述

五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]陈浩,方勇,朱大洲,王成,陈子龙.基于蚁群算法的玉米植株热红外图像边缘检测[J].农机化研究. 2015,37(06)

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/112986678

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。