2014-06-07 1 views
2

VL_FEAT J'utilise la fonction VL_SLIC dans Matlab et je suivais le tutoriel pour la fonction ici: http://www.vlfeat.org/overview/slic.htmlSortie VL_SLIC Matlab pour

Voici le code que je l'ai écrit jusqu'à présent:

im = imread('slic_image.jpg'); 
regionSize = 10 ; 
regularizer = 10; 
vl_setup; 
segments = vl_slic(single(im), regionSize, regularizer); 
imshow(segments); 

I Il suffit d'obtenir une image noire et je ne suis pas en mesure de voir l'image segmentée avec les superpixels. Y at-il un moyen que je peux voir le résultat comme indiqué sur la page Web?

Répondre

4

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:

enter image description here

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:

  1. Créer une carte qui est true qui est la même taille que l'image
  2. 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
  3. Répétez l'étape # 2 jusqu'à ce que nous ayons fini en passant par toutes les régions.
  4. 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:

enter image description here

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!

+0

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 .. –

+1

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. –

+0

@DarkKnight: Bon à savoir. Merci! Aussi vous êtes les bienvenus. Heureux que je puisse aider – rayryeng

1

J'ai trouvé ces lignes dans vl_demo_slic.m peut être utile.

segments = vl_slic(im, regionSize, regularizer, 'verbose') ; 

% overaly segmentation 
[sx,sy]=vl_grad(double(segments), 'type', 'forward') ; 
s = find(sx | sy) ; 
imp = im ; 
imp([s s+numel(im(:,:,1)) s+2*numel(im(:,:,1))]) = 0 ; 

Il génère des bords à partir du gradient de la carte de superpixel (segments).

+0

quelqu'un peut-il expliquer ce que 's = find (sx | sy)' faire? – Sounak

0

Alors que je ne veux rien enlever de ~ belle réponse ~ Rayryeng. Cela pourrait aussi aider. http://www.vlfeat.org/matlab/demo/vl_demo_slic.html

Disponible dans: boîte à outils/démo

+1

s'il vous plaît ajouter un contenu à partir du lien – Robert

+0

Bien sûr. Je vous remercie. Éditera bientôt. –