全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 MATLAB等数学软件专版
4664 0
2014-04-09
原文请见 Solving mazes with the watershed transform
如果用Mathematica,一个函数(WatershedComponents)就OK了。类似的一篇文章(数硬币
我们曾经介绍过如何使用watershed进行图像分割(在matlab中正确的使用水坝算法分割图像)。这次,我们介绍一个更加有趣的应用,就是用watershed变换来走迷宫。Steve曾经在他的博客里介绍过如何基于测地距离变换(bwdistgeodesic),使用最短路径搜索的方法( Exploring Shortest Paths)来走迷宫。这里介绍水坝算法求解。
下面是一个迷宫,我们要找到一条入口和出口两个红点之间的路线。
I = imread('http://blogs.mathworks.com/images/steve/2011/maze-51x51.png');I = logical(I);imshow(I)hold on;plot([6 526], [497 517], 'ro', 'MarkerSize', 15,'LineWidth', 2);hold off;
030627hCM.png
这里需要提到,在这个方法中我们之考虑标准迷宫,也就是有且只有一条路径,没有环路等。
使用watershed变换时候,这种迷宫有两个积水区,这两个积水区之间的水坝就是我们要求解的路径。下面就是watershed生成的两个积水区
L = watershed(I);imshow(L,[])

030628Hiv.png
两个积水区分别表示为灰色和白色。可以看出实际上两个区域的边界就是我们要的路径。首先我们创造一个新图像,只保留其中一个积水区对应的原图内容
L1 = L == 2;I1 = L1.*I;imshow(I1)
030631xgW.png

下面,我们再次使用水坝算法
L2 = watershed(I1);imshow(L2,[])
030635dS0.png
可以看出,和上一次的结果相比,这次的结果缩减了宽度。如果使用imshowpair函数来看,就可以更明显的看出来
imshowpair(L,L2)
0306320yN.png
最后,我们从绿色的区域(也就是两次生成的积水区中差异的部分)内提取路径
img1 = L == 2;img2 = L2 == 2;path = img1 - img2;P = imoverlay(I, path, [1 0 0]);imshow(P)
030639lFd.png
下面是其他的一些结果
030642KcF.png

030641Osi.png




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群