Dilater/éroder modifier le noyau option
Je veux lisse le contour de binarized images et de penser que l'érosion est la meilleure façon de le faire. Je sais que la façon normale de travail est d'utiliser cvDilate(src, dst, 0, iter); où 0 est une matrice de 3x3.
Problème est la matrice de 3x3 fait une profonde s'éroder dans mes images. Comment puis-je faire un éroder avec une matrice 2x2 ou quoi que ce soit plus petite que la valeur par défaut matrice de 3x3.
OriginalL'auteur Jorge Vega Sánchez | 2011-03-01
Vous devez vous connecter pour publier un commentaire.
Ici, vous avez pour votre référence les résultats de l'utilisation de différents noyaux:
Saludos!
OriginalL'auteur Dr. belisarius
Si votre but est d'avoir un binarized image avec des bords lisses alors, si vous avez l'original, il est préférable d'utiliser quelque chose comme un flou gaussien avec
cvSmooth()
sur que avant d'effectuer la binarisation.Cela dit, vous n'êtes pas limité à 3x3 noyaux.
cvDilate()
prend unIplConvKernel
produit parCreateStructuringElementEx
et vous pouvez faire un élément structurant avec tout (rectangulaire) forme avec cette fonction.Cependant, un élément de structuration fonctionne par rapport à un point d'ancrage qui doivent être entières coordonnées, donc si vous utilisez une matrice 2x2 de la matrice ne peut pas être centrée sur le pixel. ainsi, dans la plupart des cas, il est préférable d'utiliser les éléments de structure avec un nombre impair de lignes et de colonnes.
Ce que vous pourriez faire est de créer un 3x3 élément de structuration où seul le centre de la valeur et les valeurs directement au-dessus, au-dessous, à gauche et à droite de 1 comme tel:
plutôt que la valeur par défaut:
Le premier noyau fera pour un peu plus lisse bords.
OriginalL'auteur jilles de wit
Voici une approche rapide et sale pour vous dire si la dilatation/érosion va travailler pour vous:
OriginalL'auteur mpenkov
Avec l'API C, vous pouvez créer une
IplConvKernel
objet de tout type et de la taille avec la fonctionCreateStructuringElementEx()
. Si vous utilisez l'API C++ (fonctiondilate()
), l'élément structurant utilisé pour la dilatation est une matrice (Mat
) que vous voulez.Ces paramètres définissent les principaux pixel du noyau, utilisée pour savoir comment l'appliquer. Il est généralement au centre d'un cercle ou d'un carré. Il peut être uncentered pour les plus exotiques du noyau formes.
OriginalL'auteur Stéphane Péchard
Un noyau avec toutes les 1 est un passe-bas filtre de convolution. Une dilatation filtre remplace chaque pixel dans le 3X3 de la région avec le pixel le plus sombre dans ce 3x3 région. Une érosion filtre remplace chaque pixel dans le 3X3 de la région avec le pixel le plus lumineux dans ce 3x3 région. C'est si votre arrière-plan est la lumière et de votre objet au premier plan est sombre. Si vous retournez à votre fond et de premier plan, alors vous aussi retourner la dilatation et l'érosion du filtre.
Aussi, si vous souhaitez effectuer une "ouverte" de l'opération, vous effectuez une érosion suivie d'une dilatation. À l'inverse, "fermer" l'opération est une dilatation suivie d'une érosion. Ouvrir tend à supprimer isolé des amas de pixels et à proximité tend à remplir les trous.
OriginalL'auteur Adam Freeman
Errosion et la dilatation de la matrice doit être impair afin
-- 2*2 de la matrice ne peut pas être utilisé
de convolution de la matrice doit être de l'ordre 1*1 3*3 5*5 7*7 ... mais BIZARRE
essayez d'appliquer proche - Éroder puis dilater l'image de l'opération - l'utilisation de la cvMorpologyEx() la fonction
OriginalL'auteur Shanil Jevin