function [histo,hcum] = imhisto(im,TIP,M)

%
% HISTO Calculeaza histograma si histograma cumulativa a unei imagini
%
% [H,HCUM]=HISTO(IN,SWITCH,M)
% H este vectorul histogramei imaginii
% HCUM este vectorul histogramei cumulative
% IN este imaginea cu nivele de gri (1 - M) careia i se calculeaza
% histograma. Se folosesc trei metode: baleierea punct cu punct a
% imaginii (SWITCH=1) sau determinarea numarului de puncte pe
% fiecare nivel de gri (bucla for de M) (SWITCH=2) sau o 
% metoda bazata pe ordonare (SWITCH=3).
% Daca TIP nu se da, se ia IMPLICIT valoarea 3.
% M este numarul maxim de nivele de gri din imagine; in
% mod implicit se considera a fi 256.
%


if ~exist('im','var')
    error('Nu ati furnizat imaginea de intrare!');
end

if ~exist('TIP','var')
    TIP = 3;
end

if ~exist('M','var')
    M = 256;
end

[lin col]=size(im);
histo = zeros(1,M);


switch(TIP)
    
case 1,
    for i = 1:lin
        for j = 1:col
            histo(im(i,j)+1) = histo(im(i,j)+1)+1;
        end
    end
    
case 2,
    for i=1:M,
        histo(i)=length(find(im(:)==i-1));
    end
    
case 3,
    im = sort(im(:)+1);
    [poz,dummy,val]=find([im(1);im(2:lin*col)-im(1:(lin*col-1))]);
    histo(cumsum(val)) = [poz(2:length(poz));1+lin*col]-poz;
    
otherwise
    help histo
    error('Parametrul TIP nu corespunde!')
end

histo = histo/lin/col;
hcum = cumsum(histo);