Second practical session for "Introduction to image processing"

Bruno Galerne, Monday June 28, 2021

Link to the .m file:

https://www.idpoisson.fr/galerne/ed_images/tp3_intro_traitement_images.m

Download this file in a folder dedicated to the course and open matlab from there.

Contents

Download the images:

https://www.idpoisson.fr/galerne/ed_images/image_sharpening.png

https://www.idpoisson.fr/galerne/ed_images/parrot.bmp

https://www.idpoisson.fr/galerne/ed_images/jump.jpg

Discrete Fourier transform:

Recall from TP2:

u = rgb2gray(double(imread('parrot.bmp'))/255);
mdftu = abs(fftshift(fft2(u)));
logmdftu = log(1+mdftu);

figure;
subplot(1,3,1);
imshow(u);
title('image');
subplot(1,3,2);
imshow(logmdftu,[]);
title('Fourier modulus');
subplot(1,3,3);
imhist(logmdftu/max(logmdftu(:)),256);
drawnow

Low pass filter

Reproduce the low-pass filter demo in Matlab using the Parrot image (in grayscale) The code to produce a disk image is given below.

Discuss the different details that appear as the radius grows.

u = rgb2gray(double(imread('parrot.bmp'))/255);
% crop if odd size:
if mod(size(u,2),2) == 1
    u = u(1:end-1,:);
end
if mod(size(u,2),2) == 1
    u = u(:,1:end-1);
end

[M,N] = size(u);
radius = 100;
[Y,X] = meshgrid((-N/2):(N/2-1),(-M/2):(M/2-1));
D = X.^2+Y.^2; % distance to center at (M/2+1, N/2+1)
mask = (D <= radius^2);

figure
subplot(2,2,1)
imshow(X,[])
title('1st Fourier index');
subplot(2,2,2)
imshow(Y,[])
title('2nd Fourier index');
subplot(2,2,3)
imshow(D,[])
title('Distance to center');
subplot(2,2,4)
imshow(mask,[]);
title('Mask');

todo_low_pass_filter

% todo test image rectangulaire.
     0

Image sharpening

Reproduce the experiment for image sharpening on the image 'image_sharpening.png'.

To do the smooth mask, apply a Gaussian convolution filter to the binary disk used above.

u = double(imread('image_sharpening.png'))/255;
figure;
imshow(u);

%TODO

Image segmentation using histogram thresholding

Find the best chanel and best threshold for this channel to segment the man in the picture.

u = double(imread('jump.jpg'))/255;
r = u(:,:,1); % always use semi-column otherwise display of all coefficient in the command window...
g = u(:,:,2);
b = u(:,:,3);

tr = 30/255;
tg = 30/255;
tb = 30/255;

figure;
subplot(3,3,1);
imshow(u);

subplot(3,3,4);
imshow(r);
title('red chanel');
subplot(3,3,5);
imshow(g);
title('green chanel');
subplot(3,3,6);
imshow(b);
title('blue chanel');
subplot(3,3,7);
imshow(u(:,:,1)>tr);
title('Threshold red');
subplot(3,3,8);
imshow(u(:,:,2)>tg);
title('Threshold green');

subplot(3,3,9);
imshow(u(:,:,3)<tb);
title('Threshold blue');

imageSegmenter:

Try the imagesegmenter with the jump image and an image of your own. Send me the mask by email.

Use the "export" button.

Then use imwrite(uint8(255*maskedImage), 'segmented_result.png');

Command to execute: imageSegmenter(u); % save result after Export: % imwrite(uint8(255*maskedImage), 'segmented_result.png');

% my result:
figure;
imshow(imread('jump.jpg'));
figure;
imshow(imread('segmented_result.png'))

Credits:

Some parts of this practical session are inspired by: C. Deledalle course:

https://www.charles-deledalle.fr/pages/teaching.php

jump image from:

https://matlabtricks.com/post-35/a-simple-image-segmentation-example-in-matlab