2D Convolution - Bottom Edge

 

Convolution would be the one of the most important operations in engineering math. If you don't have any prior study and understanding on how Convolution works, it would not be easy to make sense out of it. For those who is not familiar with Convolution, I would suggest you to go through my descriptive note here.

 

The example in this page is to show how the convolution works for 2D data(i.e, 2D array data like an image). This 2D convolution has long been used for the purpose of various image processing (especially for edge detection), but it has become very popular and important concept since it is used by a famous neural network/machine learning algorithm called CNN.

 

As I always says, the best way to understand this kind of comlicated mathematical concept is to get a very simple example and answer key and then do it yourself with pen and paper. To help you to easily check if your calculation is correct or wrong, I used in this example a 2D data which is made up of only 1 or 0.

 

 

 

Followings are the code that I wrote in Octave to creates all the plots shown in this page. You may copy these code and play with these codes. Change variables and try yourself until you get your own intuitive understanding.

 

< Code 1 >

 

img = [0 0 0 0 0 0 0 0 0 0; ...

       0 0 0 0 1 1 1 0 0 0; ...

       0 0 0 1 1 1 1 0 0 0; ...

       0 0 1 1 1 1 1 0 0 0; ...

       0 0 0 0 1 1 1 0 0 0; ...

       0 0 0 0 1 1 1 0 0 0; ...

       0 0 0 0 1 1 1 0 0 0; ...

       0 1 1 1 1 1 1 1 1 0; ...

       0 1 1 1 1 1 1 1 1 0; ...

       0 0 0 0 0 0 0 0 0 0];       

       

flt = [-1 -2 -1; ...

         0  0  0; ...

         1  2  1];

      

hFig = figure(1,'Position',[300 300 1020 300]);

 

cx = 7;

cy = 7;

 

%--------------------------------------------------------------------

% Display Image

subplot(1,4,1);     

 

line([0 0],[13 14],'color','black');

line([0 1],[14 14],'color','black');

 

tx = 0;

ty = 0;

rdx = 1;

rdy = 1;

     

for j = 1:10

  for i = 1:10

     rx = tx + i*rdx;

     ry = ty + j*rdy;     

     if img(10-j+1,i) > 0

        c = 0;

        tStr = '1';

     else

        c = 1;

        tStr = '0';

     end  

     rectangle('Position',[rx ry rdx rdy],'FaceColor',[c c c]);

     if c == 1

        text(rx+0.3,ry+0.5,tStr,'color','black');

     else

        text(rx+0.3,ry+0.5,tStr,'color','yellow');

     end   

  end

end  

 

rectangle('Position',[cx+1 10-cy-1-1 3 3],'EdgeColor','red');

 

text(5,12,'image');     

axis([0 12 -4 16]);    

axis off;

 

%--------------------------------------------------------------------

% Display Filter

subplot(1,4,2);     

 

tx = 0;

ty = 0;

rdx = 1;

rdy = 1;

     

for j = 1:10

  for i = 1:10

     rx = tx + i*rdx;

     ry = ty + j*rdy;     

     c = 1;

     rectangle('Position',[rx ry rdx rdy],'FaceColor',[c c c]);  

  end

end  

 

tx = 0;

ty = 11;

rdx = 1;

rdy = 1;

 

     

for j = 1:3

  for i = 1:3

     rx = cx + tx + i*rdx;

     ry = -cy + ty - j*rdy;     

     c = 1;

     tStr = sprintf("%d",flt(j,i));

     rectangle('Position',[rx ry rdx rdy],'FaceColor',[c c c]);  

     if flt(j,i) < 0

       text(rx+0.0,ry+0.5,tStr,'color','black');

     else  

       text(rx+0.2,ry+0.5,tStr,'color','black');

     end   

  end

end  

 

rectangle('Position',[cx+1 10-cy-1-1 3 3],'EdgeColor','red');

 

text(5,12,'filter');

     

axis([0 12 -4 16]);    

axis off;

 

%--------------------------------------------------------------------

% Display Image x Filter

subplot(1,4,3);     

 

tx = 0;

ty = 0;

rdx = 1;

rdy = 1;

 

for j = 1:10

  for i = 1:10

     rx = tx + i*rdx;

     ry = ty + j*rdy;     

     c = 1;

     rectangle('Position',[rx ry rdx rdy],'FaceColor',[c c c]);  

  end

end

 

tx = 0;

ty = 11;

rdx = 1;

rdy = 1;

 

mFlt = [0 0 0;...

        0 0 0;

        0 0 0];

 

for j = 1:3

  for i = 1:3

      mFlt(j,i) = img(j+cy,i+cx) * flt(j,i);

  end

end

  

for j = 1:3

  for i = 1:3

     rx = cx + tx + i*rdx;

     ry = -cy + ty - j*rdy;    

     c = 1;

     tStr = sprintf("%d",mFlt(j,i));

     rectangle('Position',[rx ry rdx rdy],'FaceColor',[c c c]);  

     if mFlt(j,i) < 0

       text(rx+0.0,ry+0.5,tStr,'color','black');

     else  

       text(rx+0.2,ry+0.5,tStr,'color','black');

     end   

  end

end  

 

rectangle('Position',[cx+1 10-cy-1-1 3 3],'EdgeColor','red');

     

text(3,12,'image x filter');

     

axis([0 12 -4 16]);   

axis off;

 

%--------------------------------------------------------------------

% Display Image * Filter

subplot(1,4,4);    

tx = 0;

ty = 0;

rdx = 1;

rdy = 1;

sxMax = 0

     

for j = 1:10

  for i = 1:10

     rx = tx + i*rdx;

     ry = ty + j*rdy;     

     c = 1;

     rectangle('Position',[rx ry rdx rdy],'FaceColor',[c c c]);  

     %text(rx+0.2,ry+0.5,tStr,'color',[1 0 0]);

  end

end  

 

for sy = 0:cy

    if sy < cy

       sxMax = 7;

    else

       sxMax = cx;

    end   

  for sx = 0:sxMax

    mFlt = [0 0 0;...

            0 0 0;

            0 0 0];

    

    for j = 1:3

      for i = 1:3

          mFlt(j,i) = img(j+sy,i+sx) * flt(j,i);

      end

    end

    

    

    s = sum(reshape(mFlt,[],1));

    tStr = sprintf("%d",s);

    

    c = 0.5+(s/10);

    if s == 0

       rectangle('Position',[sx+1+1 10-sy-1 rdx rdy],'FaceColor',[0.1 0.1 0.1]);

    else  

       rectangle('Position',[sx+1+1 10-sy-1 rdx rdy],'FaceColor',[c 0 0.5-0.5*c]);

    end    

    

    if s < 0

       text(sx+1+1+0.0,10-sy-1+0.5,tStr,'color','yellow');

    else  

       text(sx+1+1+0.2,10-sy-1+0.5,tStr,'color','yellow');

    end

  end

end

 

rectangle('Position',[cx+1+1 10-cy-1 1 1],'EdgeColor','red');

 

text(3,12,'image * filter');

 

line([12 12],[-2 -1],'color','black');

line([11 12],[-2 -2],'color','black');

 

axis([0 12 -4 16]);     

axis off;