La raison pour laquelle est parce que segments
est réellement une carte qui vous indique quelles régions de votre image sont des superpixels. Si un pixel dans cette carte appartient à ID k
, cela signifie que ce pixel appartient à superpixel k
. En outre, la carte est de type uint32
et donc quand vous essayez de faire imshow(segments);
il ne montre vraiment pas quelque chose de significatif. Pour cette image qui est vue sur le site, il y a 1023 segments en fonction de vos paramètres sélectionnés. En tant que tel, la carte s'étend de 0 à 1023. Si vous voulez voir à quoi ressemblent les segments, vous pouvez faire imshow(segments,[]);
. Ce que cela va faire est que la région avec l'ID de 1023 sera mappée en blanc, tandis que les pixels qui n'appartiennent à aucune région de superpixel (ID de 0), sont mappés en noir. Vous réellement obtenir quelque chose comme ceci:
Pas très significatif! Maintenant, pour obtenir ce que vous voyez sur la page Web, vous allez devoir faire un peu plus de travail. D'après ce que je sais, VLFeat
n'a pas de fonctionnalité intégrée qui vous montre les résultats comme ce qui est vu sur leur page Web. En tant que tel, vous devrez écrire du code pour le faire vous-même. Vous pouvez le faire en suivant ces étapes:
- Créer une carte qui est
true
qui est la même taille que l'image
- Pour chaque région superpixel
k
:
- Créer une autre carte qui marque
true
pour tout pixel appartenant à la région k
, et false
sinon.
- Trouver le périmètre de cette région.
- Définissez ces pixels de périmètre à
false
sur la carte créée à l'étape 1
- Répétez l'étape # 2 jusqu'à ce que nous ayons fini en passant par toutes les régions.
- Utilisez cette carte pour masquer tous les pixels de l'image d'origine pour obtenir ce que vous voyez sur le site.
Parcourons ce code maintenant.Voici la configuration que vous avez créé:
vl_setup;
im = imread('slic_image.jpg');
regionSize = 10 ;
regularizer = 10 ;
segments = vl_slic(single(im), regionSize, regularizer);
Maintenant, nous allons passer par cet algorithme que je viens de mentionner:
perim = true(size(im,1), size(im,2));
for k = 1 : max(segments(:))
regionK = segments == k;
perimK = bwperim(regionK, 8);
perim(perimK) = false;
end
perim = uint8(cat(3,perim,perim,perim));
finalImage = im .* perim;
imshow(finalImage);
Nous obtenons ainsi:
Gardez à l'esprit que ce n'est pas exactement le même que ce que vous obtenez sur le site. Je suis simplement allé sur le site Web et enregistré cette image, puis procédé avec le code que je viens de vous montrer. C'est probablement parce que l'image slic_image.jpg
n'est pas l'original exact qui a été donné dans leur exemple. Il semble y avoir des superpixels dans les zones où il y a des artefacts de mauvaise quantification. En outre, j'utilise une version relativement ancienne de VLFeat
- Version 0.9.16. Il y a peut-être eu des améliorations à l'algorithme depuis lors, donc je n'utilise peut-être pas la version la plus à jour. En tout cas, c'est quelque chose pour vous que vous pouvez commencer.
Espérons que cela aide!
J'ai essayé les étapes que vous nous avez expliqué, en utilisant l'image du site et VLFeat - 0.9.18 et j'obtenir exactement le même résultat que vous. Merci beaucoup pour votre aide détaillée .. –
En guise de suivi, je voulais ajouter ce point. Le résultat de VL_SLIC dépend fortement de l'image d'entrée. J'ai utilisé la même image du site VL_SLIC et l'ai convertie en 'double' im = im2double (imread ('slic_image.jpg')), puis j'ai appliqué les étapes mentionnées ci-dessus. Cela donne d'excellents résultats. –
@DarkKnight: Bon à savoir. Merci! Aussi vous êtes les bienvenus. Heureux que je puisse aider – rayryeng