2014-02-10 69 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