matlab练习程序(寻找凸包,Graham扫描法)

转载 2015年11月18日 15:56:43

matlab练习程序(寻找凸包,Graham扫描法)

  我不太清楚这个凸包在图像处理中到底会怎样的运用,因为这个好像更多的是计算几何或是图形学里面的东西。不过作为一个算法,我感觉还是有必要研究一下的。我主要的参考资料是《算法导论》的33.3和这个博客

  代码在这里,我只写了主要过程,过分细节的判断就省略了。这里是逆时针寻找:

main.m

复制代码
clear all;
close all;
clc;

img=ones(256,256);
imshow(img);
[x y]=ginput();
x=round(x);
y=round(y);
n=length(x);
p=[];
for i=1:n
   img(y(i)-1:y(i)+1,x(i)-1:x(i)+1)=0; 
   p=[p;x(i) y(i)];     %待判断凸包的点集
end
imshow(img);

%%下面计算凸包
[t index]=max(p(:,2));  %找到y最大的点的索引,这里没考虑当有多个这样的点的情况
tmp_p=p(index,:);         %找到y最大的点
tmp_heng=[tmp_p(1)+30,tmp_p(2)];    %设一个和y最大的点平行的点

for i=1:n           %这里没判断夹角相同的情况,当夹角相同,可以判断当前点和p0点的距离。
    jiao(i)=multi_jiao(tmp_heng,p(i,:),tmp_p);  %求每个点和y最大的点的夹角,自己和自己夹角NAN
end
jiao=jiao';
p=[p jiao];

p=sortrows(p,3);    %按第三列排序,第三列是夹角度数

re{1}=p(n,1:2);     %re相当于栈
re{2}=p(1,1:2);
re{3}=p(2,1:2);
top=3;    %指向栈顶的指针

for i=3:n-1
    while multi(p(i,1:2),re{top-1},re{top})>=0      %如果为正
        top=top-1;       
    end
    top=top+1;
    re{top}=p(i,1:2);
end

%下面是把找到的凸包上的点连线
for i=2:top   
   img=drawline(img,re{i-1}(1),re{i-1}(2),re{i}(1),re{i}(2));
end
img=drawline(img,re{1}(1),re{1}(2),re{top}(1),re{top}(2));
figure;
imshow(img)
复制代码

multi_jiao.m  向量的夹角,0-180度

复制代码
function re=multi_jiao(p1,p2,p0)    %判断<p10,p20>夹角,为排序做准备
    x=1;
    y=2;

    vec1=p1-p0;
    vec2=p2-p0;

    re=acos(dot(vec1,vec2)/(norm(vec1)*norm(vec2)))*180/pi;
end
复制代码

multi.m  叉积,判断返回值的符号

复制代码
function re=multi(p1,p2,p0)     %p10,p20叉积,获取正负,为正则栈顶的值不为凸包上的点,为负则为凸包上的点
    x=1;
    y=2;
   
   re=(p1(x)-p0(x))*(p2(y)-p0(y))-(p1(y)-p0(y))*(p2(x)-p0(x));

end
复制代码

drawline.m  画线函数,matlab好像没有,自己动手,丰衣足食

复制代码
function img=drawline(img,x1,y1,x2,y2)   %因为图像坐标和数学函数坐标y轴朝向相反,所以这里所有y变量取相反数
    y1=-y1;
    y2=-y2;
    k=(y2-y1)/(x2-x1);
    b=y1-k*x1;
    
    mi=min(x1,x2);
    ma=max(x1,x2);
    for i=mi:ma
       img(-round(i*k+b),i)=0; 
    end
    
    mi=min(y1,y2);
    ma=max(y1,y2);
    for i=mi:ma
       img(-i,round((i-b)/k))=0; 
    end

end
复制代码

下面是一个结果,matlab最大的好处就是直观的看到算法结果:

0
0
(请您对文章做出评价)
« 上一篇:matlab练习程序(图像放大/缩小,双立方插值)
» 下一篇:matlab练习程序(模板匹配)

posted on 2012-12-10 22:39 Dsp Tian 阅读(2294) 评论(0编辑 收藏

公告

昵称:Dsp Tian
园龄:4年1个月
粉丝:557
关注:5

导航

< 2012年12月 >
25 26 27 28 29 30 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

  • 随笔 - 351
  • 文章 - 0
  • 评论 - 333
  • 引用 - 0

graham扫描法求凸包

Graham扫描法 凸包问题
  • neau2014
  • neau2014
  • 2015年09月05日 16:16
  • 426

计算几何之凸包----Graham扫描法

计算几何之凸包(convexHull)----Graham扫描法 关于凸包的严格定义,这里不打算写出来,大家可以自行Google或者百度,因为严格的数学定义反而不太好理解,用最通俗的话来解释凸包:给定...
  • u012328159
  • u012328159
  • 2016年03月05日 15:15
  • 4783

Graham扫描法求点集凸包的原理及代码实现

Graham扫描法求点集凸包的原理及代码实现
  • u010251278
  • u010251278
  • 2016年01月06日 15:51
  • 816

凸包模板(分治 or Graham扫描法)

问题概述:空间上有很多点,现在要用一个凸多边形将所有点全部包住,求哪些点在这个凸多边形上 输入样例:                                             对应输出:...
  • Jaihk662
  • Jaihk662
  • 2016年08月08日 18:21
  • 432

浅谈凸包之Andrew 与 Graham

前言 脑补知识点: 1.向量的内积(数量积,点乘): 公式:a· b = |a| * |b| cos=a.x* b.y + b.x * a.y   2.向量的外积(向量积,差乘): 公式:...
  • u012349696
  • u012349696
  • 2015年04月18日 08:58
  • 1071

凸包 Graham扫描法

凸包模板函数  Graham扫描法 简单概括就是 排序+扫描 #include #include #include #include using namespace std; const i...
  • fzw_captain
  • fzw_captain
  • 2015年08月14日 20:29
  • 385

凸包算法-GrahamScan+暴力+分治

RT。求平面上点集的凸包。 1. GrahamScan算法,《算法导论》上的例子,先找到y最小的点O,以O建立极坐标,其它点按极角排序后再从头开始扫描(配合stack实现)。 2.BruteForce...
  • messiandzcy
  • messiandzcy
  • 2014年12月16日 17:46
  • 1628

凸包-Graham-Scan算法

问题: 给定平面点集,
  • chen476328361
  • chen476328361
  • 2014年10月30日 22:56
  • 783

寻找凸包-graham扫描法

Graham扫描法通过维持一个关于候选点的栈S来解决凸包问题。输入集合Q中的每个点都被压栈一次,非CH(Q)中的点最终被弹出栈。当算法终止时,栈S仅包含CH(Q)中的顶点,以逆时针的顺序出现在边界上。...
  • cumtwyc
  • cumtwyc
  • 2015年10月24日 19:22
  • 503

寻找凸包(Graham扫描法)

题意描述:对任意给定的平面上的点集,求最小凸多边形使得点集中的点要么在凸多边形的边上,要么在凸多边形的内部。Graham算法描述: 在所有的点中找到一点p0,使得p0的纵坐标值最小,在有多个最小纵坐标...
  • wenhai_dai
  • wenhai_dai
  • 2017年04月07日 15:43
  • 111
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:matlab练习程序(寻找凸包,Graham扫描法)
举报原因:
原因补充:

(最多只允许输入30个字)