2016-04-22 1 views

Répondre

1

Je suppose que les images sont déjà annotées. Dans ce cas, nous trouvons simplement les points marqués et les coordonnées d'extraction (si vous avez besoin de trouver les points rouges dynamiquement dans le code, cela ne marchera pas du tout)

La première chose à faire est de trouver une bonne fonctionnalité utiliser pour la segmentation. Voir ma réponse SO ici what-should-i-use-hsv-hsb-or-rgb-and-why pour le code et les détails. Cela produit l'image suivante:

color spaces

nous pouvons voir que la saturation (et quelques autres) sont de bons espaces de couleurs candidats. Alors maintenant vous devez transférer votre image dans le nouvel espace colorimétrique et effectuer un seuillage pour trouver vos points.

Les points sont obtenus en utilisant matlab's region properties en recherchant spécifiquement le centroïde. À ce stade, vous avez terminé.

Voici le code et résultats

im = imread('http://i.stack.imgur.com/eajRb.jpg'); 
HUE = 1; 
SATURATION = 2; 
BRIGHTNESS = 3; 

%see https://stackoverflow.com/questions/30022377/what-should-i-use-hsv-hsb-or-rgb-and-why/30036455#30036455 
ViewColoredSpaces(im) 

%convert image to hsv 
him = rgb2hsv(im); 

%threshold, all rows, all columns, 
my_threshold = 0.8;  %determined empirically 
thresh_sat = him(:,:,SATURATION) > my_threshold; 

%remove small blobs using a 3 pixel disk 
se = strel('disk',3'); 
cleaned_sat = imopen(thresh_sat, se);% imopen = imdilate(imerode(im,se),se) 

%find the centroids of the remaining blobs 
s = regionprops(cleaned_sat, 'centroid'); 
centroids = cat(1, s.Centroid); 

%plot the results 
figure(); 
subplot(2,2,1) ;imshow(thresh_sat) ;title('Thresholded saturation channel') 
subplot(2,2,2) ;imshow(cleaned_sat);title('After morpphological opening') 
subplot(2,2,3:4);imshow(im)   ;title('Annotated img') 

hold on 
for (curr_centroid = 1:1:size(centroids,1)) 
    %prints coordinate 
    x = round(centroids(curr_centroid,1)); 
    y = round(centroids(curr_centroid,2)); 
    text(x,y,sprintf('[%d,%d]',x,y),'Color','y'); 
end 
%plots centroids 
scatter(centroids(:,1),centroids(:,2),[],'y') 
hold off 

%prints out centroids 
centroids 

centroïdes =

7,4593 143,0000
383,0000 87,9911
435,3106 355,9255
494,6491 91,1491


color spaces color spaces color spaces

+0

Excellent codage (y) – 16per9

+0

Les points rouges ne seront pas dans l'image.Je viens de les mettre pour référence. –

-2

Un exemple de code rendrait beaucoup plus facile d'adapter une solution spécifique à votre problème.

Une solution à ce problème général consiste à utiliser impoint.

Quelque chose comme

h = figure(); 
ax = gca; 

% ... drawing your image 

points = {}; 
points = [points; impoint(ax,initialX,initialY)]; 

% ... generate more points 

indx = 1 % or whatever point you care about 
[currentX,currentY] = getPosition(points{indx}); 

devrait faire l'affaire. Editer: Le premier argument de impoint est un objet axe, pas un objet figure.

+0

Ne fonctionne pas pour moi –