to jest nasze ćwiczenie w zadaniach domowych obróbki obrazu. mój kod działa poprawnie. Chciałbym uzyskać pomoc w optymalizacji kodu.Splot 2D w matlab - optymalizacja kodu
function C = convolve_slow(A,B)
(file name is accordingly convolve_slow.m)
This routine performs convolution between an image A and a mask B.
Input: A - a grayscale image (values in [0,255])
B - a grayscale image (values in [0,255]) serves as a mask in the convolution.
Output: C - a grayscale image (values in [0,255]) - the output of the convolution.
C is the same size as A.
Method: Convolve A with mask B using zero padding. Assume the origin of B is at
floor(size(B)/2)+1.
Do NOT use matlab convolution routines (conv,conv2,filter2 etc).
Make the routine as efficient as possible: Restrict usage of for loops which are expensive (use matrix multiplications and matlab routines such as dot etc).
To simplify and reduce ifs, you should pad the image with zeros before starting your convolution loop.
Do not assume the size of A nor B (B might actually be larger than A sometimes).
Oto nasze rozwiązanie
function [ C ] = convolve_slow(A,B)
%This routine performs convolution between an image A and a mask B.
% Input: A - a grayscale image (values in [0,255])
% B - a grayscale image (values in [0,255]) serves as a mask in the convolution.
% Output: C - a grayscale image (values in [0,255]) - the output of the convolution.
% C is the same size as A.
%
% Method: Convolve A with mask B using zero padding. Assume the origin of B is at floor(size(B)/2)+1.
% init C to size A with zeros
C = zeros(size(A));
% make b xy-reflection and vector
vectB = reshape(flipdim(flipdim(B,1),2)' ,[] , 1);
% padding A with zeros
paddedA = padarray(A, [floor(size(B,1)/2) floor(size(B,2)/2)]);
% Loop over A matrix:
for i = 1:size(A,1)
for j = 1:size(A,2)
startAi = i;
finishAi = i + size(B,1) - 1;
startAj = j;
finishAj = j + size(B,2) - 1;
vectPaddedA = reshape(paddedA(startAi :finishAi,startAj:finishAj)',1,[]);
C(i,j) = vectPaddedA* vectB;
end
end
end
ponieważ jestem nowy na Przetwarzanie obrazu i Matlab. czy możesz mi pomóc w optymalizacji kodu, szczególnie przy użyciu operacji opartych na macierzy. czy można nie używać pętli?
ty wolno używać fft2 i ifft2 działa w jakikolwiek sposób? Jeśli tak, byłby to sposób na szybkie znalezienie rozwiązania. – MarkV
Nie, przepraszam, no fft, głównym założeniem jest to, że implementujemy splot, aby dowiedzieć się, jak to działa. to działa! teraz chcę zobaczyć, czy istnieje sposób, aby zrobić to lepiej. – Gilad