2017-10-18 4 views
0

Basé sur la question en Subset a region from boundary coordinates - Matlab J'ai essayé d'utiliser imrect à la place (bien qu'il limite aux rectangles sans angle).Sous-ensemble d'une région à partir des coordonnées de limites en utilisant imrect - Matlab

Néanmoins, j'ai un problème avec la sortie car je n'obtiens pas de coordonnées x, y. Pourquoi?

Script:

clc; 
clear; 

I = imread('https://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/Astroid_created_with_Elipses_with_a_plus_b_const.svg/330px-Astroid_created_with_Elipses_with_a_plus_b_const.svg.png'); 
I = rgb2gray(I); 
I = imcomplement(I); 
level = graythresh(I); 
BW = im2bw(I,level); 

BW_filled = imfill(BW,'holes'); 

boundaries = bwboundaries(BW_filled); 
figure,imshow(I) ; 

hold on; 

b = boundaries{1}; 
plot(b(:,2),b(:,1),'b','LineWidth',2); 

xq = b(:,2); 
yq = b(:,1); 
h = imrect; 

pos = getPosition(h); 

X1 = round(pos(1)); 
Y1 = round(pos(2)); 
X2 = round(X1 + pos(3)); 
Y2 = round(Y1 + pos(4)); 

xv=[X1 X2]; 
yv=[Y1 Y2]; 

scatter(X1,Y1 ,'r') 
scatter(X2,Y2 ,'r') 

[in,on] = inpolygon(xq,yq,xv, yv) %xq and yq are inside or on the edge of the polygon area defined by xv and yv 
+0

Voulez-vous dire que pos est vide? Quoi qu'il en soit, vous pourriez mettre un 'pause()' devant 'pos = getPosition (h); ' laisser l'utilisateur ajuster le rectangle. Sinon, vous lirez sa position dès qu'elle sera placée. – Zep

+0

Le [in, on] affiche seulement 0 et 1 mais pas les coordonnées. – jane

+0

La fonction 'inpolygon' ne retounne pas les coordonnées. Il retourne en indiquant si les points de requête spécifiés par xq et yq sont à l'intérieur ou sur le bord de la zone de polygone définie par xv et yv._ Il retourne également sur indiquant si les points de requête sont sur le bord de la zone de polygone – Zep

Répondre

2

inpoligon renvoie une liste de valeurs booléennes pour indiquer si les points XQ et YQ sont à l'intérieur du polygone. Pour obtenir les coordonnées des points correspondants, vous pouvez utiliser l'indexation logique; ajoutez simplement ceci à la fin de votre code:

x_in = xq(in | on); 
y_in = yq(in | on); 
scatter(x_in,y_in ,'g.')