echo on
%
%
% most basic intro to matlab for image processing
%
% download einstein.pgm here, and change
% below line to get the path correct.
%
im = pgmread('einstein.pgm');
%
% pgmread is not a standard matlab procedure. If you don't it, do a
% google search for pgmread matlab, download the .m file and put it
% in your matlab directory...
%
% matlab DOES include a procedure called imread, which can read a number
% of standard image file types... like jpeg, bmp, gif etc. To get a list
% of all of them, you can type
%
help imread
pause
%
% The ; at the end of a line tells matlab not to print out the result,
% you can always leave it out, and then you will get, on your screen, a
% stream of numbers, (the print out of the image array).
%
imagesc(im);
%
% imagesc( 2Darray ) displays the image, with the pixel intensities
% linearly scaled to take up the entire range.
%
% This probably made a strangely colored picture...
%
colormap gray
pause
%
% Tells matlab to use a colormap where array value is encoded by pixel
% brightness
%
%
%
% Ok, so now lets try some stuff....
%
% What is an image convolution?
% We defined it in class, For each pixel location, (1) Smack the filter
% down on top of the image at that location, and (2) add up the product
% of the stacked image pixel and filter pixel values.
%
% Before we start, we need to define a filter...
%
% Let's do:
%
F = [0.25 0.5 0.25];
%
%
% size(A) returns and array that contains the size of a matrix.
% zeros([x y]) makes an r x c array of zeros
%
imOut = zeros(size(im));
%
%for ix = 1 : size(im,1) - size(F,1) + 1;
% for iy = 1 : size(im,2) - size(F,2) + 1;
% tmp = 0;
% for ij = 1:size(F,1);
% for ik = 1:size(F,2);
% tmp = tmp + im(ix + ij - 1 ,iy + ik - 1) .* F(ij,ik);
% end
% end
% imOut(ix,iy) = tmp;
% end
%end
echo off
for ix = 1 : size(im,1) - size(F,1) + 1;
for iy = 1 : size(im,2) - size(F,2) + 1;
tmp = 0;
for ij = 1:size(F,1);
for ik = 1:size(F,2);
tmp = tmp + im(ix + ij - 1 ,iy + ik - 1) .* F(ij,ik);
end
end
imOut(ix,iy) = tmp;
end
end
echo on
%
% So what do you think that convolving an image with the filter [0.25 0.5 0.25]
% will do?
imagesc(imOut);
pause
%
% (?) Where is this filter centered? or, if you smack the filter on the
% image, where, relative to that filter, is the result stored in the
% output array?
%
% This is kinda slow.
%
% (?) How slow?... as a function of the image size and the filter size?
%
% Happily, matlab already has a routine to perform convolutions, and this
% routine is optimized to be faster than if we use for loops. In
% general, in matlab, try to get it to do all matrix operations and
% iterate as rarely as possible...
pause
imOut2 = conv2(im,F);
% we can compare the two images:
subplot(1,2,1); imagesc(im);
subplot(1,2,2); imagesc(imOut2);
% and they are almost identical, except that matlab puts the output at
% the center of the filter position, and assumes the image is surrounded
% by zeros, and computes the filter reponse for anywhere that the filter
% is centered on a valid image pixel.
%
% This convolution routine has several options about how to deal with the
% boundary conditions.
%
help conv2
pause
% derivative filter
F = [-1 0 1];
imOut3 = conv2(im,F);
% we can again compare the two images:
subplot(1,2,1); imagesc(im);
subplot(1,2,2); imagesc(imOut3);
pause
% for more information about the image toolbox look at the help
help images
% help images
pause
%
edgedemo
echo off