Trouver des angles d'un polygone représenté par une région de masque
BW = poly2mask(x, y, m, n)
calcule un
binaire de la région d'intérêt (ROI) de masque,
BW, à partir d'un ROI polygone, représenté
par les vecteurs x et y de la. La taille de BW
est m-par-n.
poly2mask
ensembles de pixels dans le BW
qui sont à l'intérieur du polygone (X,Y), 1
et des ensembles de pixels à l'extérieur du polygone à
0.
Problème:
Compte tenu de ces un masque binaire BW
d'un quadrilatère convexe, ce qui serait le moyen le plus efficace pour déterminer les quatre coins?
E. g.,
Meilleure Solution à ce jour:
Utilisation edge
à trouver le cadre des lignes, la transformation de Hough pour trouver les 4 lignes dans le bord de l'image, puis de trouver les points d'intersection de ces 4 lignes ou utiliser un coin détecteur sur le bord de l'image. Semble compliqué, et je peux pas m'empêcher de penser il y a une solution plus simple.
Btw, convhull
ne permet pas toujours de revenir à 4 points (peut-être quelqu'un peut suggérer qhull
options pour empêcher qu') : elle retourne quelques points le long des bords.
EDIT:
Amro répondre semble très élégant et efficace. Mais il pourrait y avoir plusieurs "coins" à chaque coin depuis les sommets ne sont pas uniques. Je pourrais cluster sur la base de la θ et de la moyenne des "coins" autour d'un véritable coin, mais le principal problème est l'utilisation de order(1:10)
.
Est 10
assez pour tenir compte de tous les coins ou cette exclure un "coin" dans un vrai coin?
OriginalL'auteur Jacob | 2009-11-10
Vous devez vous connecter pour publier un commentaire.
C'est un peu similaire à ce que @AndyL suggéré. Cependant, je suis en utilisant la limite de signature en coordonnées polaires au lieu de la tangente.
Remarque que je commence par l'extraction des bords, l'obtention de la frontière, puis de les convertir à la signature. Enfin, nous trouvons les points sur la frontière qui sont les plus éloignés du centre de gravité, ces points constituent les coins trouvé. (Alternativement, nous pouvons également détecter les pics dans la signature pour les coins).
Ce qui suit est une mise en œuvre complète:
EDIT:
En réponse à Jacob commentaire, je dois préciser que j'ai d'abord essayé de trouver les pics de la signature à l'aide de la première/deuxième dérivés, mais a fini par prendre le plus de N points. 10 était juste une ad-hoc de la valeur, et qu'il serait difficile de généraliser (j'ai essayé de prendre 4 de même que le nombre de coins, mais il ne couvre pas tous d'entre eux). Je pense que l'idée de clustering pour supprimer les doublons vaut la peine de regarder dans.
Aussi loin que je le vois, le problème avec la 1ère approche est que si vous intrigue
rho
sans prendreθ
en compte, vous obtiendrez une forme différente (pas les mêmes pics), depuis le vitesse qui nous trace la limite est différente et dépend de la courbure. Si nous pouvions comprendre comment normaliser cet effet, nous pouvons obtenir des résultats plus précis à l'aide de produits dérivés.+1 - pour la limite de signature. Mais, il y a quelques préoccupations que j'ai détaillé dans le post édité.
veuillez voir mon montage ci-dessus.
U pourrait, si certains ligne de rapprochement technique pour résoudre le coin de la duplication question. OpenCV est-ce que dans findContours fonction à l'aide de la CV_CHAIN_APPROX_SIMPLE drapeau. Comme pour matlab, je n'ai pas trouver un moyen intégré pour le faire, mais a trouvé une mise en œuvre de Douglas-Peucker simplification de l'algorithme sur l'échange de fichier mathworks.com/matlabcentral/fileexchange/...
OpenCV approxPolyDP met également en œuvre de Douglas-Peucker algorithme docs.opencv.org/modules/imgproc/doc/...
OriginalL'auteur Amro
Si vous avez la Boîte À Outils De Traitement D'Image, il y a une fonction appelée
cornermetric
qui peut mettre en œuvre un Harris coin détecteur ou Shi et Tomasi minimum de la valeur propre méthode. Cette fonction est présente depuis la version 6.2 de la boîte à outils de Traitement d'Image (MATLAB version R2008b).À l'aide de cette fonction, je suis venu avec une approche légèrement différente de l'autre des réponses. La solution ci-dessous est basé sur l'idée qu'une zone circulaire centré à chaque "vrai" point d'angle de chevauchement entre le polygone par un montant inférieur à une zone circulaire centré sur une erreur de point d'angle qui est en fait sur le bord. Cette solution peut également gérer les cas où plusieurs points sont détectés dans le même coin...
La première étape consiste à charger les données:
Ensuite, calculer l'angle métrique à l'aide de
cornermetric
. Notez que je ne suis masquant le coin métrique de l'original du polygone, de sorte que nous sommes à la recherche pour les points d'angle qui sont à l'intérieur de le polygone (c'est à dire en essayant de trouver le coin pixels du polygone).imregionalmax
est ensuite utilisé pour trouver les maxima locaux. Comme vous pouvez avoir des grappes de plus de 1 pixel avec le même angle métrique, je puis ajouter du bruit à l'maxima et recalculer alors que je ne reçois 1 pixel dans chaque maximale de la région. Chaque maximale région est ensuite étiquetés à l'aide d'bwlabel
:Les régions marquées sont ensuite dilaté (à l'aide de
imdilate
) avec un disque en forme d'élément de structuration (créé à l'aide destrel'
):Maintenant que l'étiquette coin régions ont été dilaté, elles vont s'imbriquent l'un dans l'original polygone. Les régions sur une arête du polygone de chevauchement de 50%, tandis que les régions qui sont sur un coin de 25% de chevauchement. La fonction
regionprops
peut être utilisé pour trouver les zones de chevauchement de chaque région étiquetés, et les 4 régions qui ont le moins de chevauchement peuvent donc être considérés comme les véritables coins:Et nous pouvons maintenant obtenir les coordonnées des pixels de les angles à l'aide de
trouver
etismember
:Et voici un test avec un diamant en forme de la région:
+1 - Bon à savoir!
Mais il ne semble pas être dans R2008a ..
Je suis en utilisant R2009a, donc je suppose que c'est un ajout relativement récent.
OriginalL'auteur gnovice
J'aime résoudre ce problème en travaillant avec une limite, car il réduit cette 2D à partir d'un problème à un problème 1D.
Utilisation
bwtraceboundary()
de la trousse à outils de traitement d'image pour extraire une liste de points sur la frontière. Puis de convertir la limite dans une série de vecteurs tangents (il y a un certain nombre de façons de le faire, on pourrait subrtact l'i
ème point le long de la frontière de lai+delta
ème point.) Une fois que vous avez une liste de vecteurs, de prendre le produit scalaire des vecteurs adjacents. Les quatre points avec le plus petit point des produits sont vos coins!Si vous voulez que votre algorithme de travailler sur les polygones avec un abritrary nombre de sommets, puis il suffit de chercher point des produits qui sont d'un certain nombre d'écarts-types en dessous de la médiane produit scalaire.
OriginalL'auteur AndyL
J'ai décidé d'utiliser un Harris coin détecteur de (voici un description plus formelle) pour obtenir les coins. Cela peut être mis en œuvre comme suit:
Ici, le problème avec plusieurs angles grâce à Gaussien de fenêtrage fonction qui permet de lisser le changement d'intensité. Ci-dessous, une version agrandie d'un coin avec les
hot
palette de couleurs.#
après%
dans MATLAB commentaires, afin de les corriger AFIN d'obtenir une couleurMerci! Toutes les corrections avec l'aide de
'
?Nope. Écoutez, j'ai été tester votre approche, et il semble qu'il n'est pas parfait (ce qui est toujours le cas dans la Vision par Ordinateur!). Essayez le masque ci-dessous avec votre code ci-dessus:
x = [16 282 276 30 16]; y = [14 29 200 225 14]; BW = poly2mask(x,y, 246,300);
, vous aurez une double coins (quand même essayé de réglage des autres paramètres), et devra augmenternCorners
trop..Vous êtes complètement à droite - regarde comme le clustering est nécessaire pour certains polygones.
Je ne veux pas pousser mon idée trop fort, mais je pense que la signature de la méthode pourrait être perfectionné pour la plupart quadrilatère si nous localiser exactement 4 theta pics, qui après tout sont clairement visibles dans l'intrigue. La cueillette de la plus haute N-points peuvent ne pas avoir été la meilleure façon, mais peut-être quelqu'un peut améliorer la partie..
OriginalL'auteur Jacob
Voici un exemple d'utilisation de Ruby et HornetsEye. Fondamentalement, le programme crée un histogramme de la quantised gradient de Sobel orientation pour trouver dominante orientations. Si les quatre orientations dominantes sont trouvés, les lignes sont montés et les intersections entre les lignes sont supposés être les coins de la projection de rectangle.
OriginalL'auteur wedesoft