function rezultat = detekcija_ruba(slika, matrica, k, l)

velicina = max(size(slika));
vel_segmenta = 32;

broj_segmenta = velicina/vel_segmenta;

novi_segment = zeros(vel_segmenta);

% -------------------------------------------------------------------------
% - SLIJED IF-ova KOJIMA ODREDJUJEMO KOJE SUSJEDE IMA PROMATRANI SEGMENT --
% -------------------------------------------------------------------------
if (k == 0)
    % nalazim se u prvom redu
    % svaki segment u prvom redu ima donjeg susjeda
    susjed_d = slika((k+1)*vel_segmenta+1 : (k+1)*vel_segmenta + vel_segmenta,...
                 l*vel_segmenta+1 : l*vel_segmenta + vel_segmenta);
    CSGV_d = CSGvektor(susjed_d);
    susjed_d_labela = matrica((k+1)*vel_segmenta+1, l*vel_segmenta+1);  
    if (l == 0)
        % nalazim se u prvom stupcu
        susjed_de = slika(k*vel_segmenta+1 : k*vel_segmenta + vel_segmenta,...
                         (l+1)*vel_segmenta+1 : (l+1)*vel_segmenta + vel_segmenta);
        CSGV_de = CSGvektor(susjed_de);
        susjed_de_labela = matrica(k*vel_segmenta+1, (l+1)*vel_segmenta+1);
    elseif (l == broj_segmenta-1)
        % nalazim se u zadnjem stupcu
        susjed_l = slika(k*vel_segmenta+1 : k*vel_segmenta + vel_segmenta,...
                         (l-1)*vel_segmenta+1 : (l-1)*vel_segmenta + vel_segmenta);
        CSGV_l = CSGvektor(susjed_l);
        susjed_l_labela = matrica(k*vel_segmenta+1, (l-1)*vel_segmenta+1);
    else
        % nalazim se na sredini prvog retka
        susjed_de = slika(k*vel_segmenta+1 : k*vel_segmenta + vel_segmenta,...
                         (l+1)*vel_segmenta+1 : (l+1)*vel_segmenta + vel_segmenta);
        CSGV_de = CSGvektor(susjed_de);
        susjed_de_labela = matrica(k*vel_segmenta+1, (l+1)*vel_segmenta+1);

        susjed_l = slika(k*vel_segmenta+1 : k*vel_segmenta + vel_segmenta,...
                         (l-1)*vel_segmenta+1 : (l-1)*vel_segmenta + vel_segmenta);
        CSGV_l = CSGvektor(susjed_l);
        susjed_l_labela = matrica(k*vel_segmenta+1, (l-1)*vel_segmenta+1);
    end;
elseif (k == broj_segmenta-1)
    % nalazim se u zadnjem retku
    % svi imaju gornjeg susjeda
    susjed_g = slika((k-1)*vel_segmenta+1 : (k-1)*vel_segmenta + vel_segmenta,...
                     l*vel_segmenta+1 : l*vel_segmenta + vel_segmenta);
    CSGV_g = CSGvektor(susjed_g);
    susjed_g_labela = matrica((k-1)*vel_segmenta+1, l*vel_segmenta+1);
    if (l == 0)
        % nalazim se u prvom stupcu
        susjed_de = slika(k*vel_segmenta+1 : k*vel_segmenta + vel_segmenta,...
                         (l+1)*vel_segmenta+1 : (l+1)*vel_segmenta + vel_segmenta);
        CSGV_de = CSGvektor(susjed_de);
        susjed_de_labela = matrica(k*vel_segmenta+1, (l+1)*vel_segmenta+1);
    elseif (l == broj_segmenta-1)
        % nalazim se u zadnjem stupcu
        susjed_l = slika(k*vel_segmenta+1 : k*vel_segmenta + vel_segmenta,...
                         (l-1)*vel_segmenta+1 : (l-1)*vel_segmenta + vel_segmenta);
        CSGV_l = CSGvektor(susjed_l);
        susjed_l_labela = matrica(k*vel_segmenta+1, (l-1)*vel_segmenta+1);
    else
        % nalazim se na sredini prvog retka
        susjed_de = slika(k*vel_segmenta+1 : k*vel_segmenta + vel_segmenta,...
                         (l+1)*vel_segmenta+1 : (l+1)*vel_segmenta + vel_segmenta);
        CSGV_de = CSGvektor(susjed_de);
        susjed_de_labela = matrica(k*vel_segmenta+1, (l+1)*vel_segmenta+1);

        susjed_l = slika(k*vel_segmenta+1 : k*vel_segmenta + vel_segmenta,...
                         (l-1)*vel_segmenta+1 : (l-1)*vel_segmenta + vel_segmenta);
        CSGV_l = CSGvektor(susjed_l);
        susjed_l_labela = matrica(k*vel_segmenta+1, (l-1)*vel_segmenta+1);
    end;
