2016-06-07 1 views
1

Après 2 ou 3 jours de recherche, je n'ai toujours pas trouvé de solution à mon problème.MATLAB- souris segmentation dans les images en niveaux de gris, qui est invariante aux ombres

Je veux créer une segmentation de la souris sans l'ombre. Le problème est que si je réussis à enlever l'ombre, j'enlève aussi la queue et les pieds ce qui est un problème. L'ombre vient du mur de l'arène dans laquelle se trouve la souris. Je veux supprimer l'ombre d'une image en niveaux de gris, mais je n'ai aucune idée de comment le faire. J'ai d'abord enlevé l'arrière-plan de l'image et j'obtiens l'image suivante.

enter image description here

edit1: Merci pour la réponse, il fonctionne bien quand l'ombre ne touche pas la souris. Voilà ce que je reçois autrement:

segmented mouse

de cette image originale:

original image

J'extrais chaque image à partir d'un fichier TIF et appliquez votre code pour chaque image. Voici le code que j'utilise:

for k=1:1000 

    %reads image 
    I = imread('souris3.tif',k); 

    %first stage: perform thesholding and fill holes 

    seg = I >20000; 
    seg = imfill(seg,'holes'); 

    %fixes the missing tail problem 
    %extract edges, and add them to the segmentation. 
    edges = edge(I); 
    seg = seg | edges; 

    %fill holes (again) 
    seg = imfill(seg,'holes'); 

    %find all the connected components 
    CC = bwconncomp(seg,8); 

    %keeps only the biggest CC 
    numPixels = cellfun(@numel,CC.PixelIdxList); 
    [biggest,idx] = max(numPixels); 
    seg = zeros(size(edges)); 
    seg(CC.PixelIdxList{idx}) = 1; 

    imshow(seg); 

end 

Je choisis 20000 pour l'étape avec la commande impixelinfo parce que l'image est en uint16 et c'est la valeur moyenne de la souris.

C'est le lien si vous voulez avoir le fichier TIF:

souris3.tif

Merci d'aider.

Répondre

7

Je propose l'approche suivante:

  1. effectuer seuillage sur l'image et obtenir un masque qui contient la plupart des corps de la souris sans sa queue et les jambes.
  2. effectuer le remplissage des trous en utilisant la fonction imfill de MATLAB. A ce stade, la segmentation est presque parfaite, sauf pour une partie de la queue qui manque.
  3. utiliser la carte de bord afin de trouver les limites de la queue. Cela peut être fait en ajoutant la carte des arêtes à la segmentation et effectuer à nouveau le remplissage des trous. ne gardez que le plus gros composant connecté à ce stade.

Code:

%reads image 
I = rgb2gray(imread('mSWm4.png')); 

%defines thersholds (you may want to tweak these thresholds, or find 
%a way to calculate it automatically). 
FIRST_STAGE_THRESHOLD = 70; 
IM_BOUNDARY_RELEVANCE_THRESHOLD = 10; 

%perform thesholding and fill holes, the tail is still missing 
seg = I > FIRST_STAGE_THRESHOLD; 
seg = imfill(seg,'holes'); 

%second stage fix the missing tail problem: 
%extract edges from relevant areas (in which the matter is not too dark), and add them to the segmentation. 
%the boundries of the image which are close enough to edges are also considered as edges 
edges = edge(I); 
imageBoundries = ones(size(I)); 
imageBoundries(2:end-1,2:end-1) = 0; 
relevantDistFromEdges = bwdist(edges) > IM_BOUNDARY_RELEVANCE_THRESHOLD; 
imageBoundries(bwdist(edges) > IM_BOUNDARY_RELEVANCE_THRESHOLD) = 0; 
seg = seg | (edges | imageBoundries); 

%fill holes (again) and perform noise cleaning 
seg = imfill(seg,'holes'); 
seg = getBiggestCC(imopen(seg,strel('disk',1))); 

fonction getBiggestCC:

function [ res ] = getBiggestCC(mask) 
CC = bwconncomp(mask,8); 
numPixels = cellfun(@numel,CC.PixelIdxList); 
[~,idx] = max(numPixels); 
res = zeros(size(mask)); 
res(CC.PixelIdxList{idx}) = 1; 
end 

résultats

résultats de chaque étape:

enter image description here

résultats images 1 résultats:

enter image description here

image 2 résultats:

enter image description here

Une autre vue (segmentation est en rouge):

enter image description here

+0

Merci! Cela fonctionne bien quand l'ombre ne touche pas la souris. Je n'ai pas une seule image mais plusieurs et parfois l'ombre apparaît à nouveau. –

+0

Vous pouvez télécharger le fichier tif avec le lien –

+0

Merci! Si je trouve d'autres problèmes, je viendrai à vous bientôt –