clear all;
clc;

%% I/O di immagini da file
% Carica l'immagine da file nella matrice X
X = imread('satellite_gray.jpg');

% visualizza l'immagine
figure;
imshow(X);

% le immagini sono matrici, ma non di double
whos
% uint8: 8 bit -> 0..255
X(1:10, 1:10)
% elementi maggiori di 255 sono visualizzati come bianco (255)
imshow(X*2)
X(1:10, 1:10)*2
% valori minori di 0 vengono posti a 0
imshow(X-150)
X(1:10, 1:10)-150

% Le immagini possono essere immagini in bianco-e-nero (binarie, 0 nero, 1 bianco)
imshow(X<80)

% Memorizzazione di una immagine in un file
imwrite(X<80, 'sat_threshold.png');
% Il formato puo' essere specificato
% Senza opzioni esplicite, il formato piu' compatto viene utilizzato
% per la rappresentazione nel workspace
T = imread('sat_threshold.png');
whos

%% Conversione
X = imread('teethwhitening_Woman_Smile_small.jpg');
imshow(X);
title('RGB');
whos
% le immagini a colori sono rappresentate come combinazione dei tre
% colori primari (Red, Green, Blue).
% In Matlab, le immagini sono quindi rappresentate come matrici tridimensionali
% (#rows, #columns, #channels).

%
figure;
imshow(X(:,:,1))
title('R');
figure;
imshow(X(:,:,2))
title('G')
figure;
imshow(X(:,:,3))
title('B');

% le immagini a colori possono essere convertite in immagini a toni
% di grigio
T = rgb2gray(X);
figure;
imshow(T);
title('Toni di grigio');
whos

%% Casting
% La rappresentazione intera puo' comportare qualche problema
% numerico 
T(25767),
T(25767)/2,
T(25767)*100,
% il casting consente l'elaborazione di variabili intere come se
% fossero  in double
double(T(25767))/2,
double(T(25767))*100,
% puo' essere utile anche per la visualizzazione
mesh(double(T))

T = imread('rice.png');
X = imread('satellite_gray.jpg');
X = imcrop(X, [1 1 size(T)-1]);
Z = imadd(X, T);
imshow(Z, []);
Z = imadd(X, T, 'uint16');
imshow(Z, []);

help imadd
help imsubtract
help imabsdiff

X = uint8([ 255 0 75; 44 225 100]),
Y = uint8([ 50 50 50; 50 50 50 ]),
imdivide(X,Y),
imdivide(Y,X),

help imdivide
help immultiply

help imcomplement
help imlincomb


%% Topologia
% Ritorna una struttura con la lista delle componenti connesse
% rispetto ad una specificata relazione di vicinanza
X = T > 220;
cc = bwconncomp(X,4);
