Matlab - 扩张功能的替代方案

时间:2014-02-10 21:46:42

标签: matlab image-processing

我正在寻找各种在线资源,试图用matlab学习一些新东西。

我可以通过扩张功能,如下所示:

function rtn = dilation(in)

h =size(in,1);
l =size(in,2);
rtn = zeros(h,l,3);

rtn(:,:,1)=[in(2:h,:); in(h,:)];
rtn(:,:,2)=in;
rtn(:,:,3)=[in(1,:); in(1:h-1,:)];
rtn_two = max(rtn,[],3);

rtn(:,:,1)=[rtn_two(:,2:l), rtn_two(:,l)];
rtn(:,:,2)=rtn_two;
rtn(:,:,3)=[rtn_two(:,1), rtn_two(:,1:l-1)];
rtn = max(rtn,[],3);

所需的参数是:max(img,[],3) %where img is an image

我想知道是否有人可以了解这个功能似乎做了什么,以及是否有更好的(或更少混淆的方式)做到这一点?除了小wiki entry之外,我似乎无法找到任何文档,因此请求您的帮助。

这可以通过imdilate函数实现吗?

2 个答案:

答案 0 :(得分:2)

这样做是创建两个向上/向下移动一个像素的图像副本(最后/第一行重复以保留大小),然后在每个点处获取3个图像的最大值以创建垂直扩张的图像。由于移位的副本和原始图像以3维矩阵分层,max(img,[],3)'沿着第3维“平坦化”3层。然后,对于扩张的水平部分,它逐列重复。

For a trivial image:
00100
20000
00030

Step 1:
(:,:,1) (:,:,2) (:,:,3)     max
 20000   00100   00100     20100
 00030   20000   00100     20130
 00030   00030   20000     20030

Step 2:
(:,:,1) (:,:,2) (:,:,3)     max
 01000   20100   22010     22110
 01300   20130   22013     22333
 00300   20030   22003     22333

你绝对正确这对于图像处理工具箱来说会更简单:

rtn = imdilate(in, ones(3));

使用原始代码,扩展多个像素将需要多次迭代,并且因为它一次操作一个维度,所以它被限制为方形(或可能是矩形,稍微修改)结构元素。

答案 1 :(得分:2)

您的函数用相应的3 * 3内核中的最大值替换每个元素。通过创建一个3D矩阵,该函数将每个元素与其两个移位对齐,从而等效地实现3 * 3内核。进行两次这样的对齐以分别找到沿每列和每行的最大值。

您可以生成一个简单矩阵,将结果与imdilate进行比较:

a=magic(8)
rtn = dilation(a)

b=imdilate(a,ones(3))

imdilate外,您还可以使用

c=ordfilt2(a,9,ones(3))

获得相同的结果(实现3乘3最大过滤器。)

修改

您也可以尝试使用imdilate的3D图像:

a(:,:,1)=magic(8);
a(:,:,2)=magic(8);
a(:,:,3)=magic(8);
mask = true(3,3,3);
mask(2,2,2) = false;
d = imdilate(a,mask);