我正在寻找各种在线资源,试图用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
函数实现吗?
答案 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);