Edge Detection Simulation

April 6, 2008

The following example demonstrates edge detection on a black and white image. I wrote the code in MATLAB.

clear;
clc;

% Define kernel parameters
sigma = 4;
size = 4;

% Initialize dimensions of kernel matrix
xKerMax = 3;
yKerMax = 3;

% Initialize dimensions of source image
yMax = 326;
xMax = 640;

% Initialize the kernel matrix
kernel = zeros(3, 3);

% Initialize the destination image
dstImg = zeros(yMax – (yKerMax – 1),xMax – (xKerMax – 1));

% Compute elements of kernel matrix
for yKer = 1:yKerMax
for xKer = 1:xKerMax
if( mod((yKer – 1)*yKerMax + xKer, 2) == 0)
kernel(yKer, xKer) = -1;
else
kernel(yKer, xKer) = 0;
end
if( (yKer – 1)*yKerMax + xKer == 5)
kernel(yKer,xKer) = sigma;
end
end
end

% Plot kernel
%figure(3),surf(xKer,yKer,kernel);

% Load the source Image
srcImg = imread(‘bw.jpg’);

% Convert data in image to double
srcImg = im2double(srcImg);

% Plot the data in source image
figure(1), imshow(srcImg);

% Carry out convolution
for y = 1:(yMax – (yKerMax – 1))
for x = 1:(xMax – (xKerMax – 1))
for yKer = 1:yKerMax
for xKer = 1:xKerMax
dstImg(y,x) = dstImg(y,x) + srcImg(y + yKer – 1, x + xKer – 1)*kernel(yKer, xKer);
end
end
end
end

dstImg = im2uint8(dstImg);

figure(2), imshow(dstImg);

The source image before filtering

The filtered image

By altering the part of the code involving the convolution, we can create a binary image that may give us a clearer picture of the outlines of the image. The change is as follows:

% Carry out convolution
for y = 1:(yMax – (yKerMax – 1))
for x = 1:(xMax – (xKerMax – 1))
for yKer = 1:yKerMax
for xKer = 1:xKerMax
dstImg(y,x) = dstImg(y,x) + srcImg(y + yKer – 1, x + xKer – 1)*kernel(yKer, xKer);
end
end
if (dstImg(y,x) <= 0)
dstImg(y,x) = 0;
else
dstImg(y,x) = 1;
end
end
end

This yields the following binary image:

The binary image