splitmerge.m

%splitmerge源函数
function g=splitmerge(f,mindim,fun)
%splitmerge使用分离和合并算法的图像分割
%g=splitmerge(f,mindim,fun)建立在四叉树分解的分离和合并算法的图像f的分割
%mindim的最小维数是四叉区域所允许的。
%如果必须,用0去填充输入图像的最近区域大小,它是2的整数幂。
%这些保证关于算法使用在四叉树分解中可能会分割图像到1*1大小的块中。
%这些结果是输入图像初始大小的剪回。在输出中,g的每个连接区域是标志不同的整数。
%
%标志:在函数调用中,我们使用@predicatez为了fun的值。
%predicate在matlab步骤中是一个函数,它被使用者提供。
%它的语法是flag=predicate(region),当区域中的像素满足在函数中的编码中的测试中,返回true,否则返回false.
%
%函数predicate被使用在这本书的例10.9.
%如果在区域中的像素的紧张度的便准差超过10,它的平均紧张度在0和125之间,则flag是真的,否则flag是false.
%
%function flag=predicate(region)
%sd=std2(region)
%m=mean2(region)
%flag=(sd>10)&(m>0)&(m<125)

%用0填充图像保证函数qtdecomp分割区域下至大小为1*1.
Q=2^nextpow2(max(size(f)));
[M,N]=size(f);
f=padarray(f,[Q-M,Q-N],'post');

%首先执行分裂
S=qtdecomp(f,@split_test,mindim,fun);

%每个四叉树合并,如果通过预测的区域用1填充。

%得到做大区域的大小。因为S是稀疏的,使用满的。
Lmax=full(max(S(:)));
%输出图像初始全为0。标志数组在建立连接后
g=zeros(size(f));
MARKER=zeros(size(f));
%开始合并
for K=1:Lmax
    [vals,r,c]=qtgetblk(f,s,K);
    if~isempty(vals)
      %检查预测的每个区域下、坐标大小K*K是否满足r和c.
      for I=1:length(r)  
        xlow=r(I);ylow=c(I);
        xhigh=xlow+K-1;yhigh=ylow+K-1;
        region=f(xlow:xhigh,ylow:yhigh);
        flag=feval(fun,region);
        if flag
            g(xlow:xhigh,ylow:yhigh)=1;
            MARKER(xlow,ylow)=1;
        end
      end
    end
end
%最后,获得每个连接区域和使用不同的整数标志它。
g=bwlabel(imreconstruct(MARKER,g));
%作物与出口
g=g(1:M,1:N);
        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值