In einem beliebten Bildbearbeitungssoftware gibt es eine Funktion, dass Patches (Der Begriff in der Bildverarbeitung verwendet wird Inpaintingvorgang als @ mınxomaτ hingewiesen.) Einen ausgewählten Bereich eines Bildes auf der Grundlage der Informationen außerhalb des Patch. Und es macht einen ziemlich guten Job, wenn man bedenkt, dass es nur ein Programm ist. Als Mensch kann man manchmal sehen, dass etwas nicht stimmt, aber wenn man die Augen zusammenpresst oder nur einen kurzen Blick darauf wirft, scheint der Fleck die Lücke ziemlich gut zu füllen .
Herausforderung
Wenn ein Bild und eine Maske, die einen rechteckigen Bereich des Bildes angibt, gepatcht werden sollen (auch als Bild oder in einem anderen bevorzugten Format), sollte Ihr Programm versuchen, den angegebenen Bereich mit einem Patch zu füllen, der sich dem Rest des Bildes anpasst das Bild. Das Programm kann nicht die Informationen des Originalbilds verwenden, die sich innerhalb des angegebenen Bereichs befanden.
Sie können davon ausgehen, dass der Patch immer mindestens die Breite von den Seiten und die Höhe von der Ober- und Unterseite des Bildes entfernt ist. Das bedeutet, dass die maximale Fläche eines Patches 1/9 des gesamten Bildes beträgt.
Bitte fügen Sie eine kurze Beschreibung der Funktionsweise Ihres Algorithmus hinzu.
Wählen
Die Wähler werden gebeten, zu beurteilen, wie gut die Algorithmen funktionieren, und entsprechend abzustimmen.
Einige Vorschläge zur Beurteilung: (Nochmals vielen Dank an @ mınxomaτ für die weiteren Kriterien.)
- Wenn Sie die Augen zusammenkniffen und das Bild gut aussieht?
- Kannst du genau sagen, wo sich der Patch befindet?
- Wie gut setzen sich Strukturen und Texturen aus Bildhintergrund und Umgebung fort?
- Wie viele falsche Farbpixel enthält der bearbeitete Bereich?
- Gibt es in dem Bereich gleichmäßig gefärbte Kleckse / Blöcke, die nicht dorthin zu gehören scheinen?
- Weist der bearbeitete Bereich im Vergleich zum Rest des Bildes drastische Farb- / Kontrast- oder Helligkeitsverschiebungen auf?
Gültigkeitskriterium
Damit eine Übermittlung gültig ist, muss das Ausgabebild genau mit dem Eingabebild außerhalb des angegebenen Bereichs übereinstimmen.
Testfall
Links das Quellbild, rechts die entsprechende Maske:
inpaint.exe left top width height img.jpg
) akzeptieren ?Antworten:
AutoIt , VB
Einführung
Dies ist eine Implementierung des von A. Criminisi, P. Perez (Cambridge Microsoft Research Ltd.) und K. Toyama (Microsoft) [X] entwickelten Algorithmus zum Entfernen von Objekten durch exemplarbasiertes Inpainting . Dieser Algorithmus zielt auf Bilder (und Videobilder) mit hohem Informationsgehalt ab und soll das Gleichgewicht zwischen struktureller Rekonstruktion und organischer Rekonstruktion herstellen. Die Absätze dieser Antwort enthalten Volltextzitate aus dem Originalpapier (da es nicht mehr offiziell verfügbar ist), um diese Antwort in sich geschlossener zu machen.
Der Algorithmus
Ziel : Ersetzen Sie einen ausgewählten ( maskierten ) Bereich (vorzugsweise ein visuell getrenntes Vordergrundobjekt) durch einen visuell plausiblen Hintergrund.
In früheren Arbeiten haben mehrere Forscher die Textur-Synthese als einen Weg betrachtet, große Bildbereiche mit "reinen" Texturen zu füllen - sich wiederholenden zweidimensionalen Texturmustern mit mäßiger Stochastizität. Dies basiert auf einer Vielzahl von Untersuchungen zur Textur-Synthese, die versuchen, die Textur ad infinitum zu replizieren , wenn eine kleine Quellprobe reiner Textur vorliegt. [1] [8] [9] [10] [11] [12] [14] [15] [16] [19] [22] .
So effektiv diese Techniken bei der Replikation konsistenter Texturen sind, so schwierig ist es, Löcher in Fotografien realer Szenen zu füllen, die häufig aus linearen Strukturen und zusammengesetzten Texturen bestehen - mehreren räumlich wechselwirkenden Texturen [23] . Das Hauptproblem besteht darin, dass Grenzen zwischen Bildbereichen ein komplexes Produkt gegenseitiger Einflüsse zwischen verschiedenen Texturen sind. Im Gegensatz zur zweidimensionalen Natur reiner Texturen bilden diese Grenzen eher eindimensionale oder lineare Bildstrukturen.
Bild-Inpainting- Techniken füllen Löcher in Bildern, indem sie lineare Strukturen ( in der Inpainting- Literatur als Isophoten bezeichnet ) durch Diffusion in die Zielregion ausbreiten . Sie sind von den partiellen Differentialgleichungen des physikalischen Wärmeflusses inspiriert und überzeugen als Wiederherstellungsalgorithmen. Ihr Nachteil ist, dass der Diffusionsprozess einige Unschärfen hervorruft, die sich bemerkbar machen.
Der zu füllende Bereich, dh der Zielbereich, ist mit Ω bezeichnet, und seine Kontur ist mit δΩ bezeichnet. Die Kontur entwickelt sich im Verlauf des Algorithmus nach innen und wird daher auch als "Füllfront" bezeichnet. Der Source-Bereich Φ, der während des gesamten Algorithmus fest bleibt, liefert Proben, die beim Füllvorgang verwendet werden. Wir konzentrieren uns nun auf eine einzelne Iteration des Algorithmus, um zu zeigen, wie Struktur und Textur durch beispielbasierte Synthese angemessen gehandhabt werden. Angenommen, die quadratische Schablone Ψp ∈ Ω, die am Punkt p zentriert ist (Abb. 2b), soll ausgefüllt werden. Das am besten passende Sample aus der Quellregion stammt aus dem Patch ΨqΨ ∈ ∈, das den bereits ausgefüllten Teilen von filledp am ähnlichsten ist. Im Beispiel in Abb. 2b sehen wir, dass, wenn Ψp auf der Fortsetzung einer Bildkante liegt, Die wahrscheinlich besten Übereinstimmungen liegen entlang derselben (oder einer ähnlich gefärbten) Kante (z. B. Ψq 'und Ψq' 'in Abb. 2c). Alles, was erforderlich ist, um die Isophote nach innen zu verbreiten, ist eine einfache Übertragung des Musters vom Quell-Patch mit der besten Übereinstimmung (Abb. 2d). Beachten Sie, dass die Ausrichtung der Isophoten automatisch beibehalten wird. In der Figur hat die ausgebreitete Struktur trotz der Tatsache, dass die ursprüngliche Kante nicht orthogonal zur Zielkontur & dgr; & OHgr; ist, die gleiche Orientierung wie im Quellbereich beibehalten.
Implementierungs- und Algorithmusdetails
Die Funktionalität dieser Implementierung ist in einer ActiveX-COM-DLL gekapselt, die als Binärdatei aus dem Host-Programm entfernt und dann sofort durch Aufrufen des Inpainter durch IID aufgerufen wird. In diesem speziellen Fall ist die API in VisualBasic geschrieben und kann aus jeder COM-fähigen Sprache aufgerufen werden. Im folgenden Codeabschnitt wird die Binärdatei gelöscht:
Die Bibliothek wird später mithilfe von CLSID und IID instanziiert:
Die Bibliothek akzeptiert ein GDIOBJECT-Handle, insbesondere einen DIBSection einer beliebigen GDI / + -Bitmap (Dateien, Streams usw.). Die angegebene Bilddatei wird geladen und auf eine leere Bitmap gezeichnet, die
Scan0
aus den eingegebenen Bildabmessungen erstellt wurde.Die Eingabedatei für diese Implementierung ist ein beliebiges GDI / + -kompatibles Dateiformat, das maskierte Bilddaten enthält. Die Maske (n) ist (sind) ein oder mehrere gleichmäßig gefärbte Bereiche im Eingabebild. Der Benutzer gibt einen RGB-Farbwert für die Maske an. Nur Pixel mit genau diesem Farbwert werden abgeglichen. Die Standardmaskierungsfarbe ist grün (0, 255, 0). Alle maskierten Bereiche zusammen repräsentieren den zu entfernenden und zu füllenden Zielbereich Ω. Der Quellbereich Φ ist definiert als das gesamte Bild abzüglich des Zielbereichs (Φ = I - Ω).
Als nächstes muss, wie bei allen beispielbasierten Textursynthesen [10] , die Größe des Vorlagenfensters Ψ (auch " Scanradius " genannt) angegeben werden. Diese Implementierung bietet eine Standardfenstergröße von 6² Pixeln. In der Praxis muss der Benutzer jedoch festlegen, dass sie geringfügig größer ist als das größte unterscheidbare Texturelement oder „Texel“ in der Quellregion. Eine zusätzliche Modifikation des ursprünglichen Algorithmus ist die benutzerdefinierte " Blockgröße ", die den Bereich der Pixel bestimmt, die durch eine neue einheitliche Farbe ersetzt werden sollen. Dies erhöht die Geschwindigkeit und verringert die Qualität. Blockgrößen größer als 1px sind für extrem gleichmäßige Bereiche (Wasser, Sand, Fell usw.) vorgesehen. Ψ sollte jedoch bei max. .5x die Blockgröße (was je nach Maske unmöglich sein kann).
Damit der Algorithmus für 1-Bit-Bilder nicht blockiert wird, wird die Fenstergröße jedes Mal, wenn ein Bild mit weniger als 5 Farben empfangen wird, um das 10-fache vergrößert.
Sobald diese Parameter bestimmt sind, erfolgt der Rest des Bereichsfüllvorgangs vollständig automatisch. In unserem Algorithmus behält jedes Pixel einen Farbwert (oder "leer", wenn das Pixel nicht gefüllt ist) und einen Vertrauenswert bei, der unser Vertrauen in den Pixelwert widerspiegelt und der eingefroren wird, sobald ein Pixel gefüllt wurde. Im Verlauf des Algorithmus wird Patches entlang der Füllfront auch ein temporärer Prioritätswert zugewiesen, der die Reihenfolge bestimmt, in der sie gefüllt werden. Dann durchläuft unser Algorithmus die folgenden drei Schritte, bis alle Pixel gefüllt sind.
Schritt 1: Patch-Prioritäten berechnen
Die Füllreihenfolge ist entscheidend für die nichtparametrische Textur-Synthese [1] [6] [10] [13] . Bisher war der Standardfavorit die Zwiebelschälmethode, bei der die Zielregion von außen nach innen in konzentrischen Schichten synthetisiert wird. Unser Algorithmus führt diese Aufgabe durch einen Best-First-Füllungsalgorithmus aus, der vollständig von den Prioritätswerten abhängt, die jedem Patch auf der Füllungsfront zugewiesen sind. Die Prioritätsberechnung ist auf diejenigen Flecken ausgerichtet, die sich auf der Fortsetzung starker Kanten befinden und von Pixeln mit hoher Vertrauenswürdigkeit umgeben sind, wobei diese Pixel die Grenze sind, die durch den Wert -2 markiert ist. Der folgende Code berechnet die Prioritäten neu:
Wenn ein Patch Ψp am Punkt p für einige p ∈ δΩ zentriert ist (siehe Abb. 3), ist seine Priorität P (p) definiert als das Produkt aus dem berechneten Vertrauen (
ComputeConfidence
, oder C (p) ) und dem Datenterm (ComputeData
, oder D (p) ), wobei, wo
| Ψp | ist die Fläche von Ψp, α ist ein Normalisierungsfaktor (z. B. α = 255 für ein typisches Graustufenbild), und np ist ein Einheitsvektor senkrecht zur Vorderseite δΩ im Punkt p. Die Priorität wird für jedes Randfeld mit unterschiedlichen Feldern für jedes Pixel an der Grenze der Zielregion berechnet.
Implementiert als
Der Konfidenzterm C (p) kann als Maß für die Menge an zuverlässiger Information angesehen werden, die das Pixel p umgibt. Die Absicht ist es, zuerst die Patches zu füllen, bei denen mehr Pixel bereits gefüllt sind, wobei Pixel bevorzugt werden, die zu einem frühen Zeitpunkt gefüllt wurden (oder die niemals Teil des Zielbereichs waren).
Dies beinhaltet automatisch die Bevorzugung bestimmter Formen entlang der Füllfront. Beispielsweise werden Flecken, die Ecken und dünne Ranken des Zielbereichs enthalten, in der Regel zuerst gefüllt, da sie von mehr Pixeln aus dem Originalbild umgeben sind. Diese Patches bieten zuverlässigere Informationen, mit denen verglichen werden kann. Umgekehrt werden Flecken an der Spitze von "Halbinseln" von gefüllten Pixeln, die in den Zielbereich hineinragen, eher beiseite gelegt, bis mehr der umgebenden Pixel ausgefüllt sind Erzwingt die gewünschte konzentrische Füllreihenfolge.
Mit fortschreitendem Füllen werden Pixel in den äußeren Schichten des Zielbereichs tendenziell durch höhere Vertrauenswertewerte gekennzeichnet und daher früher gefüllt; Pixel in der Mitte des Zielbereichs weisen geringere Konfidenzwerte auf. Der Datenterm D (p) ist eine Funktion der Stärke der Isophoten, die bei jeder Iteration auf die Front δΩ treffen. Dieser Begriff erhöht die Priorität eines Patches, in das ein Isophot "fließt". Dieser Faktor ist für unseren Algorithmus von grundlegender Bedeutung, da er dazu anregt, zunächst lineare Strukturen zu synthetisieren und sich daher sicher in der Zielregion auszubreiten. Gebrochene Linien verbinden sich und verwirklichen so das "Konnektivitätsprinzip" der Sehpsychologie [7] [17] .
Die Füllreihenfolge hängt von den Bildeigenschaften ab. Dies führt zu einem organischen Syntheseverfahren, bei dem das Risiko von Artefakten mit „gebrochener Struktur“ beseitigt wird und blockartige Artefakte ohne teuren Patch-Schneideschritt [9] oder verwacklungsinduzierenden Mischschritt [19 ] reduziert werden ] .
Schritt 2: Weitergabe von Textur- und Strukturinformationen
Nachdem alle Prioritäten an der Füllfront ( Grenze ) berechnet wurden, wird das Patch ΨpΨ mit der höchsten Priorität gefunden. Wir füllen es dann mit Daten, die aus der Quellregion Φ extrahiert wurden. Wir verbreiten die Bildtextur durch direktes Abtasten der Quellregion. Ähnlich wie bei [10] suchen wir in der Quellregion nach dem Patch, der am ähnlichsten zu ΨpΨ ist. Formal,
, wo
Der Abstand d (Ψa, Ψb) zwischen zwei generischen Feldern Ψa und Ψb wird einfach als die Summe der quadratischen Differenzen (SSD) der bereits gefüllten Pixel in den beiden Feldern definiert. In diesem Schritt wird keine weitere Analyse oder Manipulation ( insbesondere keine Unschärfe ) durchgeführt. Diese Berechnung läuft in der Hauptzyklusschleife und wird wie folgt implementiert:
Maximale Priorität erhalten:
Den ähnlichsten Patch finden:
Schritt 3: Aktualisieren der Konfidenzwerte
Nachdem das Patch Ψpˆ mit neuen Pixelwerten gefüllt wurde, wird die Konfidenz C (p) in dem durch ΨpΨ begrenzten Bereich wie folgt aktualisiert:
Mit dieser einfachen Aktualisierungsregel können wir die relative Zuverlässigkeit von Patches auf der Füllfront ohne bildspezifische Parameter messen. Mit fortschreitender Füllung nehmen die Konfidenzwerte ab, was darauf hinweist, dass die Farbwerte von Pixeln nahe der Mitte des Zielbereichs unsicherer sind. Hier implementiert (zusammen mit allen anderen notwendigen Updates):
Code vervollständigen
Hier ist der ausführbare Code, zusammen mit dem Quellcode der Bibliotheken als Kommentar.
Der Code wird von aufgerufen
Beispiele sind in der Form von enthalten
Kommentieren Sie einfach das Beispiel aus, das Sie mit CTRL+ ausführen möchten Q.
Offizielle Testdateien
Dieser Algorithmus ist gemacht für jedes Bild angepasst werden. Daher sind die Standardwerte (und auch die Standardmasken) vollständig suboptimal. Die Standardwerte werden so gewählt, dass jede Probe in angemessener Zeit verarbeitet werden kann. Ich empfehle dringend, mit unregelmäßig geformten Masken und besseren Fenstergrößen zu spielen. Klicken Sie auf die Bilder, um sie zu vergrößern!
Schachbrett
→
Amerikanische Gotik
→
Matze
→
Mona Lisa
→
(Schreckliche Maske)
Schrei
→
Sternenhimmel
→
Beispiele aus der Praxis
Diese verwenden alle benutzerdefinierte handgezeichnete Masken.
Wenn Sie weitere interessante Bilder haben, die Sie gerne sehen würden, hinterlassen Sie einen Kommentar.
EBII-Verbesserungen
Es gibt mehrere Varianten von EBII, die von verschiedenen Forschern entwickelt wurden. AnkurKumar Patel machte mich mit seiner Sammlung von Artikeln [24] zu verschiedenen EBII-Verbesserungen auf sich aufmerksam.
Insbesondere in der Veröffentlichung " Verbesserter robuster Algorithmus für exemplarisches Inpainting von Bildern " [25] werden zwei Verbesserungen beim Abwägen der Prioritätswerte erwähnt.
Die Verbesserung
Die effektive Änderung befindet sich in Schritt 1 (siehe oben) des Algorithmus und erweitert den C (p) - und D (p) -Effekt auf die Prioritätsbewertung für dieses Pixel wie folgt:
In der oben angegebenen Formel für C und D sind und der Normalisierungsfaktor (z. B. α = 255), der Isophotenvektor und der Einheitsvektor orthogonal zur Front im Punkt p.
Des Weiteren,
Die Prioritätsfunktion ist definiert als die Gewichtungssumme des regulierten Vertrauensausdrucks C (p) und des neuen Datenausdrucks D (p) . Wenn α der Anpassungskoeffizient ist, ist die Erfüllung von 0Rp (p) wie folgt definiert:
Wobei α und β jeweils die Komponentengewichte des Vertrauens und der Datenausdrücke sind. Man beachte, dass α + β = 1 ist .
Objektive Wertung
Was jedoch wirklich interessant ist, ist, dass dieses Papier eine vorgeschlagene (und einfache!) Methode zur Bewertung der Leistung von EBII-Algorithmen enthält. Nehmen Sie dies jedoch mit einem Körnchen Salz, da dies eine Methode ist, die von den Autoren des Papiers selbst gewählt wurde, um die Wirksamkeit des vorgeschlagenen Varianzansatzes und die Verbesserung mehrerer Bilder zu überprüfen.
Die Ergebnisbewertung erfolgt durch Vergleichen des PSNR (Peak Signal to Noise Ratio [26] ) zwischen dem wiederhergestellten Bild und dem Originalbild. Im Allgemeinen ist die Ähnlichkeit des reparierten Bildes mit dem Original umso größer, je höher der PSNR-Wert ist. Die Gleichung zur Berechnung des PSNR lautet wie folgt:
Dies sind die atemberaubenden 2 (zwei!) Realen Testbilder, die sie verwendet haben:
Das Fazit ist so enttäuschend wie die Qualität des Papiers. Es zeigt sehr wenig Besserung. Die Hauptsache hier ist eine mögliche Objektbewertungsmethode für diese Art von Herausforderung (und andere Bildreparaturherausforderungen):
Meh.
Forschung zu tun
(EBII-spezifisch)
a) Vorverarbeitung
Alles läuft auf das "Magic Erase" -Prinzip hinaus, dass der Algorithmus für alles "nur funktionieren" soll. Meine naive Lösung hierfür ist eine farbbasierte Verstärkung (siehe oben), aber es gibt bessere Möglichkeiten. Ich denke daran, das geometrische Mittel aller verfolgbaren Texel zu erkennen, um die Fenstergröße automatisch anzupassen und die Stempelgröße (auch meine Verbesserung) von der Texel- und Gesamtbildauflösung abhängig zu machen . Hier muss geforscht werden.
b) Nachbearbeitung
Die ursprünglichen Autoren haben bereits großartige Arbeit geleistet, um alle in Betracht kommenden Nachbearbeitungsfilter zu entlarven. Heute habe ich etwas anderes ausprobiert, inspiriert von der immer unheimlichen Mona Lisa (danke undergroundmonorail). Wenn Sie nur den unbemalten Bereich nehmen und eine neue Maske auf alle seltsamen Farbblöcke anwenden und diese in einen Despeckling-Algorithmus einspeisen, erhalten Sie ein nahezu perfektes Ergebnis. Ich werde das vielleicht irgendwann in Zukunft untersuchen.
[X] - Objektentfernung durch exemplarisches Bemalen von A. Criminisi, P. Perez, K. Toyama
[1] - M. Ashikhmin. Natürliche Texturen synthetisieren. In Proc. ACM Symp. on Interactive 3D Graphics, S. 217–226, Research Triangle Park, NC, März 2001.
[5] - M. Bertalmio, L. Vese, G. Sapiro und S. Osher. Gleichzeitiges Struktur- und Texturbild-Inpainting. Erscheinen, 2002
[6] - R. Bornard, E. Lecan, L. Laborelli und JH. Chenot. Fehlende Datenkorrektur in Standbildern und Bildsequenzen. In ACM Multimedia, Frankreich, Dezember 2002.
[7] - TF Chan und J. Shen. Nicht-Textur-Inpainting durch krümmungsgetriebene Diffusionen (CDD). J. Visual Comm. Image Rep., 4 (12), 2001.
[8] - JS de Bonet. Multiresolution-Sampling-Verfahren zur Analyse und Synthese von Texturbildern. In Proc. ACM Conf. Comp. Graphics (SIGGRAPH), Band 31, S. 361–368, 1997.
[9] - A. Efros und WT Freeman. Bildquilten zur Textur Synthese und Übertragung. In Proc. ACM Conf. Comp. Graphics (SIGGRAPH), S. 341–346, Eugene Fiume, August 2001.
[10] - A. Efros und T. Leung. Textursynthese durch nicht parametrisches Sampling. In Proc. ICCV, S. 1033–1038, Kerkyra, Griechenland, September 1999.
[11] - WT Freeman, EC Pasztor und OT Carmichael. Low Level Vision lernen. Int. J. Computer Vision, 40 (1): 25–47, 2000.
[12] - D. Garber. Computermodelle für die Texturanalyse und -synthese. Doktorarbeit, Univ. von Südkalifornien, USA, 1981.
[13] - P. Harrison. Ein nicht hierarchisches Verfahren zur Neusynthese komplexer Texturen. In Proc. Int. Conf. Central Europe Comp. Grafik, Visua. und Comp. Vision, Pilsen, Tschechische Republik, Februar 2001.
[14] - DJ Heeger und JR Bergen. Pyramidenbasierte Texturanalyse / -synthese. In Proc. ACM Conf. Comp. Graphics (SIGGRAPH), Band 29, S. 229–233, Los Angeles, CA, 1995.
[15] - A. Hertzmann, C. Jacobs, N. Oliver, B. Curless und D. Salesin. Bildanalogien. In Proc. ACM Conf. Comp. Graphics (SIGGRAPH), Eugene Fiume, August 2001.
[16] - H. Igehy und L. Pereira. Bildersetzung durch Textur-Synthese. In Proc. Int. Conf. Image Processing, S. III: 186–190, 1997.
[17] - G. Kanizsa. Organisation in Vision. Praeger, New York, 1979.
[19] - L. Liang, C. Liu, Y.-Q. Xu, B. Guo und H.-Y. Shum. Echtzeit-Textur-Synthese durch patchbasiertes Sampling. In ACM Transactions on Graphics, 2001.
[22] - L.-W. Wey und M. Levoy. Schnelle Textursynthese mit baumstrukturierter Vektorquantisierung. In Proc. ACM Conf. Comp. Graphics (SIGGRAPH), 2000.
[23] - A. Zalesny, V. Ferrari, G. Caenen und L. van Gool. Parallele Komposittextursynthese. In Texture 2002 Workshop - (in Verbindung mit ECCV02), Kopenhagen, Dänemark, Juni 2002.
[24] - AkurKumar Patel, Gujarat Technological University, Informatik und Ingenieurwesen
[25] - Verbesserter robuster Algorithmus für exemplarisches Inpainting von Bildern
[26] - Wikipedia, Spitzen-Signal-Rausch-Verhältnis
quelle
Matlab
Dies ist ein einfacher Interpolationsansatz. Die Idee besteht darin, zunächst zu spiegeln, was sich auf jeder Seite des Patches befindet. Dann werden diese Spiegelbildpixel interpoliert, um wie weit sie von der entsprechenden Kante entfernt sind:
Der knifflige Teil bestand darin, schöne Interpolationsgewichte zu finden. Nach einigem Herumspielen habe ich eine rationale Funktion gefunden, die an allen Kanten Null ist, mit Ausnahme derjenigen, an der wir gespiegelt haben. Dies wird dann zur Glättung durch ein Polynom dritten Grades transformiert:
Dieser einfache Ansatz eignet sich überraschend gut für "natürliche" Bilder, aber sobald Sie mit scharfen Kanten konfrontiert werden, ist das Spiel vorbei. Im Beispiel der amerikanischen Gotik stimmen die Spitzen der Heugabel gut mit dem Pixelraster überein, wodurch es recht schön aussieht, aber sonst wäre es viel schlimmer gewesen.
Also hier die Ergebnisse:
Und zum Schluss der Code:
quelle
Mathematica
Dies nutzt die
Inpaint
Funktion von Mathematica . Da Mathematica selbst das ganze schwere Heben übernimmt, ist dies ein Community-Wiki.inPaint
(unten) ist eine einfache Anpassung vonInpaint
. Für farbige Gemälde / Fotos wird die Standardeinstellung "TextureSynthesis" verwendet. Wenn festgestellt wird, dass das Bild schwarzweiß ist (da die Bilddaten des Bildes mit den Bilddaten der Binärform des Bildes identisch sind), wird das Bild binarisiert und der Patch "TotalVariation" angewendet. DieIf
Klausel gilt entweder für das BildBinarize
oderIdentity
für das Bild. (DieIdentity
Funktion gibt ihr Argument unverändert zurück.)Das Bild und die Maske werden als Argumente für eingegeben
inPaint
.Partition
undGrid
dienen lediglich Formatierungszwecken.Die Ausgänge wurden gepatcht. Es gab keine Retusche der Bilder danach
inPaint
.quelle
Inpaint
scheint auf Symmetrien über das gesamte Schwarz-Weiß-Bild zu achten. - DavidC vor 9 StundenPython 2 und PIL
Mit diesem Programm werden Kopien der Regionen Nord, Süd, Ost und West gemischt, um Ersatzpixel zu erstellen, die Farben, Texturen und Schattierungen aus der lokalen Bildregion verwenden.
Das Beispiel gibt Folgendes aus:
Der Code findet zuerst den Begrenzungsrahmen für das Patch. Dann berechnet es für jedes zu erzeugende Pixel die Farbe jedes Kanals (RGB) basierend auf der gewichteten Summe der 4 umgebenden Regionen.
quelle
Python 3, PIL
Dieses Programm verwendet den Sobel-Operator und zeichnet darauf basierend Linien auf das Bild.
Der Sobel-Operator ermittelt den Winkel jeder Kante, sodass alle Kanten, die in den unbekannten Bereich hineinragen, fortgesetzt werden sollten.
In der Zwischenzeit sind hier die Beispielbilder.
Mona Lisa Mona Lisa Ḿ͠oḾ͠a ̾̇Lisa Ḿ͠o̢̎̓̀ǹ̰͎̣a̢̎̓̀ǹ̰͎̣ ̣̖̠̮̘̹̠̾̇ͣLisa Ḿ̳̜͇͓͠oḾ̳̜͇͓͠a̢̎̓̀ǹ̰͎̣͙ ̣̖̠̮̘̹̠̾̇ͣḶ̖̠̮̘̹̠̾̇ͣi͉̻̭͌ş̠͔̏̋̀ạ̫͕͎ͨͮͪ̐͡ͅ
Der Bereich im obigen Bild ist glatt wie ein Kaktus
Es ist nicht sehr gut mit konstanter Farbe.
quelle
Python 2
Einfaches Python-Skript, das Patches mithilfe von Werten aus Pixeln außerhalb der Lücke erstellt. Es nimmt Farbwerte vom Ende der Pixelzeile und -spalte und berechnet den gewichteten Durchschnitt anhand des Abstands von diesen Pixeln.
Output ist nicht so hübsch, aber es ist Kunst .
Und dann Code:
quelle
Mathematica
Es ist einfach so, dass Mathematica eine eingebaute Funktion hat, die genau diese Aufgabe erfüllt, und ich meine genau :
Standardmäßig wird eine "Best-Fit-Textur-Synthesemethode unter Verwendung von Zufallsstichproben" verwendet, die auf den Gemälden gute Ergebnisse liefert, für das Labyrinth und das Schachbrett jedoch schlechte Ergebnisse:
Das Herumspielen mit den Einstellungen hat mir nicht bei allen Bildern zu einer Qualitätssteigerung geführt, daher habe ich nur die Standardeinstellungen verwendet (um Bytes zu sparen - das ist
codegolf.se
immerhin!).quelle
Binarize
(um graue Flecken zu beseitigen) zu verwenden. Versuchen Siemethods = {"TextureSynthesis", "Diffusion", "FastMarching", "NavierStokes", "TotalVariation"};g[pic_, mask_] := Join[{Labeled[Framed@pic, "Original"]}, Labeled[ Binarize@Inpaint[pic, mask, Method -> #], #] & /@ methods]
TextureSynthesis
sieht aber nur auf den Gemälden gut aus. und ich glaube nicht, dass wir unsere Einstellungen für jeden einzelnen Testfall anpassen dürfen. (Wenn wir könnten, dann könnten wir den fehlenden Teil trivial als "Einstellung"inPaint[picture_, mask_] := If[bw = ImageData@Rasterize[Binarize[picture]] == ImageData[picture], Binarize, Identity]@ Inpaint[picture, mask, Method -> If[bw, "TotalVariation", "TextureSynthesis"]]
Python3
Diese Antwort setzt die Idee in der Arbeit "Deep Image Prior" um von Ulyanov et al. (CVPR 2018) In diesem Artikel untersuchten sie die Idee, dass die Art und Weise, in der gut funktionierende neuronale Netze für die Bildverarbeitung entworfen werden, genau unserer Vorstellung entspricht, wie ein natürliches Bild aussehen sollte (die "vorherige" Verteilung).
Sie schlugen eine Methode vor, die zum Aufmalen sowie zum Entfernen von Rauschen und Artefakten verwendet werden kann und bei der nur das angegebene Bild ohne Training für andere Daten verwendet wird. Das eigentliche Konzept ist recht einfach: Das Netz wird darauf trainiert, das gewünschte Bild (für ein bestimmtes zufälliges Rauschen als Eingabe) auszugeben, indem nur die Fehler außerhalb einer bestimmten Maske bestraft werden. Wenn Sie Störgeräusche entfernen möchten, brauchen Sie nichts zu maskieren, sondern müssen nur zu Beginn des Trainings aufhören.
Zum Übermalen maskieren Sie den Teil, den Sie übermalen und trainieren möchten, bis zur Konvergenz. Es ist sicherlich nicht auf dem neuesten Stand der Technik, aber ich wollte es dennoch veröffentlichen, um es zu versuchen und hier zu veröffentlichen, aufgrund der Einfachheit der Idee und der immer noch bemerkenswerten Leistung. In meinen Experimenten hat sich das Inpainting größerer Patches nicht so gut bewährt, aber für kleinere Segmente können die Ergebnisse viel überzeugender sein.
Ich habe dies mit der beliebten U-Net-Architektur von jaxony on github implementiert . Den Code zum Trainieren und Verarbeiten der Bilder finden Sie unten.
Ausbildung
Dies ist eine Visualisierung des Trainingsprozesses. Jeder Frame enthält eine bestimmte Anzahl von Iterationen:
Beispiele
Code
Beachten Sie, dass es auf einer CPU Stunden dauern kann, bis nur ein einzelnes Image ausgeführt wird, während eine gute cuda-fähige GPU viel weniger Zeit in Anspruch nimmt.
quelle
Python mit OpenCV
OpenCV hat eine Funktion namens Inpaint. Es gibt zwei Arten von Inpainting, ich werde die Fast Marching-Methode verwenden. Der Algorithmus funktioniert laut Dokumentation folgendermaßen:
Hier ist der Code *:
Beachten Sie, wie ich die BGR aus Plotgründen in RGB konvertiere. Auch ich drehe es. Hier sind die Ergebnisse:
Mona Lisa kehrt zurück!
Wie Sie sehen können, ist es nicht das beste mit den zwei Farben.
quelle
Java
Ein Ansatz zur Farbmittelung. Kann wohl verbessert werden.
Ergebnisse:
quelle