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);
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:



Posted by paintdexter