66 votes

Comment cartoonifier une image de manière programmatique ?

Mon application fonctionne avec des photos et des vidéos de personnes, que je veux caricaturer. J'ai donc besoin d'un algorithme pour le faire manuellement (nous utilisons c++/Qt pour notre produit, qui a des classes de manipulation d'images) ou peut-être un programme CLI qui le fera pour moi et que je peux appeler et utiliser depuis notre propre application.

4 votes

Pouvez-vous donner des exemples d'images caricaturales ?

0 votes

Pour obtenir d'autres résultats de recherche, des articles, etc., recherchez "rendu non photoréaliste (2d)".

1 votes

J'ai perdu le compte du nombre de fois où j'ai vu la question d'un nouvel utilisateur être réduite à néant parce qu'il ne décrivait pas ce qu'il avait essayé jusqu'à présent, ses recherches, son code, etc. Et cette question obtient 55 votes positifs !

47voto

Cecil Has a Name Points 3385

Voici quelques algorithmes avec lesquels vous pouvez jouer :

  • Filtre flou médian ou à boîtes répétées pour obtenir une palette de couleurs caricaturales.
    • Edit : Le filtrage bilatéral devrait encore mieux répondre à vos besoins
  • Filtre Min (percentile zéro) pour améliorer certains types d'arêtes.
  • Segmentation d'une image couleur en utilisant un petit sous-cube ou une sphère dans le cube couleur RVB
  • Rehaussement générique des bords d'une image segmentée à l'aide de la détection des bords, comme les noyaux de Sobel ou le traçage des bords à 8 voies.
  • Composer une image floue/filtrée médiane avec des bords améliorés

Il s'agit d'éléments assez basiques et tous très faciles à mettre en œuvre. N'oubliez pas que les filtres de flou médian et de flou en boîte peuvent être mis en œuvre avec une complexité temporelle linéaire par rapport au rayon du noyau.

Plus de modifications :

Une fois que vous avez compris l'algorithme de Huang, la mise en œuvre d'un filtre flou de boîte est un véritable jeu d'enfant.

Matériel de lecture :

  • Filtrage médian et bilatéral rapide (obtenir le PDF)
  • Filtrage médian Temps constant (obtenir le PDF) Note : J'ai une implémentation de ceci en C# en utilisant Mono/SIMD pour accélérer la coalescence des histogrammes, cependant il semble seulement meilleur que le O ( r ) lorsque le diamètre dépasse ~60 pixels en raison du nombre comparable d'instructions d'addition et de soustraction (le seuil de rentabilité), une implémentation C++ est probablement beaucoup plus adaptée à l'exploitation de la SIMD.

Parmi les autres supports de lecture, citons Traitement numérique des images de Gonzalez & Woods (semble être une ancienne édition) pour la segmentation et le traçage des bords. Le traçage des bords à 8 voies peut être vraiment difficile à comprendre (choisir entre les bords sur le pixel ou entre les pixels et comment s'accrocher aux bords). Je serais heureux de partager un peu de code, mais les centaines de lignes ne sont pas vraiment adaptées ici.

0 votes

Cela semble mieux convenir à mes besoins. Connaissez-vous des ressources en ligne pour ces algorithmes que nous pourrions afficher ici, pour plus d'exhaustivité ?

1 votes

La postérisation est une transformation de quantification qui ne prend pas en compte les informations géométriques.

0 votes

Quelqu'un a t-il un exemple en utilisant ImageMagick, ou Gimp en mode batch ? J'essaie de comprendre cela sur Ubuntu Linux pour un projet.

22voto

mooware Points 945

Vous pourriez essayer la rotoscopie, comme toonyphotos.com fait :

rotoscopy example

5 votes

De la FAQ : "Le Rotoscope nécessite une intervention humaine pour fonctionner correctement."

0 votes

@Josip : Vous avez raison, j'ai négligé ce point. Néanmoins, la rotoscopie en général semble faire ce qu'il a demandé.

0 votes

Où avez-vous trouvé le code source pour cela @bryanbcook

12voto

unwind Points 181987

Vous pourriez vouloir vérifier Freestyle un projet open-source (Google Summer of Code, même) visant à mettre en œuvre un système de gestion de l'information. Rendu non photoréaliste para Blender . Voici un exemple de son résultat, en mode dessin animé : alt text
(source : <a href="http://freestyle.sourceforge.net/GALLERY/CARTOON/girl-color-and-lines-crop.jpg" rel="nofollow noreferrer">sourceforge.net </a>)

0 votes

+1 - C'est une superbe image, en particulier avec les lignes qui aident considérablement à l'apparence et à l'interprétation de l'image.

8voto

John Barrett Points 516

S'il existe un ensemble de paramètres qui permettent d'obtenir l'effet désiré en le GIMP (ou une autre combinaison de filtres), il peut être exécuté dans un fichier de type le mode de traitement par lot .

6voto

martiert Points 880

Je ne l'ai pas fait moi-même, mais je pense à deux étapes qui pourraient donner à l'image un aspect de dessin animé.

  1. Détectez les bords, et tracez une ligne assez épaisse (quelques pixels) sur ces bords.

  2. Diminuez le nombre de couleurs de votre image.

0 votes

En fait, j'ai essayé cet algorithme mais je n'ai pas réussi. Peut-être qu'il manque quelque chose ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X