楼主: 凡星有梦
4698 0

[学习分享] 用watershed算法走迷宫 [推广有奖]

  • 2关注
  • 20粉丝

已卖:106份资源

讲师

89%

还不是VIP/贵宾

-

威望
1
论坛币
7643 个
通用积分
5270.5463
学术水平
100 点
热心指数
87 点
信用等级
88 点
经验
7381 点
帖子
149
精华
2
在线时间
185 小时
注册时间
2013-8-26
最后登录
2025-11-23

楼主
凡星有梦 在职认证  发表于 2014-4-9 17:19:39 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
原文请见 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




二维码

扫码加我 拉你入群

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

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

关键词:Watershed water ATE ERS SHE matlab hold 博客 如何

个人主页:https://lixuan.xyz

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 11:06