else
    % nalazim se u nekom retku u sredini
    % svi imaju gornjeg i donjeg susjeda
    susjed_g = slika((k-1)*vel_segmenta+1 : (k-1)*vel_segmenta + vel_segmenta,...
                     l*vel_segmenta+1 : l*vel_segmenta + vel_segmenta);
    CSGV_g = CSGvektor(susjed_g);
    susjed_g_labela = matrica((k-1)*vel_segmenta+1, l*vel_segmenta+1);
    % ------------------
    susjed_d = slika((k+1)*vel_segmenta+1 : (k+1)*vel_segmenta + vel_segmenta,...
                 l*vel_segmenta+1 : l*vel_segmenta + vel_segmenta);
    CSGV_d = CSGvektor(susjed_d);
    susjed_d_labela = matrica((k+1)*vel_segmenta+1, l*vel_segmenta+1);  

    if (l == 0)
        % nalazim se u prvom stupcu
        susjed_de = slika(k*vel_segmenta+1 : k*vel_segmenta + vel_segmenta,...
                         (l+1)*vel_segmenta+1 : (l+1)*vel_segmenta + vel_segmenta);
        CSGV_de = CSGvektor(susjed_de);
        susjed_de_labela = matrica(k*vel_segmenta+1, (l+1)*vel_segmenta+1);
    elseif (l == broj_segmenta-1)
        % nalazim se u zadnjem stupcu
        susjed_l = slika(k*vel_segmenta+1 : k*vel_segmenta + vel_segmenta,...
                         (l-1)*vel_segmenta+1 : (l-1)*vel_segmenta + vel_segmenta);
        CSGV_l = CSGvektor(susjed_l);
        susjed_l_labela = matrica(k*vel_segmenta+1, (l-1)*vel_segmenta+1);
    else
        % nalazim se na sredini prvog retka
        susjed_de = slika(k*vel_segmenta+1 : k*vel_segmenta + vel_segmenta,...
                         (l+1)*vel_segmenta+1 : (l+1)*vel_segmenta + vel_segmenta);
        CSGV_de = CSGvektor(susjed_de);
        susjed_de_labela = matrica(k*vel_segmenta+1, (l+1)*vel_segmenta+1);

        susjed_l = slika(k*vel_segmenta+1 : k*vel_segmenta + vel_segmenta,...
                         (l-1)*vel_segmenta+1 : (l-1)*vel_segmenta + vel_segmenta);
        CSGV_l = CSGvektor(susjed_l);
        susjed_l_labela = matrica(k*vel_segmenta+1, (l-1)*vel_segmenta+1);
    end;
end;
% -------------------------------------------------------------------------


