您的位置:首页 > 编程语言 > MATLAB

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

2015-11-18 15:56 155 查看


Dsp Tian

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最大的好处就是直观的看到算法结果:





好文要顶 关注我 收藏该文







Dsp Tian

关注 - 5

粉丝 - 557

+加关注

0

0

(请您对文章做出评价)

« 上一篇:matlab练习程序(图像放大/缩小,双立方插值)

» 下一篇:matlab练习程序(模板匹配)

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

刷新评论刷新页面返回顶部

注册用户登录后才能发表评论,请 登录 或 注册,访问网站首页。

【推荐】50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库

【推荐】融云即时通讯云-专注为 App 开发者提供IM云服务

【福利】极光推送-富媒体+大数据驱动精准推送,完全免费开放啦





最新IT新闻:

· 马明哲详解互联网金融3.0时代

· 史玉柱免掉巨人网络133名干部

· 刘强东:京东淘宝模式谁最终胜出已很明白

· 关于Facebook的未来,31岁的扎克伯格还有三条锦囊妙计

· 阿里斥双11退货率达63%?货还没收到怎么退!

» 更多新闻...





最新知识库文章:

· 被误解的MVC和被神化的MVVM

· 再谈设计和编码

· 什么时候应该避免写代码注释?

· 持续集成是什么?

· 人,技术与流程

» 更多知识库文章...


公告

昵称:Dsp Tian

园龄:4年1个月

粉丝:557

关注:5
+加关注


导航

博客园

首页

新随笔

联系

订阅



管理

<2012年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345


统计

随笔 - 351

文章 - 0

评论 - 333

引用 - 0

Powered by: 博客园 Copyright © Dsp Tian
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: