Dans un logiciel d'édition d'images très répandu, les correctifs (le terme utilisé dans le traitement d'images correspond à celui indiqué par @ mınxomaτ.) Correspondent à une zone sélectionnée d'une image, en fonction des informations extérieures à ce correctif. Et il fait un très bon travail, considérant que ce n'est qu'un programme. En tant qu'être humain, vous pouvez parfois voir que quelque chose ne va pas, mais si vous serrez les yeux ou regardez simplement un coup d'œil, le patch semble combler assez bien le vide .
Défi
Etant donné qu'une image et un masque spécifiant une zone rectangulaire de l'image doivent être corrigés (également en tant qu'image ou tout autre format préféré), votre programme doit essayer de remplir la zone spécifiée avec un correctif qui tente de se fondre dans le reste de l'image. l'image. Le programme ne peut pas utiliser les informations de l'image d'origine qui se trouvait dans la zone spécifiée.
Vous pouvez supposer que le patch est toujours au moins de largeur par rapport aux côtés et de hauteur par rapport au haut et au bas de l'image. Cela signifie que la surface maximale d'un patch est de 1/9 de l'image entière.
Veuillez ajouter une brève description du fonctionnement de votre algorithme.
Vote
Les électeurs sont invités à juger de l’efficacité des algorithmes et à voter en conséquence.
Quelques suggestions sur la façon de juger: (Encore une fois, merci @ mınxomaτ pour quelques critères supplémentaires.)
- Si vous plissez les yeux et que la photo est belle?
- Pouvez-vous dire exactement où se trouve le patch?
- Dans quelle mesure les structures et les textures de l'arrière-plan de l'image et de la zone environnante sont-elles bien conservées?
- Combien de pixels en fausses couleurs parasites contient la zone modifiée?
- Y a-t-il des blobs / blocs de couleur uniforme dans la zone qui ne semblent pas y appartenir?
- La zone modifiée présente-t-elle des décalages drastiques de couleur / contraste ou de luminosité par rapport au reste de l'image?
Critère de validité
Pour qu'une soumission soit valide, l'image de sortie doit correspondre exactement à l'image d'entrée en dehors de la zone spécifiée.
Cas de test
A gauche l'image source, à droite le masque correspondant:
inpaint.exe left top width height img.jpg
)?Réponses:
AutoIt , VB
introduction
Ceci est une implémentation de l' algorithme de suppression d'objet par exemple basé sur des exemples développé par A. Criminisi, P. Perez (Cambridge Microsoft Research Ltd.) et K. Toyama (Microsoft) [X] . Cet algorithme vise les images à haute information (et les images vidéo) et vise à établir un équilibre entre reconstruction structurelle et reconstruction organique. Les paragraphes de cette réponse contiennent des citations de texte intégral tirées du document d'origine (puisqu'il n'est plus disponible officiellement) afin de rendre cette réponse plus autonome.
L'algorithme
Objectif : remplacer un élément sélectionné ( masquée ) (de préférence un objet de premier plan séparé visuellement) par un arrière-plan plausible visuellement.
Dans des travaux antérieurs, plusieurs chercheurs ont considéré la synthèse de texture comme un moyen de remplir de grandes régions d’image avec des textures "pures" - des motifs texturaux bidimensionnels répétitifs à stochasticité modérée. Ceci est basé sur un grand nombre de recherches sur la synthèse de texture, qui cherchent à reproduire la texture à l' infini , à partir d'un petit échantillon source de texture pure [1] [8] [9] [10] [11] [12] [14]. [15] [16] [19] [22] .
Aussi efficaces que ces techniques permettent de reproduire des textures cohérentes, elles ont du mal à combler les trous dans les photographies de scènes du monde réel, souvent composées de structures linéaires et de textures composites - de multiples textures en interaction spatiale [23] . Le problème principal est que les frontières entre les régions de l’image sont un produit complexe des influences mutuelles entre différentes textures. Contrairement à la nature bidimensionnelle des textures pures, ces limites forment ce que l’on pourrait considérer comme des structures d’image unidimensionnelles ou linéaires.
Les techniques d' inpainting d'image comblent les trous dans les images en propageant des structures linéaires (appelées isophotes dans la littérature d' inpainting ) dans la région cible par diffusion. Ils s’inspirent des équations aux dérivées partielles du flux de chaleur physique et fonctionnent de manière convaincante en tant qu’algorithmes de restauration. Leur inconvénient est que le processus de diffusion introduit un certain flou, ce qui est perceptible.
La région à remplir, c'est-à-dire que la région cible est indiquée par Ω, et son contour est noté δΩ. Le contour évolue vers l'intérieur à mesure que l'algorithme progresse. Nous l'appelons donc le «front de remplissage». La région source Φ, qui reste fixe tout au long de l'algorithme, fournit des échantillons utilisés dans le processus de remplissage. Nous nous concentrons maintenant sur une seule itération de l'algorithme pour montrer comment la structure et la texture sont gérées de manière adéquate par une synthèse basée sur des exemples. Supposons que le gabarit carré Ψp Ω centré au point p (fig. 2b) soit rempli. Le meilleur échantillon de la région source provient du patch patchqˆ ∈ Φ, qui ressemble le plus aux parties déjà remplies dans p. Dans l'exemple de la fig. 2b, on voit que si p se trouve sur la suite du bord d’une image, les meilleures combinaisons les plus probables se situeront le long du même bord (ou d’un bord de même couleur) (par exemple, Ψq 'et Ψq' 'sur la figure 2c). Tout ce qui est nécessaire pour propager l'isophote vers l'intérieur est un simple transfert du motif à partir du patch source le plus proche (fig. 2d). Notez que l'orientation isophote est automatiquement préservée. Sur la figure, malgré le fait que le bord d'origine n'est pas orthogonal au contour cible δΩ, la structure propagée a conservé la même orientation que dans la région source.
Détails d'implémentation et d'algorithme
La fonctionnalité de cette implémentation est encapsulée dans une DLL COM ActiveX qui est supprimée du programme hôte sous forme binaire, puis appelée à la volée en appelant l'inpainter par IID. Dans ce cas spécifique, l'API est écrite en VisualBasic et peut être appelée à partir de n'importe quel langage activé par COM. La section suivante du code supprime le binaire:
La bibliothèque est ensuite instanciée à l'aide du CLSID et de l'IID:
La bibliothèque accepte un descripteur GDIOBJECT, en particulier une section DIB de n’importe quel bitmap GDI / + (fichiers, flux, etc.). Le fichier image spécifié est chargé et dessiné sur un bitmap vide construit à partir de
Scan0
partir des dimensions de l'image en entrée.Le fichier d'entrée pour cette implémentation est tout format de fichier compatible GDI / + contenant des données d'image masquées. Le (s) masque (s) sont une ou plusieurs régions uniformément colorées dans l'image d'entrée. L'utilisateur fournit une valeur de couleur RVB pour le masque, seuls les pixels ayant exactement cette valeur de couleur seront appariés. La couleur de masquage par défaut est le vert (0, 255, 0). Toutes les régions masquées représentent ensemble la région cible Ω à supprimer et à remplir. La région source, Φ, est définie comme l’ensemble de l’image moins la région cible (Φ = I Ω).
Ensuite, comme pour toute synthèse de texture basée sur des exemples [10] , la taille de la fenêtre de modèle (ou " rayon de balayage ") doit être spécifiée. Cette implémentation fournit une taille de fenêtre par défaut de 6² pixels, mais impose en pratique à l'utilisateur de la définir pour qu'elle soit légèrement plus grande que le plus grand élément de texture pouvant être distingué, ou «texel», dans la région source. Une modification supplémentaire de l'algorithme d'origine est la " taille de bloc " définissable par l'utilisateur, qui détermine la zone de pixels à remplacer par une nouvelle couleur uniforme. Cela augmente la vitesse et diminue la qualité. Les blocs dont la taille est supérieure à 1px sont conçus pour être utilisés avec des zones extrêmement uniformes (eau, sable, fourrure, etc.). Toutefois, doit être maintenu à une valeur maximale. .5x la taille du bloc (ce qui peut être impossible en fonction du masque).
Pour ne pas bloquer l'algorithme sur les images 1 bit, chaque fois qu'une image de moins de 5 couleurs est reçue, la taille de la fenêtre est amplifiée de 10x.
Une fois que ces paramètres sont déterminés, le reste du processus de remplissage de région est complètement automatique. Dans notre algorithme, chaque pixel conserve une valeur de couleur (ou «vide», si le pixel est vide) et une valeur de confiance, qui reflète notre confiance dans la valeur de pixel, et qui est gelée une fois qu'un pixel est rempli. Au cours de l'algorithme, les correctifs situés le long du front de remplissage reçoivent également une valeur de priorité temporaire, qui détermine leur ordre de remplissage. Ensuite, notre algorithme itère les trois étapes suivantes jusqu'à ce que tous les pixels soient remplis.
Étape 1: Priorités des correctifs informatiques
L'ordre de remplissage est crucial pour la synthèse de texture non paramétrique [1] [6] [10] [13] . Jusqu'ici, le favori par défaut a été la méthode de «pelure d'oignon», dans laquelle la région cible est synthétisée de l'extérieur vers l'intérieur, en couches concentriques. Notre algorithme effectue cette tâche par le biais d'un algorithme de remplissage optimal, qui dépend entièrement des valeurs de priorité attribuées à chaque patch sur le front de remplissage. Le calcul de la priorité est orienté vers les patchs situés dans le prolongement d'arêtes fortes et qui sont entourés de pixels de confiance élevée. Ces pixels sont la limite, marquée par la valeur -2. Le code suivant recalcule les priorités:
Soit un patch centeredp centré au point p pour certains p ∈ δΩ (voir fig. 3), sa priorité P (p) est définie comme le produit de la confiance calculée (
ComputeConfidence
, ou C (p) ) et du terme de données (ComputeData
, ou D (p) ), où, où
| |p | est l'aire de Ψp, α est un facteur de normalisation (par exemple, α = 255 pour une image en niveaux de gris typique) et np est un vecteur unitaire orthogonal au front δΩ au point p. La priorité est calculée pour chaque patch de bordure, avec des patchs distincts pour chaque pixel situé à la limite de la région cible.
Mis en œuvre comme
Le terme de confiance C (p) peut être considéré comme une mesure de la quantité d'informations fiables entourant le pixel p. L’intention est de commencer par remplir les patchs qui ont déjà plus de pixels, avec une préférence supplémentaire pour les pixels qui ont été remplis très tôt (ou qui n’ont jamais fait partie de la région cible).
Ceci incorpore automatiquement la préférence vers certaines formes le long du front de remplissage. Par exemple, les correctifs qui incluent des coins et des vrilles minces de la région cible auront tendance à être remplis en premier, car ils sont entourés de plusieurs pixels de l'image d'origine. Ces correctifs fournissent des informations plus fiables avec lesquelles faire correspondre. Inversement, les zones situées à l'extrémité des «péninsules» de pixels remplis faisant saillie dans la région cible tendent à être mises de côté jusqu'à ce que davantage de pixels environnants soient remplis. À un niveau grossier, le terme C (p) de (1) applique l'ordre de remplissage concentrique souhaitable.
Au fur et à mesure du remplissage, les pixels des couches extérieures de la région cible auront tendance à se caractériser par des valeurs de confiance plus grandes et seront donc remplis plus tôt; les pixels au centre de la région cible auront des valeurs de confiance moins grandes. Le terme de données D (p) est fonction de la force des isophotes frappant le front δΩ à chaque itération. Ce terme augmente la priorité d'un patch dans lequel un "flux" isophote. Ce facteur revêt une importance fondamentale dans notre algorithme car il encourage la synthèse préalable des structures linéaires, puis leur propagation de manière sécurisée dans la région cible. Les lignes brisées ont tendance à se connecter, réalisant ainsi le "principe de connectivité" de la psychologie de la vision [7] [17] .
L’ordre de remplissage dépend des propriétés de l’image, ce qui aboutit à un processus de synthèse organique qui élimine le risque d’artefacts «à structure cassée» et réduit également les artefacts encombrants sans étape coûteuse de découpe de patch [9] ou de fusion induisant un flou [19]. ] .
Étape 2: Propagation des informations de texture et de structure
Une fois que toutes les priorités sur le front de remplissage ( limite ) ont été calculées, le patch Ψpˆ avec la priorité la plus élevée est trouvé. Nous le remplissons ensuite avec les données extraites de la région source. Nous propagons la texture de l'image par échantillonnage direct de la région source. Semblable à [10] , nous cherchons dans la région source le patch qui ressemble le plus à pˆ. Officiellement,
, où
la distance d (Ψa, Ψb) entre deux correctifs génériques a et Ψb est simplement définie comme la somme des différences au carré (SSD) des pixels déjà remplis dans les deux correctifs. Aucune analyse ou manipulation supplémentaire (en particulier aucun flou ) n'est effectuée à cette étape. Ce calcul s'exécute dans la boucle de cycle principale et est mis en œuvre comme suit:
Obtenir la priorité maximale:
Trouver le patch le plus similaire:
Étape 3: Mise à jour des valeurs de confiance
Une fois que le patch Ψpˆ a été rempli avec de nouvelles valeurs de pixel, la confiance C (p) est mise à jour dans la zone délimitée par pˆ comme suit:
Cette règle de mise à jour simple nous permet de mesurer la confiance relative des correctifs sur le front de remplissage, sans paramètres spécifiques à une image. Au fur et à mesure du remplissage, les valeurs de confiance diminuent, indiquant que nous sommes moins sûrs des valeurs de couleur des pixels proches du centre de la région cible. Mis en œuvre ici (avec toutes les autres mises à jour nécessaires):
Code complet
Voici le code exécutable, avec le code source des bibliothèques sous forme de commentaires.
Le code est appelé par
Des exemples sont inclus sous la forme de
Décommentez simplement l'exemple que vous voulez utiliser avec CTRL+ Q.
Fichiers de test officiels
Cet algorithme est fait pour être ajusté pour chaque image. Par conséquent, les valeurs par défaut (ainsi que les masques par défaut) sont complètement sous-optimaux. Les valeurs par défaut sont choisies pour que chaque échantillon puisse être traité dans un délai raisonnable. Je recommande fortement de jouer avec des masques de forme irrégulière et de meilleures tailles de fenêtres. Cliquez sur les images pour les agrandir!
Damier
→
gothique americain
→
Labyrinthe
→
Mona Lisa
→
(masque terrible)
Crier
→
Étoilé
→
Exemples concrets
Ceux-ci utilisent tous des masques personnalisés dessinés à la main.
Si vous avez d'autres images intéressantes que vous aimeriez voir incluses, laissez un commentaire.
Améliorations EBII
Il existe de nombreuses variantes d'EBII, créées par divers chercheurs. AnkurKumar Patel a attiré mon attention avec sa collection de documents [24] sur diverses améliorations d'EBII.
Plus précisément, le document " Algorithme amélioré amélioré pour la mise en image par exemple " [25] mentionne deux améliorations concernant la pondération des valeurs de priorité.
L'amélioration
La modification effective se trouve à l'étape 1 (voir ci-dessus) de l'algorithme et étend l'effet C (p) et D (p) sur la cote de priorité de ce pixel en utilisant ceci:
Dans la formule pour C et D donnée ci-dessus, et sont respectivement le facteur de normalisation (par exemple, α = 255), le vecteur isophote et le vecteur unitaire orthogonal au front du point p.
Plus loin,
La fonction de priorité est définie comme la somme en poids du terme de confiance régularisé C (p) et du nouveau terme de données D (p) . Où α est le coefficient d’ajustement, on définit comme suit la satisfaction de 0Rp (p):
Où α et β sont respectivement les pondérations composantes des termes de confiance et de données. Notez que α + β = 1 .
Notation objective
Ce qui est vraiment intéressant, c’est que ce document contient une méthode proposée (et simple!) Pour évaluer les performances des algorithmes EBII. Prenez ceci avec un grain de sel, car c’est une méthode choisie par les auteurs du papier eux-mêmes pour vérifier l’efficacité de la méthode de variance proposée et l’amélioration de plusieurs images.
L'évaluation du résultat est effectuée en comparant le PSNR (le rapport signal / bruit de pointe [26] ) entre l'image restaurée et l'image d'origine. En règle générale, plus la valeur PSNR est élevée, plus la similarité de l'image réparée avec l'image d'origine est grande. L'équation pour calculer le PSNR est la suivante:
Voici deux images stupéfiantes (deux!) Du monde réel qu'ils ont utilisées:
La conclusion est aussi décevante que la qualité du papier lui-même. Cela montre très peu d'amélioration. La chose principale ici est une méthode de notation d'objet possible pour ce type de défi (et d'autres défis de réparation d'image):
Meh
Recherche à faire
(Spécifique à EBII)
a) pré-traitement
Tout se résume au principe "d'effacement magique" selon lequel l'algorithme devrait "fonctionner" pour tout. Ma solution naïve pour cela est une amplification basée sur la couleur (voir ci-dessus), mais il existe de meilleures méthodes. Je songe à reconnaître la moyenne géométrique de tous les texels traçables pour ajuster automatiquement la taille de la fenêtre et faire en sorte que la taille du tampon (ainsi que mon amélioration) dépende de la résolution de texel et de l'image entière. La recherche doit être faite ici.
b) Post-traitement
Les auteurs originaux ont déjà fait un excellent travail en supprimant tous les filtres de post-traitement qui nous viennent à l’esprit. Aujourd'hui, j'ai essayé quelque chose d'autre, inspiré par la toujours mystérieuse Mona Lisa (merci undergroundmonorail). Si vous ne prenez que la région non peinte et appliquez un nouveau masque à tous les blocs de couleur étranges et que vous l'introduisez dans un algorithme de suppression du filtrage, vous obtenez un résultat presque parfait. Je pourrai explorer cela quelque temps dans le futur.
[X] - Suppression d'objet par une peinture à l'aide d'un modèle, par A. Criminisi, P. Perez, K. Toyama
[1] - M. Ashikhmin. Synthétiser des textures naturelles. Dans Proc. ACM Symp. sur les graphiques interactifs 3D, p. 217-226, Research Triangle Park, Caroline du Nord, mars 2001.
[5] - M. Bertalmio, L. Vese, G. Sapiro et S. Osher. Application simultanée d'images de structure et de texture. à paraître, 2002
[6] - R. Bornard, E. Lecan, L. Laborelli et JH. Chenot. Correction des données manquantes dans les images fixes et les séquences d'images. Dans ACM Multimedia, France, décembre 2002.
[7] - TF Chan et J. Shen. Inpainting non texturé par diffusions induites par la courbure (CDD). J. Visual Comm. Image Rep., 4 (12), 2001.
[8] - JS de Bonet. Procédure d'échantillonnage multirésolution pour l'analyse et la synthèse d'images de texture. Dans Proc. ACM Conf. Comp. Graphics (SIGGRAPH), volume 31, pages 361–368, 1997.
[9] - A. Efros et WT Freeman. Quilting d'image pour la synthèse et le transfert de texture. Dans Proc. ACM Conf. Comp. Graphics (SIGGRAPH), p. 341–346, Eugene Fiume, août 2001.
[10] - A. Efros et T. Leung. Synthèse de texture par échantillonnage non paramétrique. Dans Proc. ICCV, p. 1033-1038, Kerkyra, Grèce, septembre 1999.
[11] - WT Freeman, EC Pasztor et OT Carmichael. Apprendre la vision de bas niveau. Int. J. Computer Vision, 40 (1): 25–47, 2000.
[12] - D. Garber. Modèles de calcul pour l'analyse et la synthèse de texture. Thèse de doctorat, Univ. de Californie du Sud, USA, 1981.
[13] - P. Harrison. Une procédure non hiérarchique pour la resynthèse de texture complexe. Dans Proc. Int. Conf. Europe centrale Comp. Graphiques, Visua. et comp. Vision, Plzen, République tchèque, février 2001.
[14] - DJ Heeger et JR Bergen. Analyse / synthèse de texture à base de pyramide. Dans Proc. ACM Conf. Comp. Graphics (SIGGRAPH), volume 29, pages 229-233, Los Angeles, CA, 1995.
[15] - A. Hertzmann, C. Jacobs, N. Oliver, B. Curless et D. Salesin. Analogies d'image. Dans Proc. ACM Conf. Comp. Graphics (SIGGRAPH), Eugene Fiume, août 2001.
[16] - H. Igehy et L. Pereira. Remplacement d'image par synthèse de texture. Dans Proc. Int. Conf. Image Processing, pp. III: 186-190, 1997.
[17] - G. Kanizsa. Organisation en vision. Praeger, New York, 1979.
[19] - L. Liang, C. Liu, Y.-Q. Xu, B. Guo et H.-Y. Shum. Synthèse de texture en temps réel par échantillonnage par patch. Dans ACM Transactions on Graphics, 2001.
[22] - L.-W. Wey et M. Levoy. Synthèse de texture rapide par quantification vectorielle structurée en arborescence. Dans Proc. ACM Conf. Comp. Graphics (SIGGRAPH), 2000.
[23] - A. Zalesny, V. Ferrari, G. Caenen et L. van Gool. Synthèse de texture composite parallèle. Dans l'atelier Texture 2002 - (en liaison avec ECCV02), Copenhague, Danemark, juin 2002.
[24] - AkurKumar Patel, Université technologique du Gujarat, Informatique et ingénierie
[25] - Algorithme amélioré pour la modélisation d'images à l'aide d'exemplaires
[26] - Wikipedia, rapport signal sur bruit
la source
Matlab
C'est une approche d'interpolation simple. L'idée est d'abord de refléter ce qui est de chaque côté du patch. Ensuite, ces pixels d’image miroir sont interpolés en fonction de leur distance par rapport au bord correspondant:
La partie la plus délicate consistait à trouver de bons poids d’interpolation. Après quelques jeux, je suis arrivé à une fonction rationnelle nulle à tous les bords sauf celui sur lequel nous avons réfléchi. Ceci est ensuite transformé par un polynôme du troisième degré pour un lissage:
Cette approche simple fait étonnamment bien sur les images "naturelles", mais dès que vous êtes confronté à des contours nets, le jeu est terminé. Dans l' exemple gothique américain, les pointes de la fourche à foin s'alignent bien sur la grille de pixels, ce qui lui donne une belle apparence, mais cela aurait été bien pire autrement.
Alors voici les résultats:
Et enfin, le code:
la source
Mathematica
Ceci utilise la
Inpaint
fonction de Mathematica . Parce que Mathematica lui-même fait le gros du travail, il s'agit d'un wiki de communauté.inPaint
(ci-dessous) est une simple adaptation deInpaint
. Pour les peintures / photos en couleur, il utilise le paramètre par défaut, "TextureSynthesis". S'il détecte que l'image est en noir et blanc (parce que les données d'image de l'image sont identiques à celles de la forme binaire de l'image), il binarise alors l'image et applique le patch "Variation totale". LaIf
clause s'appliqueBinarize
ouIdentity
à l'image. (LaIdentity
fonction retourne son argument sous forme inchangée.)L'image et le masque sont entrés en arguments
inPaint
.Partition
etGrid
sont simplement à des fins de formatage.Les sorties ont été corrigées. Il n'y a pas eu de retouche des images après
inPaint
.la source
Inpaint
semble rechercher des symétries sur l’ensemble de l’image en noir et blanc. - DavidC Il y a 9 heuresPython 2 et PIL
Ce programme mélange des copies des régions Nord, Sud, Est et Ouest pour créer des pixels de remplacement utilisant des couleurs, des textures et des ombres issues de la région d'image locale.
Les exemples de sortie:
Le code trouve d'abord le cadre de sélection du correctif. Ensuite, pour chaque pixel à générer, il calcule la couleur de chaque canal (RVB) sur la base de la somme pondérée des 4 régions environnantes.
la source
Python 3, PIL
Ce programme utilise l'opérateur sobel et dessine des lignes sur l'image en fonction de cela.
L'opérateur sobel trouve l'angle de chaque arête, ainsi toutes les arêtes extrudées dans la zone inconnue doivent continuer.
En attendant, voici les exemples d’images.
Mona Lisa Mona Lisa dit Lisa o̢̎̓̀ǹ̰͎̣aͧ̈ͤ Lisa Ḿ̳̜͇͓͠o̢̎̓̀ǹ̰͎̣͙a̤̩̖̞̝ͧ̈ͤͤ L͉̻̭͌i̛̥͕̱͋͌ş̠͔̏̋̀ạ̫͕͎ͨͮͪ̐͡ͅ
La zone de l'image ci-dessus est aussi lisse qu'un cactus
Ce n'est pas très bon avec une couleur constante.
la source
Python 2
Un script python simple qui crée un patch en utilisant des valeurs de pixels juste en dehors de gap. Il prend les valeurs de couleur à partir de la fin de la ligne et de la colonne de pixels et calcule la moyenne pondérée en utilisant la distance par rapport à ces pixels.
La sortie n'est pas si jolie, mais c'est de l' art .
Et ensuite, code:
la source
Mathematica
Il se trouve que Mathematica a une fonction intégrée qui effectue exactement cette tâche, et je veux dire exactement :
Par défaut, il utilise une "méthode de synthèse de texture la mieux adaptée utilisant un échantillonnage aléatoire" qui produit de bons résultats sur les peintures, mais médiocre pour le labyrinthe et le damier:
Jouer avec les réglages ne m'a pas apporté une augmentation de la qualité de toutes les images, alors j'ai simplement utilisé les valeurs par défaut (pour économiser des octets, c'est
codegolf.se
après tout!).la source
Binarize
(pour éliminer les taches grises). Essayez ceci:methods = {"TextureSynthesis", "Diffusion", "FastMarching", "NavierStokes", "TotalVariation"};g[pic_, mask_] := Join[{Labeled[Framed@pic, "Original"]}, Labeled[ Binarize@Inpaint[pic, mask, Method -> #], #] & /@ methods]
TextureSynthesis
fait que paraître beau sur les peintures; et je ne pense pas que nous soyons autorisés à ajuster nos paramètres pour chaque cas de test individuel. (Si nous le pouvions, nous pourrions alors trivialement fournir la partie manquante sous la forme d'un "paramètre".)inPaint[picture_, mask_] := If[bw = ImageData@Rasterize[Binarize[picture]] == ImageData[picture], Binarize, Identity]@ Inpaint[picture, mask, Method -> If[bw, "TotalVariation", "TextureSynthesis"]]
Python3
Cette réponse implémente l'idée dans l'article "Deep Image Prior" d'Ulyanov et al. (CVPR 2018) Dans cet article, ils ont exploré l’idée que la façon dont les réseaux de neurones performants sont conçus pour le traitement d’images reflète étroitement notre idée de ce à quoi une image naturelle devrait ressembler (la distribution "antérieure").
Ils ont proposé une méthode pouvant être utilisée pour l’inpainting, ainsi que pour la suppression du bruit et des artefacts, qui utilise simplement l’image donnée sans aucune formation sur d’autres données. Le concept actuel est assez simple: le réseau est entraîné à produire l'image souhaitée (pour certains parasites aléatoires fixes en entrée) en ne pénalisant que les erreurs qui se trouvent en dehors d'un masque donné. Si vous souhaitez supprimer le bruit, vous n'avez simplement pas besoin de masquer quoi que ce soit, mais arrêtez-vous tôt dans la formation.
Pour inpainting, vous masquez la partie que vous souhaitez peindre et former jusqu'à la convergence. Ce n’est certes pas à la pointe de la technologie, mais j’avais quand même envie de le poster et de le poster ici en raison de la simplicité de l’idée et de la performance encore remarquable. Dans mes expériences, l’inpainting de plus gros patchs n’a pas donné les mêmes résultats, mais pour des segments plus petits, les résultats peuvent être beaucoup plus convaincants.
J'ai implémenté cela en utilisant l' architecture U-Net de jaxony sur github . Le code de formation et de traitement des images est disponible ci-dessous.
Entraînement
Ceci est une visualisation du processus de formation. Chaque cadre est l’état d’un certain nombre d’itérations:
Exemples
Code
Notez que sur un processeur cela peut prendre des heures pour une seule image, alors qu'un bon gpu activé par cuda peut prendre beaucoup moins de temps.
la source
Python avec OpenCV
OpenCV a une fonction appelée inpaint. Il existe deux types d’inpainting, je vais utiliser la méthode de marche rapide. Selon la documentation, l'algorithme fonctionne comme suit:
Voici le code *:
Notez comment je convertis le BGR en RVB pour des raisons de traçage. Aussi, je le tourne. Voici les résultats:
Mona Lisa revient!
Comme vous pouvez le constater, ce n’est pas le meilleur avec les deux couleurs.
la source
Java
Une approche de la moyenne des couleurs. Peut probablement être amélioré.
Résultats:
la source