Convolution in MATLAB

                 Let us try to understand convolution by performing spatial averaging on a matrix without using MATLAB built in function ‘conv2()’.

%CONVOLUTION IN MATLAB

%INPUT  MATRIX
A = zeros(5);
A(:) = 1:25;

%KERNEL
avg3 = ones(3)/9;

%CONVOLUTION
Result = conv2(A,avg3,'same');
display(Result);

Steps to be performed:





NOTE :
To define a kernel for spatial averaging, fill the kernel with ones and divide it by the number of elements in it.
For instance, consider kernel of size 4x4 , fill the  matrix with ones and divide it by 16. i.e the total number of elements in the matrix.

MATLAB CODE:
%INPUT  MATRIX
A = zeros(5);
A(:) = 1:25;

%KERNEL
avg3 = ones(3)/9;

%PAD THE MATRIX WITH ZEROS
B = padarray(A,[1 1]);
% PRE-ALLOCATE THE MATRIX
Output = zeros([size(A,1) size(A,2)]);

%PERFORM COONVOLUTION
for i = 1:size(B,1)-2
    for j = 1:size(B,2)-2
        Temp = B(i:i+2,j:j+2).*avg3;
        Output(i,j) = sum(Temp(:));
    end
 end

display(Output);

10 comments:

  1. Its interesting and good for students.

    ReplyDelete
  2. The key is to give the peruser a little look into your experience, which urges them to need to take in more by perusing your resume
    Medical Science Homework Help

    ReplyDelete
  3. Congratulations very interesting and didactically, do you have a youtube channel? if no, think about it.

    ReplyDelete
  4. Man You are a life save, thanks for this easy explaining :) :)

    ReplyDelete
  5. Hey In understand your example very clearly. I have question. If i want to subtraction any pixel intensity from its 8 neighbors pixel intensity(this is for every pixels in the image) and then take the absolute sum of the subtraction. How should I define the kernel (avg3 in your example) and perform the task with conv2?

    ReplyDelete
  6. Thanks was very helpful for my assignment!

    ReplyDelete
  7. plz tell me how to use it , I cant understand...

    ReplyDelete
  8. Hello, I keep getting the following error "Subscript indices must either be real positive integers or logicals.

    Error in test (line 16)
    Output(i,j) = sum(Temp(:));"

    do you have any advice? thank you

    ReplyDelete
  9. I tried with a kernel containing elements with different values (not a constant value as in your example) and the convolution with conv2 or with the for loop gave different results, why? I used the following code:

    %CONVOLUTION IN MATLAB with conv2
    clear
    %INPUT MATRIX
    A = zeros(5);
    A(:) = 1:25;

    %KERNEL
    avg3 = rand(3);

    %CONVOLUTION
    Result = conv2(A,avg3,'same');
    display(Result);



    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % EXPLICIT calculation using the same kernel


    %PAD THE MATRIX WITH ZEROS
    B = padarray(A,[1 1]);
    % PRE-ALLOCATE THE MATRIX
    Output = zeros([size(A,1) size(A,2)]);

    %PERFORM COONVOLUTION
    for i = 1:size(B,1)-2
    for j = 1:size(B,2)-2
    Temp = B(i:i+2,j:j+2).*avg3;
    Output(i,j) = sum(Temp(:));
    end
    end

    display(Output);

    ReplyDelete
  10. @Michele

    Rotate the convolution mask by 180 degrees.

    Example:
    Temp = B(i:i+2,j:j+2).*rot90(avg3,2);

    The mask in the given example is symmetric so rotating it by 180 degree yielded the same mask.

    ReplyDelete