web-dev-qa-db-fra.com

Comment dessiner une image par programmation?

Mon application fonctionne avec des photos et des vidéos de personnes que je souhaite 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'image) ou peut-être un programme CLI qui le fera pour moi que je peux appeler et utiliser à partir de notre propre application.

63
JimDaniel

Voici quelques algorithmes pour jouer avec:

  • Filtre de flou médian ou répété pour obtenir une palette de couleurs caricaturales
    • Edit: Le filtrage bilatéral devrait encore mieux répondre à vos besoins
  • Filtre minimum (centile zéro) pour améliorer certains types de bords
  • Segmentation d'image couleur à l'aide d'un petit sous-cube ou d'une sphère dans le cube couleur RVB
  • Amélioration générique d'Edge sur une image segmentée à l'aide de la détection d'Edge comme les noyaux Sobel ou le traçage d'Edge à 8 voies
  • Image composite floue/filtrée médiane avec bords améliorés

Celles-ci sont assez basiques et toutes très faciles à mettre en œuvre. Gardez à l'esprit que les filtres de flou médian et de flou peuvent être mis en œuvre avec une complexité temporelle linéaire sans fil le rayon du noyau.

Plus de modifications:

Une fois que vous avez l'idée de l'algorithme de Huang, la mise en œuvre d'un filtre de flou de boîte est un délicieux morceau de gâteau.

Matériel de lecture:

  • Filtrage médian et bilatéral rapide (obtenir le PDF)
  • Temps constant de filtrage médian (obtenir le PDF) Remarque: J'ai une implémentation de ceci en C # en utilisant Mono/SIMD pour accélérer la coalescence de l'histogramme, mais elle ne semble meilleure que la [~ # ~] o [~ # ~] ( r ) algorithme lorsque le diamètre dépasse ~ 60 pixels en raison du nombre comparable d'instructions add/sub (le seuil de rentabilité), une implémentation C++ est probablement beaucoup mieux adaptée pour exploiter SIMD.

D'autres supports de lecture incluent Gonzalez & Woods 'Digital Image Processing (semble être une ancienne édition) pour la segmentation et le traçage des bords. Le tracé des bords à 8 voies peut être très difficile à courber (choisir entre des bords sur pixel ou entre pixels et comment se verrouiller sur les bords). Je serais ravi de partager du code, mais les centaines de lignes ne s'intègrent pas parfaitement ici.

47
Cecil Has a Name

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

rotoscopy example

22
mooware

Vous voudrez peut-être consulter Freestyle , un projet open-source (Google Summer of Code, même) pour implémenter un rendu non photoréaliste pour Blender =. Voici un exemple de sa sortie, en mode dessin animé: alt text
(source: sourceforge.net )

12
unwind

S'il existe un ensemble de paramètres qui produisent l'effet souhaité dans le filtre Cartoon de le GIMP (ou une autre combinaison de filtres), il peut être exécuté dans un mode de traitement par lots .

7
John Barrett

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

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

  2. Diminuez le nombre de couleurs dans votre image.

6
martiert

Je ne sais pas si cela vous aidera, mais ce tutoriel pour Photoshop suggère de faire ce qui suit:

  1. Ouvrez votre image dans Photoshop
  2. Filtre> Flou> Flou gaussien. Réglez le rayon à 3,0 ou plus, au goût.
  3. Édition> Fade Gaussian Blur. Une fenêtre apparaîtra. . . réglez le mode sur assombrir. Vous devrez peut-être également réduire l'opacité.

Voici le résultat.

enter image description here

J'imagine que vous pourriez faire quelque chose de similaire dans votre programme.

5
RiddlerDev

C'est relativement facile à faire. Voici les étapes:

  • filtrage bilatéral pour simplifier/résumer la photo. Vous voudrez peut-être séparer le filtre bilatéral pour qu'il soit plus rapide. Effectuez le filtre bilatéral en 1d le long du gradient puis le long de la normale au gradient.

  • détecter les bords. Par exemple, en utilisant un algo Différence des Gaussiens. Vous pouvez utiliser le DoG dans la direction du gradient et le lisser en suivant les lignes de flux. Pour obtenir les lignes d'écoulement, vous devez obtenir le flux tangent de bord (ETF) que vous pouvez obtenir via le tenseur de structure.

  • quantifier les couleurs. En fait, vous quantifiez la luminance pour simuler l'ombrage cel aka ombrage toon.

  • mélanger l'image abstraite après quantification et les bords que vous avez détectés.

Cela vous donnera une image rendue qui ressemble à un dessin animé ombré cel.

J'ai créé un logiciel gratuit (pour win64) qui fait exactement cela à: http://3dstereophoto.blogspot.com/p/painting-software.html

Le nom du logiciel est "The Cartoonist" et vous pouvez le voir en action ici: http://3dstereophoto.blogspot.com/2018/07/non-photorealistic-rendering-software_9.html

Ce sont des liens vers mon blog qui traite principalement de la photographie 3D (cartes de profondeur, photogrammétrie, etc.).

3
Ugo Capeto

en fait je ne connais pas d'outil mais vous pouvez regarder vers osg (openSceneGraph)

il y a une bibliothèque osgFX et il y a un effet de dessin animé ... vous pouvez peut-être vous inspirer de cette bibliothèque ...


peut-être (je ne sais pas) imagemagick a beaucoup de fonctionnalités, peut-être qu'il a une fonctionnalité comme ça mais je ne sais pas ...

1
ufukgun