原文请见
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;
这里需要提到,在这个方法中我们之考虑标准迷宫,也就是有且只有一条路径,没有环路等。
使用watershed变换时候,这种迷宫有两个积水区,这两个积水区之间的水坝就是我们要求解的路径。下面就是watershed生成的两个积水区
L = watershed(I);imshow(L,[])
两个积水区分别表示为灰色和白色。可以看出实际上两个区域的边界就是我们要的路径。首先我们创造一个新图像,只保留其中一个积水区对应的原图内容
L1 = L == 2;I1 = L1.*I;imshow(I1)
下面,我们再次使用水坝算法
L2 = watershed(I1);imshow(L2,[])
可以看出,和上一次的结果相比,这次的结果缩减了宽度。如果使用imshowpair函数来看,就可以更明显的看出来
imshowpair(L,L2)
最后,我们从绿色的区域(也就是两次生成的积水区中差异的部分)内提取路径
img1 = L == 2;img2 = L2 == 2;path = img1 - img2;P = imoverlay(I, path, [1 0 0]);imshow(P)
下面是其他的一些结果