Comment lisser les courbes (contours) dans OpenCV?
Je suis en train de travailler sur un noir&blanc de l'image tout comme la première à partir du lien :
http://imageshack.us/g/33/firstwm.png/
Il a beaucoup de "bruit" donc, j'ai appliqué un filtre Médian sur elle pour la lisser, obtenant ainsi la deuxième photo.
cvSmooth(TempImage, TempImage, CV_MEDIAN, 5, 0);
Après cela je reçois les contours et les dessiner sur une autre image, comme par exemple la 3ème photo à partir du lien.
Mon problème est que les contours sont encore un peu pixélisée(edgy). Est-il un moyen pour lisser le B&W l'image encore plus afin d'obtenir de meilleures contours? Ou peut-être faire quelque chose avec les contours.
J'ai aussi essayé de se Dilater et de s'Éroder avec les différents noyaux, mais le problème reste le même.
Merci à vous pour tout ce qui aide.
EDIT:
Aussi essayé:
cvSmooth(TempImage, TempImage, CV_GAUSSIAN, 9, 9, 3);
cvThreshold(TempImage, TempImage, 127, 255, CV_THRESH_BINARY);
Mêmes résultats que le filtre médian, ok, mais laisse encore certains pixélisé contours.
source d'informationauteur Adrian | 2011-09-14
Vous devez vous connecter pour publier un commentaire.
Si c'est le lissage que vous êtes après, elle peut être obtenue en faisant un flou Gaussien, suivi par un seuillage. I. e. à l'aide de
cvSmooth
avecCV_GAUSSIAN
comme le paramater. Suivi par uncvThreshold
.Si vous voulez une transition plus douce que le seuillage (comme cette), vous pouvez obtenir avec le réglage des niveaux (remappage de la gamme de couleurs de sorte que vous préserver une partie de la périphérie de transition).
mise à jour Pour expliquer comment obtenir le bon (anti-aliasing) pointe sur le seuillage, considérez ce que le seuillage. Il fondamentalement le même processus pour chaque pixel de l'image, un à la fois. Si la valeur du pixel est inférieure au seuil, il est en noir (0), sinon il est mis à le blanc (255).
Le seuil de l'opérateur est donc très simple, cependant, toute autre fonction de représentation peut être utilisé. En gros, c'est une fonction
f(i)
oùi
est l'intensité de la valeur de pixel (variait de 0 à 255) etf(i)
est la valeur mappée. Pour le seuil de cette fonction est simpleCe que vous avez est un lissé de l'image (par cvSmooth à l'aide d'un noyau Gaussien, ce qui vous donne le "plus doux" lissage, si cela fait sens). Vous avez ainsi une transition en douceur de valeurs sur les bords, allant de 0 à 255. Ce que vous voulez faire est de faire de cette transition beaucoup plus petite, de sorte que vous obtenez un bon bord. Si vous aller balistiques, vous allez directement à partir de 0 à 255, qui est le même que le seuillage binaire que vous avez déjà fait.
Maintenant, considérons une fonction pour les cartes, peut-être une série de 4 valeurs d'intensité (127 +- 4) pour toute la gamme de 0 à 255. I. e.
Et vous obtenez le résultat souhaité. Je vais prendre un coup d'oeil et voir si elle est mise en œuvre dans openCV déjà. Ne devrait pas être trop dur à coder vous-même.
mise à jour 2
Le contour de la version serait quelque chose comme ceci: