2013-10-25 163 views
0

我想墊用零填充在邊界與在像素最接近的邊界值的矩陣,例如:最佳方式

A = rand(5); 
Z = zeros(9); 
Z(3:7, 3:7) = A; 

enter image description here

現在,我想完成矩陣邊界以下列方式:

enter image description here

我正在尋找一個很好的解決方案沒有任何for循環

編輯:

它應該是這樣的:

enter image description here

+2

目前還不清楚你想要做什麼。你能詳細說明嗎? – Phonon

+1

要添加到Phonon的評論,您的矩陣如何與圖像相關?爲什麼有兩行/零列? – Adam

+0

嗯...我想重複內部5x5矩陣的值到2邊框行和列的方式,這是底部的圖片描述的方式。突出顯示的框對應於這個5x5矩陣。希望這可以幫助。 – Schnigges

回答

1
% Create a random image 
I = round(rand(8)*70); 

% Number of pixels to pad on each side 
padSize = 3; 

% Create a resulting image matric 
sizeY = size(I,1); 
sizeX = size(I,2); 

J = zeros(sizeY + padSize*2, sizeX + padSize*2); 

% Fill in the original 
J((padSize+1):(padSize+sizeY) , (padSize+1):(padSize+sizeX)) = I; 

% Fill in areas above, below and to the sides or original 
%top 
J(1:padSize, (padSize+1):(padSize+sizeX)) = repmat(I(1,:),padSize,1); 
%bottom 
J((padSize+sizeX+1):end, (padSize+1):(padSize+sizeX)) = repmat(I(end,:),padSize,1); 
%left 
J((padSize+1):(padSize+sizeY), 1:padSize) = repmat(I(:,1),1,padSize); 
%right 
J((padSize+1):(padSize+sizeY), (padSize+sizeY+1):end) = repmat(I(:,end),1,padSize); 

% Fill in the corners 
J(1:padSize, 1:padSize)       = I(1,1); 
J((padSize+sizeY+1):end, 1:padSize)    = I(end,1); 
J(1:padSize, (padSize+sizeX+1):end)    = I(1,end); 
J((padSize+sizeY+1):end, (padSize+sizeX+1):end) = I(end,end); 
+0

不錯!非常感謝 – Schnigges

5

你想padarray'replicate'選項。例如,要複製在各方面的2x2邊框,

>> A = [1 2; 3 4]; 
>> B = padarray(A,[2 2],'replicate','both') 
B = 
    1  1  1  2  2  2 
    1  1  1  2  2  2 
    1  1  1  2  2  2 
    3  3  3  4  4  4 
    3  3  3  4  4  4 
    3  3  3  4  4  4 
+0

我看過'padarray',但我找不到如何正確複製它。到目前爲止,只有我使用'padarray(Z,[2 2],'replicate')才能複製我的零。 – Schnigges

+0

@Schnigges - 在矩陣上使用'padarray'而不用零。不需要先將矩陣嵌入到零中。如果你只有已經有零點的矩陣,就像'padarray(Z(3:7,3:7),[2 2],'replicate')' – chappjc

+0

)運行它。謝謝,但事實上,我必須使用已經在邊界包含零的圖像。 – Schnigges