2014-10-01 131 views
1

如何在Matlab中獲得代表2d卷積的2d卷積矩陣,其中複製。因此,我想是類似的東西:Matlab - 帶複製的2D卷積矩陣

T = getConvMtx(H, m, n); 
res1 = T * im; 
res2 = imfilter(im, H, 'replicate'); 

,並有res1res2得到有效相等。

Matlab的convmtx2的實現爲您提供了一個假定零填充的卷積矩陣。

我已經將我的實現作爲答案之一,儘管它效率極低。這就是爲什麼我會重視,反饋和建議更好的方法。

回答

3

這是我如何設法獲得所需的結果。然而,這是非常低效的,因此任何意見和建議,我們非常歡迎:

function T = getConvMtx(H,m,n) 

vHalfKerSz = floor(size(H)/2); 

mInds = reshape(1:m*n, m, n); 
mInds = padarray(mInds, vHalfKerSz, 'replicate'); 

Tcols = zeros(m*n*numel(H), 1); 
Trows = zeros(m*n*numel(H), 1); 
Tvals = zeros(m*n*numel(H), 1); 

i = 0; p = 0; 
for c = 1:n 
    for r = 1:m 
     p = p + 1; 

     mKerInds = mInds(r:r+size(H,1)-1, c:c+size(H,2)-1); 

     [U, ~, ic] = unique(mKerInds(:)); 

     for k = 1:length(U) 
      i = i + 1; 
      Tcols(i) = U(k); 
      Trows(i) = p; 
      Tvals(i) = sum(H(mKerInds == U(k))); 
     end 
    end 
end 

T = sparse(Trows(1:i), Tcols(1:i), Tvals(1:i), m*n, m*n); 

end 

和一些示例用法:

n = 100; 
im = rand(n); 
h = fspecial('gaussian', 5, 1); 

mConvMtx = getConvMtx(h, n, n); 
im2 = reshape(mConvMtx * im(:), size(im)); 

im3 = imfilter(im, h, 'replicate'); 

% figure;imshow(im3); 
% figure;imshow(im2); 
sum(abs(im2(:) - im3(:))) %will give a very small number due to precision issues 

這裏有結果,以便(imim2im3):

im im2 im3

+0

如果添加了輸入和輸出圖像,它會更好。 – kkuilla 2014-10-02 08:05:39

+0

你明白了,謝謝你的提示 – Stav 2014-10-02 09:14:30