function mediasel = mediasel(img,mask)
%
% Calcola la media solo dei valori in img
% che vengono selezionati da una matrice binaria
% 
%   Argomenti:
%
%       img:  immagine grayscale NxM
%       mask: maschera booleana (binaria) che
%             seleziona gli elementi che partecipano
%             al calcolo della media
%

% la funzione inizia controllando che le dimensioni
% dell'immagine e della maschera siano identiche. Se
% questa condizione non è verificata la funzione esce
% con un messaggio di errore.

% La funzione all() verifica che la matrice passata come
% argomento sia fatta solo da valori 1. In questo caso 
% significa che il risultato del confronto tra size(img) 
% e size(mask) deve essere vero per entrambe le dimensioni
% delle matrici

    if (~all(size(img) == size(mask))) 
        error('La matrice immagine e la maschera devono avere identiche dimensioni')
    end

% inoltre la matrice 'mask' deve essere booleana

    if (~islogical(mask))
        error('Il secondo argomento deve essere una matrice booleana');
    end

% l'immagine deve essere in formato double normalizzata
% nell'intervallo [0,1] (solitamente generata con 'mat2gray')

    if (~isfloat(img))
        error('L immagine deve essere normalizzata e in formato double')
    end
    
% la matrice selezione preserva i pixel selezionati
% dalla maschera mentre i rimanenti sono posti a zero. 

    selezione = img .* mask;

% si calcola l'accumulatore della media. I pixel
% che non fanno parte della classe non contribuiscono,
% ma non contano nemmeno nella determinazione del
% denominatore della frazione della media

% per calcolare la somma usiamo la notazione 
% che permette di individuare un insieme sparso
% di elementi della matrice tramite una matrice
% booleana

    somma = sum(selezione(:));

% La somma degli elementi della maschera è il numero
% dei pixel che appartengono alla classe individuata
% dalla maschera stessa

    N = sum(mask(:));
    if (N > 0)
        mediasel = somma / N;
    else
        mediasel = 0;
    end
end

% -- mediasel.m
