Lembre-se de que a transformação da bacia hidrográfica trata sua entrada como um mapa topográfico e simula a inundação dessa topografia com água. As "bacias hidrográficas" ou "regiões da bacia hidrográfica" são então as partes do mapa que "retêm água" sem derramar em outras regiões.
A magnitude do gradiente é uma função de segmentação ruim como está; o ruído e os contornos abertos levam a uma super-segmentação extrema da imagem. Podemos tentar uma série de operações morfológicas com a intenção de criar marcadores aproximados de primeiro plano e de fundo e usá-los para remover as partes espúrias do gradiente.
%# Normalize.
g = gradmag - min(gradmag(:));
g = g / max(g(:));
th = graythresh(g); %# Otsu's method.
a = imhmax(g,th/2); %# Conservatively remove local maxima.
th = graythresh(a);
b = a > th/4; %# Conservative global threshold.
c = imclose(b,ones(6)); %# Try to close contours.
d = imfill(c,'holes'); %# Not a bad segmentation by itself.
%# Use the rough segmentation to define markers.
g2 = imimposemin(g, ~ imdilate( bwperim(a), ones(3) );
L = watershed(g2);
Isso funciona bem. Você recebe dois grupos de pessoas e suas sombras como regiões, com um pouco de barulho.
Você pode elaborar seus objetivos? Ou seja, você segmentará muitas imagens diferentes ou apenas imagens altamente semelhantes a este exemplo? Você precisa ignorar as sombras e separar as duas pessoas que se sobrepõem?
Tentarei atualizar a resposta se você responder a essas perguntas.
Sobreposição de segmentação
Você perguntou como sobrepor uma segmentação. Uma maneira é usar as linhas da bacia hidrográfica para especificar pixels no original e defini-los para uma cor brilhante.
boundaries = L == 0;
I(boundaries) = 255;