5
\$\begingroup\$
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). <br>
 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).

here is my solution for this exercise. please elaborate on any change you have done or suggesting since i'm new to matlab and image processing.

function [ C ] = convolve_slow( A,B )<br>
%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 
asked Dec 15, 2012 at 13:43
\$\endgroup\$

1 Answer 1

3
\$\begingroup\$

Rather than making four variables just to index the matrix, I would go for two in such a way:

paddedA(i :i_end,j:j_end)
answered Dec 24, 2012 at 15:39
\$\endgroup\$

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.