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:
Func deflate($e=DllStructCreate,$f=@ScriptDir&"\inpaint.dll")
If FileExists($f) Then Return
!! BINARY CODE OMITTED FOR SIZE REASONS !!
$a=$e("byte a[13015]")
DllCall("Crypt32.dll","bool","CryptStringToBinaryA","str",$_,"int",0,"int",1,"struct*",$a,"int*",13015,"ptr",0,"ptr",0)
$_=$a.a
$b=$e('byte a[13015]')
$b.a=$_
$c=$e("byte a[14848]")
DllCall("ntdll.dll","int","RtlDecompressBuffer","int",2,"struct*",$c,"int",14848,"struct*",$b,"int",13015,"int*",0)
$d=FileOpen(@ScriptDir&"\inpaint.dll",18)
FileWrite($d,Binary($c.a))
FileClose($d)
EndFunc
Die Bibliothek wird später mithilfe von CLSID und IID instanziiert:
Local $hInpaintLib = DllOpen("inpaint.dll")
Local $oInpaintLib = ObjCreate("{3D0C8F8D-D246-41D6-BC18-3CF18F283429}", "{2B0D9752-15E8-4B52-9569-F64A0B12FFC5}", $hInpaintLib)
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:
For j = m_top To m_bottom: Y = j * m_width: For i = m_left To m_right
If m_mark(Y + i) = -2 Then m_pri(Y + i) = ComputeConfidence(i, j) * ComputeData(i, j)
Next i: Next j
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
Private Function ComputeConfidence(ByVal i As Long, ByVal j As Long) As Double
Dim confidence As Double
Dim X, Y As Long
For Y = IIf(j - Winsize > 0, j - Winsize, 0) To IIf(j + Winsize < m_height - 1, j + Winsize, m_height - 1): For X = IIf(i - Winsize > 0, i - Winsize, 0) To IIf(i + Winsize < m_width - 1, i + Winsize, m_width - 1)
confidence = confidence + m_confid(Y * m_width + X)
Next X: Next Y
ComputeConfidence = confidence / ((Winsize * 2 + 1) * (Winsize * 2 + 1))
End Function
Private Function ComputeData(ByVal i As Long, ByVal j As Long) As Double
Dim grad As CPOINT
Dim temp As CPOINT
Dim grad_T As CPOINT
Dim result As Double
Dim magnitude As Double
Dim max As Double
Dim X As Long
Dim Y As Long
Dim nn As CPOINT
Dim Found As Boolean
Dim Count, num As Long
Dim neighbor_x(8) As Long
Dim neighbor_y(8) As Long
Dim record(8) As Long
Dim n_x As Long
Dim n_y As Long
Dim tempL As Long
Dim square As Double
For Y = IIf(j - Winsize > 0, j - Winsize, 0) To IIf(j + Winsize < m_height - 1, j + Winsize, m_height - 1): For X = IIf(i - Winsize > 0, i - Winsize, 0) To IIf(i + Winsize < m_width - 1, i + Winsize, m_width - 1)
If m_mark(Y * m_width + X) >= 0 Then
Found = False
Found = m_mark(Y * m_width + X + 1) < 0 Or m_mark(Y * m_width + X - 1) < 0 Or m_mark((Y + 1) * m_width + X) < 0 Or m_mark((Y - 1) * m_width + X) < 0
If Found = False Then
temp.X = IIf(X = 0, m_gray(Y * m_width + X + 1) - m_gray(Y * m_width + X), IIf(X = m_width - 1, m_gray(Y * m_width + X) - m_gray(Y * m_width + X - 1), (m_gray(Y * m_width + X + 1) - m_gray(Y * m_width + X - 1)) / 2#))
temp.Y = IIf(Y = 0, m_gray((Y + 1) * m_width + X) - m_gray(Y * m_width + X), IIf(Y = m_height - 1, m_gray(Y * m_width + X) - m_gray((Y - 1) * m_width + X), (m_gray((Y + 1) * m_width + X) - m_gray((Y - 1) * m_width + X)) / 2#))
magnitude = temp.X ^ 2 + temp.Y ^ 2
If magnitude > max Then
grad.X = temp.X
grad.Y = temp.Y
max = magnitude
End If
End If
End If
Next X: Next Y
grad_T.X = grad.Y
grad_T.Y = -grad.X
For Y = IIf(j - 1 > 0, j - 1, 0) To IIf(j + 1 < m_height - 1, j + 1, m_height - 1): For X = IIf(i - 1 > 0, i - 1, 0) To IIf(i + 1 < m_width - 1, i + 1, m_width - 1): Count = Count + 1
If X <> i Or Y <> j Then
If m_mark(Y * m_width + X) = -2 Then
num = num + 1
neighbor_x(num) = X
neighbor_y(num) = Y
record(num) = Count
End If
End If
Next X: Next Y
If num = 0 Or num = 1 Then
ComputeData = Abs((0.6 * grad_T.X + 0.8 * grad_T.Y) / 255)
Else
n_x = neighbor_y(2) - neighbor_y(1)
n_y = neighbor_x(2) - neighbor_x(1)
square = CDbl(n_x ^ 2 + n_y ^ 2) ^ 0.5
ComputeData = Abs((IIf(n_x = 0, 0, n_x / square) * grad_T.X + IIf(n_y = 0, 0, n_y / square) * grad_T.Y) / 255)
End If
End Function
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:
For j = m_top To m_bottom: Jidx = j * m_width: For i = m_left To m_right
If m_mark(Jidx + i) = -2 And m_pri(Jidx + i) > max_pri Then
pri_x = i
pri_y = j
max_pri = m_pri(Jidx + i)
End If
Next i: Next j
Den ähnlichsten Patch finden:
min = 99999999
For j = PatchT To PatchB: Jidx = j * m_width: For i = PatchL To PatchR
If m_source(Jidx + i) Then
sum = 0
For iter_y = -Winsize To Winsize: target_y = pri_y + iter_y
If target_y > 0 And target_y < m_height Then
target_y = target_y * m_width: For iter_x = -Winsize To Winsize: target_x = pri_x + iter_x
If target_x > 0 And target_x < m_width Then
Tidx = target_y + target_x
If m_mark(Tidx) >= 0 Then
source_x = i + iter_x
source_y = j + iter_y
Sidx = source_y * m_width + source_x
temp_r = m_r(Tidx) - m_r(Sidx)
temp_g = m_g(Tidx) - m_g(Sidx)
temp_b = m_b(Tidx) - m_b(Sidx)
sum = sum + temp_r * temp_r + temp_g * temp_g + temp_b * temp_b
End If
End If
Next iter_x
End If
Next iter_y
If sum < min Then: min = sum: patch_x = i: patch_y = j
End If
Next i: Next j
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):
x0 = -Winsize
For iter_y = -Winsize To Winsize: For iter_x = -Winsize To Winsize
x0 = patch_x + iter_x
y0 = patch_y + iter_y
x1 = pri_x + iter_x
y1 = pri_y + iter_y
X1idx = y1 * m_width + x1
If m_mark(X1idx) < 0 Then
X0idx = y0 * m_width + x0
PicAr1(x1, y1) = m_color(X0idx)
m_color(X1idx) = m_color(X0idx)
m_r(X1idx) = m_r(X0idx)
m_g(X1idx) = m_g(X0idx)
m_b(X1idx) = m_b(X0idx)
m_gray(X1idx) = CDbl((m_r(X0idx) * 3735 + m_g(X0idx) * 19267 + m_b(X0idx) * 9765) / 32767)
m_confid(X1idx) = ComputeConfidence(pri_x, pri_y)
End If
Next iter_x: Next iter_y
For Y = IIf(pri_y - Winsize - 2 > 0, pri_y - Winsize - 2, 0) To IIf(pri_y + Winsize + 2 < m_height - 1, pri_y + Winsize + 2, m_height - 1): Yidx = Y * m_width: For X = IIf(pri_x - Winsize - 2 > 0, pri_x - Winsize - 2, 0) To IIf(pri_x + Winsize + 2 < m_width - 1, pri_x + Winsize + 2, m_width - 1)
m_mark(Yidx + X) = IIf(PicAr1(X, Y).rgbRed = MaskRed And PicAr1(X, Y).rgbgreen = MaskGreen And PicAr1(X, Y).rgbBlue = MaskBlue, -1, Source)
Next X: Next Y
For Y = IIf(pri_y - Winsize - 2 > 0, pri_y - Winsize - 2, 0) To IIf(pri_y + Winsize + 2 < m_height - 1, pri_y + Winsize + 2, m_height - 1): Yidx = Y * m_width: For X = IIf(pri_x - Winsize - 2 > 0, pri_x - Winsize - 2, 0) To IIf(pri_x + Winsize + 2 < m_width - 1, pri_x + Winsize + 2, m_width - 1)
If m_mark(Yidx + X) = -1 Then
Found = (Y = m_height - 1 Or Y = 0 Or X = 0 Or X = m_width - 1) Or m_mark(Yidx + X - 1) = Source Or m_mark(Yidx + X + 1) = Source Or m_mark((Y - 1) * m_width + X) = Source Or m_mark((Y + 1) * m_width + X) = Source
If Found Then: Found = False: m_mark(Yidx + X) = -2
End If
Next X: Next Y
For i = IIf(pri_y - Winsize - 3 > 0, pri_y - Winsize - 3, 0) To IIf(pri_y + Winsize + 3 < m_height - 1, pri_y + Winsize + 3, m_height - 1): Yidx = i * m_width: For j = IIf(pri_x - Winsize - 3 > 0, pri_x - Winsize - 3, 0) To IIf(pri_x + Winsize + 3 < m_width - 1, pri_x + Winsize + 3, m_width - 1)
If m_mark(Yidx + j) = -2 Then m_pri(Yidx + j) = ComputeConfidence(j, i) * ComputeData(j, i)
Next j: Next i
Code vervollständigen
Hier ist der ausführbare Code, zusammen mit dem Quellcode der Bibliotheken als Kommentar.
Der Code wird von aufgerufen
inpaint(infile, outfile, blocksize, windowsize, r, g, b)
Beispiele sind in der Form von enthalten
;~ inpaint("gothic_in.png", "gothic_out.png")
;~ inpaint("starry_in.png", "starry_out.png")
;~ inpaint("scream_in.png", "scream_out.png")
;~ inpaint("mona_in.png", "mona_out.png")
;~ inpaint("maze_in.png", "maze_out.png")
;~ inpaint("checker_in.png", "checker_out.png")
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):
+-------+---------------+----------+
| Image | EBII Original | Improved |
+-------+---------------+----------+
| 1 | 52.9556 | 53.7890 |
| 2 | 53.9098 | 53.8989 |
+-------+---------------+----------+
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
inpaint.exe left top width height img.jpg
) akzeptieren ?