2014-02-10 68 views
2

我正在通过各种在线来源,试图学习一些新的东西与matlab。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

这是什么东西做的是创建图像的两个拷贝由一个像素上/下(与复制保存大小的最后/第一行)转移,然后取3个图像的最大值在每个点创建垂直放大的图像。由于移位后的副本和原始图层分层为3-d矩阵,因此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)); 

与原来的代码,由一个以上的像素扩张将需要多次迭代,因为它运行一个一次只能有一个维度(或者可能是矩形的,有一些修改)构造元素。

+0

出色答卷。感谢您的解释。对此,我真的非常感激。从imdilate函数返回的3D矩阵是否可以变平? – Reanimation

+0

@Reanimation'imdilate'带有2D图像应该返回一个2D结果 - 你是否给它一个RGB图像或类似的东西? – Notlikethat

+0

如果我加载月亮图像('img = double(imread('moon.tif'));')并检查它的大小,它会返回'(x,y)',但是如果我加载我的图像('img2 = double(imread('image_raw.jpg'));')它的大小是'(x,y,3)'...在我的测试图像上,imdilate正在返回一个3d,我认为......在另一个函数中, m试图添加imdilate到2d矩阵,这就是为什么它不开心。我在想,如果我可以将返回的3D残片压平成2D,它会起作用吗? – Reanimation

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); 
+0

很酷。感谢您的解释。 imdilate函数的大小在(x,y,3)中返回,但我的问题中的函数的大小是(x,y)...我假设我需要将imdilate平坦化?那可能吗? – Reanimation

+0

最后rtn是二维矩阵。你可以从你的工作区观察它。 rtn第三维上的最大值函数,并返回二维结果。请注意,rtn_two也是一个2D矩阵 – lennon310

+0

我必须发送一个3D图像。如果返回的矩阵以3D形式返回,是否有为什么要将返回的矩阵平坦化? (从(x,y,3)中丢失3),如果这是有道理的。谢谢。 – Reanimation