這是我如何設法獲得所需的結果。然而,這是非常低效的,因此任何意見和建議,我們非常歡迎:
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
這裏有結果,以便(im
,im2
,im3
):
如果添加了輸入和輸出圖像,它會更好。 – kkuilla 2014-10-02 08:05:39
你明白了,謝謝你的提示 – Stav 2014-10-02 09:14:30