% ---------------------- ODREDJIVANJE PRECIZNOG RUBA ----------------------
if (k == 0)
    % nalazim se u prvom redu
    % svaki segment u prvom redu ima donjeg susjeda
    if (l == 0)
        % nalazim se u prvom stupcu
        % promatram susjede DESNO i DOLJE
        i1 = 1;
        for i = k*vel_segmenta+16 : k*vel_segmenta+vel_segmenta
            j1 = 1;
            for j = l*vel_segmenta+16 : l*vel_segmenta+vel_segmenta
                min_udaljenost = 0;
                labela = slika(k*vel_segmenta+1,l*vel_segmenta+1);

                referentni_segment = slika((i-15): (i+16), (j-15): (j+16));
                CSGV_referetni = CSGvektor(referentni_segment);

                min_udaljenost = dist(CSGV_referetni', CSGV_de);
                labela = susjed_de_labela;
                temp = dist(CSGV_referetni', CSGV_d);
                if(temp < min_udaljenost)
                    labela = susjed_d_labela;
                    min_udaljenost = temp;
                end;

                novi_segment(i1,j1) = labela;
                j1 = j1+1;
            end;
            i1 = i1+1;
        end;
    elseif (l == broj_segmenta-1)
        % nalazim se u zadnjem stupcu
        % promatram susjede LIJEVO i DOLJE
        i1 = 1;
        for i = k*vel_segmenta+16 : k*vel_segmenta+vel_segmenta
            j1 = 1;
            for j = l*vel_segmenta+1 : l*vel_segmenta+vel_segmenta/2-1
                min_udaljenost = 0;
                labela = slika(k*vel_segmenta+1,l*vel_segmenta+1);

                referentni_segment = slika((i-15): (i+16), (j-15): (j+16));
                CSGV_referetni = CSGvektor(referentni_segment);

                min_udaljenost = dist(CSGV_referetni', CSGV_l);
                labela = susjed_l_labela;
                temp = dist(CSGV_referetni', CSGV_d);
                if(temp < min_udaljenost)
                    labela = susjed_d_labela;
                    min_udaljenost = temp;
                end;

                novi_segment(i1,j1) = labela;
                j1 = j1+1;
            end;
            i1 = i1+1;
        end;
    else
        % nalazim se na sredini prvog retka
        % promatram susjede LIJEVO, DESNO i DOLJE
        i1 = 1;
        for i = k*vel_segmenta+16 : k*vel_segmenta+vel_segmenta
            j1 = 1;
            for j = l*vel_segmenta+1 : l*vel_segmenta+vel_segmenta
                min_udaljenost = 0;
                labela = slika(k*vel_segmenta+1,l*vel_segmenta+1);

                referentni_segment = slika((i-15): (i+16), (j-15): (j+16));
                CSGV_referetni = CSGvektor(referentni_segment);

                min_udaljenost = dist(CSGV_referetni', CSGV_l);
                labela = susjed_l_labela;
                temp = dist(CSGV_referetni', CSGV_de);
                if(temp < min_udaljenost)
                    labela = susjed_de_labela;
                    min_udaljenost = temp;
                end;
                temp = dist(CSGV_referetni', CSGV_d);
                if(temp < min_udaljenost)
                    labela = susjed_d_labela;
                end;

                novi_segment(i1,j1) = labela;
                j1 = j1+1;
            end;
            i1 = i1+1;
        end;
    end;
elseif (k == broj_segmenta-1)
    % nalazim se u zadnjem retku
    if (l == 0)
        % nalazim se u prvom stupcu
        % promatram susjede DESNO i GORE
        i1 = 1;
        for i = k*vel_segmenta+1 : k*vel_segmenta+vel_segmenta/2-1
            j1 = 1;
            for j = l*vel_segmenta+16 : l*vel_segmenta+vel_segmenta
                min_udaljenost = 0;
                labela = slika(k*vel_segmenta+1,l*vel_segmenta+1);

                referentni_segment = slika((i-15): (i+16), (j-15): (j+16));
                CSGV_referetni = CSGvektor(referentni_segment);

                min_udaljenost = dist(CSGV_referetni', CSGV_de);
                labela = susjed_de_labela;
                temp = dist(CSGV_referetni', CSGV_g);
                if(temp < min_udaljenost)
                    labela = susjed_g_labela;
                end;

                novi_segment(i1,j1) = labela;
                j1 = j1+1;
            end;
            i1 = i1+1;
        end;
    elseif (l == broj_segmenta-1)
        % nalazim se u zadnjem stupcu
        % promatram susjede LIJEVO i GORE
        i1 = 1;
        for i = k*vel_segmenta+1 : k*vel_segmenta+vel_segmenta/2-1
            j1 = 1;
            for j = l*vel_segmenta+1 : l*vel_segmenta+vel_segmenta/2-1
                min_udaljenost = 0;
                labela = slika(k*vel_segmenta+1,l*vel_segmenta+1);

                referentni_segment = slika((i-15): (i+16), (j-15): (j+16));
                CSGV_referetni = CSGvektor(referentni_segment);

                min_udaljenost = dist(CSGV_referetni', CSGV_l);
                labela = susjed_l_labela;
                temp = dist(CSGV_referetni', CSGV_g);
                if(temp < min_udaljenost)
                    labela = susjed_g_labela;
                end;

                novi_segment(i1,j1) = labela;
                j1 = j1+1;
            end;
            i1 = i1+1;
        end;
    else
        % nalazim se na sredini zadnjeg retka
        % promatram susjede LIJEVO, DESNO i GORE
        i1 = 1;
        for i = k*vel_segmenta+1 : k*vel_segmenta+vel_segmenta/2-1
            j1 = 1;
            for j = l*vel_segmenta+1 : l*vel_segmenta+vel_segmenta
                min_udaljenost = 0;
                labela = slika(k*vel_segmenta+1,l*vel_segmenta+1);

                referentni_segment = slika((i-15): (i+16), (j-15): (j+16));
                CSGV_referetni = CSGvektor(referentni_segment);

                min_udaljenost = dist(CSGV_referetni', CSGV_l);
                labela = susjed_l_labela;
                temp = dist(CSGV_referetni', CSGV_de);
                if(temp < min_udaljenost)
                    labela = susjed_de_labela;
                    min_udaljenost = temp;
                end;
                temp = dist(CSGV_referetni', CSGV_g);
                if(temp < min_udaljenost)
                    labela = susjed_g_labela;
                end;

                novi_segment(i1,j1) = labela;
                j1 = j1+1;
            end;
            i1 = i1+1;
        end;
    end;
else
    % nalazim se u nekom retku u sredini
    if (l == 0)
        % nalazim se u prvom stupcu
        % promatram susjede DESNO, GORE i DOLJE
        i1 = 1;
        for i = k*vel_segmenta+1 : k*vel_segmenta+vel_segmenta
            j1 = 1;
            for j = l*vel_segmenta+16 : l*vel_segmenta+vel_segmenta
                min_udaljenost = 0;
                labela = slika(k*vel_segmenta+1,l*vel_segmenta+1);

                referentni_segment = slika((i-15): (i+16), (j-15): (j+16));
                CSGV_referetni = CSGvektor(referentni_segment);

                min_udaljenost = dist(CSGV_referetni', CSGV_de);
                labela = susjed_de_labela;
                temp = dist(CSGV_referetni', CSGV_g);
                if(temp < min_udaljenost)
                    labela = susjed_g_labela;
                    min_udaljenost = temp;
                end;
                temp2 = dist(CSGV_referetni', CSGV_d);
                if(temp < min_udaljenost)
                    labela = susjed_d_labela;
                end;

                novi_segment(i1,j1) = labela;
                j1 = j1+1;
            end;
            i1 = i1+1;
        end;
    elseif (l == broj_segmenta-1)
        % nalazim se u zadnjem stupcu
        % promatram susjede LIJEVO, GORE i DOLJE
        i1 = 1;
        for i = k*vel_segmenta+1 : k*vel_segmenta+vel_segmenta
            j1 = 1;
            for j = l*vel_segmenta+1 : l*vel_segmenta+vel_segmenta/2-1
                min_udaljenost = 0;
                labela = slika(k*vel_segmenta+1,l*vel_segmenta+1);

                referentni_segment = slika((i-15): (i+16), (j-15): (j+16));
                CSGV_referetni = CSGvektor(referentni_segment);

                min_udaljenost = dist(CSGV_referetni', CSGV_l);
                labela = susjed_l_labela;
                temp = dist(CSGV_referetni', CSGV_g);
                if(temp < min_udaljenost)
                    labela = susjed_g_labela;
                    min_udaljenost = temp;
                end;
                temp2 = dist(CSGV_referetni', CSGV_d);
                if(temp < min_udaljenost)
                    labela = susjed_d_labela;
                end;

                novi_segment(i1,j1) = labela;
                j1 = j1+1;
            end;
            i1 = i1+1;
        end;
    else
        % nalazim se na sredini prvog retka
        % promatram susjede LIJEVO, DESNO, GORE i DOLJE
        % centriranje piksela unutar segmenta
        i1 = 1;
        for i = k*vel_segmenta+1 : k*vel_segmenta+vel_segmenta
            j1 = 1;
            for j = l*vel_segmenta+1 : l*vel_segmenta+vel_segmenta
                min_udaljenost = 0;
                labela = slika(k*vel_segmenta+1,l*vel_segmenta+1);

                referentni_segment = slika((i-15): (i+16), (j-15): (j+16));
                CSGV_referetni = CSGvektor(referentni_segment);

                min_udaljenost = dist(CSGV_referetni', CSGV_l);
                labela = susjed_l_labela;
                temp = dist(CSGV_referetni', CSGV_de);
                if(temp < min_udaljenost)
                    labela = susjed_de_labela;
                    min_udaljenost = temp;
                end;
                temp2 = dist(CSGV_referetni', CSGV_g);
                if(temp < min_udaljenost)
                    labela = susjed_g_labela;
                    min_udaljenost = temp2;
                end;
                temp3 = dist(CSGV_referetni', CSGV_d);
                if(temp < min_udaljenost)
                    labela = susjed_d_labela;
                    min_udaljenost = temp3;
                end;

                novi_segment(i1,j1) = labela;
                j1 = j1+1;
            end;
            i1 = i1+1;
        end;
    end;
end;
% -------------------------------------------------------------------------

rezultat = novi_segment;