2014-04-29 26 views
0

我想計算卷積運算符A和伴隨運算符AT,我需要計算AU = H * U和AT(AU),其中H是內核並且尺寸非常小比圖像U.這是我的代碼,是否有任何錯誤?我不知道如何擴大與U相同的尺寸。謝謝!matlab卷積算子A和伴隨運算符


 [M,N] = size(U); 
     Mask = zeros(M,N); 
     [H1,L] = size(H); 
     %Mask([end+1-floor(H1/2):end,1:ceil(H1/2)],[end+1-floor(L/2):end,1:ceil(L/2)]) = H; 
     Mask(1:size(h,1),1:size(h,2)) = H; % here I am not sure!!!! 
     FMask=fft2(Mask); 
     AU =iff2(FMask.*(fft2(U))) %%% AU= H*U 
     ATAU= iff2((abs(FMask).^2).*(fft2(U))) %AT(AU) 
+1

任何理由不使用'conv2'? – Dan

+0

@Dan空間域中的卷積比使用傅里葉卷積定理計算量大得多。 – Raab70

+0

@ Raab70,但這個問題沒有提到計算限制,因此在繼續這種方法之前,值得確保OP(a)知道'conv2'和(b)有充分的理由不使用它。 – Dan

回答

0

「我不知道如何將籽粒爲U.擴展到相同大小」這是一個很好的問題,它最正式的名稱是填充。有很多方法來填充你的過濾器,最簡單的當然是在外面添加一些零。 This q and a有一些關於零填充效果的信息。 This resource也有關於填充效果的一些很好的信息。

這裏是一個小例子,可以幫助:

im=imread('peppers.png'); 
[rows,cols,bands]=size(im); 
% //make the meshgrid of coordinates 
x=1:cols;y=1:rows; 
[X,Y] = meshgrid(x,y); 

% //compute the filter in the fourier domain, 
% //centered top right so we dont need to shift 
filter = mvnpdf([X(:) Y(:)],[0 0]',sigma.*eye(2)); 
filter = reshape(filter,[rows,cols]); 

% //convolution theorem 
im_fft = fft2(im); 
im_filt = ifft(im_fft.*repmat(filter,[1,1,bands])); 

% //display 
figure;subplot(1,2,1);imagesc(im);title('Original image'); 
subplot(1,2,2);imagesc(im_filt);title('Filtered Image');