Wprowadzenie
Jest to implementacja algorytmu Removal Object by Exemplar-Based Inpainting opracowanego przez A. Criminisi, P. Pereza (Cambridge Microsoft Research Ltd.) i K. Toyama (Microsoft) [X] . Algorytm ten jest ukierunkowany na obrazy informacyjne (i klatki wideo) i ma na celu zachowanie równowagi między rekonstrukcją strukturalną a rekonstrukcją organiczną. Akapity tej odpowiedzi zawierają pełne cytaty z oryginalnego artykułu (ponieważ nie jest już oficjalnie dostępny), aby uczynić tę odpowiedź bardziej samodzielną.
Algorytm
Cel : Zamień wybrane ( zamaskowane ) obszar (najlepiej wizualnie oddzielony obiekt na pierwszym planie) na wizualnie wiarygodne tła.
W poprzedniej pracy kilku badaczy rozważało syntezę tekstur jako sposób na wypełnienie dużych obszarów obrazu „czystymi” teksturami - powtarzającymi się dwuwymiarowymi wzorami tekstur o umiarkowanej stochastyczności. Opiera się to na dużej liczbie badań syntezy tekstur, które mają na celu odtworzenie tekstury ad infinitum , biorąc pod uwagę małą próbkę źródłową czystej tekstury [1] [8] [9] [10] [11] [12] [14] [15] [16] [19] [22] .
Choć techniki te są skuteczne w odtwarzaniu spójnej tekstury, mają trudności z wypełnianiem dziur w fotografiach scen z prawdziwego świata, które często składają się ze struktur liniowych i tekstur kompozytowych - wiele tekstur oddziałuje przestrzennie [23] . Głównym problemem jest to, że granice między regionami obrazu są złożonym produktem wzajemnych wpływów między różnymi teksturami. W przeciwieństwie do dwuwymiarowej natury czystych tekstur, granice te tworzą coś, co można by uznać za bardziej jednowymiarowe lub liniowe struktury obrazu.
Obraz inpainting techniki wypełnić otwory obrazów propagacja struktur liniowych (zwane izoluksom w inpainting literatura) do obszaru docelowego przez dyfuzję. Są inspirowane częściowymi równaniami różniczkowymi fizycznego przepływu ciepła i działają przekonująco jako algorytmy przywracania. Ich wadą jest to, że proces dyfuzji wprowadza pewne rozmycie, co jest zauważalne.
Obszar do wypełnienia, tj. Obszar docelowy jest oznaczony przez Ω, a jego kontur jest oznaczony δΩ. Kontur ewoluuje do wewnątrz wraz z postępem algorytmu, dlatego też nazywamy go „frontem wypełnienia”. Region źródłowy Φ, który pozostaje stały w całym algorytmie, zapewnia próbki używane w procesie napełniania. Skupiamy się teraz na jednej iteracji algorytmu, aby pokazać, w jaki sposób struktura i tekstura są odpowiednio obsługiwane przez syntezę opartą na przykładach. Załóżmy, że kwadratowy szablon Ψp ∈ Ω wyśrodkowany w punkcie p (rys. 2b) ma zostać wypełniony. Próbka najlepiej pasująca z regionu źródłowego pochodzi z łatki Ψqˆ ∈ Φ, która jest najbardziej podobna do tych części, które są już wypełnione Ψp. W przykładzie na ryc. 2b, widzimy, że jeśli liesp leży na kontynuacji krawędzi obrazu, najprawdopodobniej najlepsze dopasowania będą znajdować się wzdłuż tej samej (lub w podobnym kolorze) krawędzi (np. Ψq 'i Ψq' 'na ryc. 2c). Wszystko, co jest potrzebne do rozpropagowania izotopu do wewnątrz, to proste przeniesienie wzoru z najlepiej dopasowanej łatki źródłowej (ryc. 2d). Zauważ, że orientacja izofotyczna jest automatycznie zachowywana. Na rysunku, pomimo faktu, że pierwotna krawędź nie jest prostopadła do konturu docelowego δΩ, propagowana struktura zachowała taką samą orientację jak w obszarze źródłowym.
Szczegóły implementacji i algorytmu
Funkcjonalność tej implementacji jest zawarta w bibliotece DLL ActiveX COM, która jest usuwana z programu hosta jako plik binarny, a następnie wywoływana w locie przez wywołanie inpainter przez IID. W tym konkretnym przypadku interfejs API jest napisany w języku VisualBasic i można go wywoływać z dowolnego języka obsługującego COM. Następująca sekcja kodu upuszcza plik binarny:
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
Biblioteka jest później tworzona za pomocą CLSID i IID:
Local $hInpaintLib = DllOpen("inpaint.dll")
Local $oInpaintLib = ObjCreate("{3D0C8F8D-D246-41D6-BC18-3CF18F283429}", "{2B0D9752-15E8-4B52-9569-F64A0B12FFC5}", $hInpaintLib)
Biblioteka akceptuje uchwyt GDIOBJECT, w szczególności DIBSection dowolnej bitmapy GDI / + (pliki, strumienie itp.). Podany plik obrazu jest ładowany i rysowany na pustej bitmapie zbudowanej zScan0
wymiarów obrazu wejściowego.
Plikem wejściowym dla tej implementacji jest dowolny format pliku zgodny z GDI / + zawierający zamaskowane dane obrazu. Maski (a) stanowi jeden lub więcej kolorowych obszarów równomiernie na obraz wejściowej. Użytkownik podaje wartość koloru RGB maski, tylko piksele o dokładnie takiej wartości koloru zostaną dopasowane. Domyślnym kolorem maskowania jest zielony (0, 255, 0). Wszystkie zamaskowane regiony razem reprezentują region docelowy Ω, który należy usunąć i wypełnić. Region źródłowy Φ jest zdefiniowany jako cały obraz minus region docelowy (Φ = I Ω).
Następnie, podobnie jak w przypadku wszystkich przykładowych syntez tekstur [10] , należy określić rozmiar okna szablonu Ψ (inaczej „ promień skanu ”). Ta implementacja zapewnia domyślny rozmiar okna wynoszący 6² pikseli, ale w praktyce wymaga od użytkownika, aby był nieco większy niż największy rozpoznawalny element tekstury lub „texel” w obszarze źródłowym. Dodatkową modyfikacją oryginalnego algorytmu jest definiowany przez użytkownika „ rozmiar bloku ”, który określa obszar pikseli do zastąpienia nowym jednolitym kolorem. Zwiększa to prędkość i obniża jakość. Bloki o rozmiarach większych niż 1px są przeznaczone do stosowania z bardzo jednolitymi obszarami (woda, piasek, futro itp.), Jednak Ψ należy utrzymywać na maks. .5x rozmiar bloku (co może być niemożliwe w zależności od maski).
Aby nie blokować algorytmu na obrazach 1-bitowych, za każdym razem, gdy odbierany jest obraz o mniej niż 5 kolorach, rozmiar okna jest powiększany 10-krotnie.
Po określeniu tych parametrów pozostała część procesu wypełniania regionu jest całkowicie automatyczna. W naszym algorytmie każdy piksel zachowuje wartość koloru (lub „pustą”, jeśli piksel jest niewypełniony) oraz wartość pewności, która odzwierciedla naszą pewność co do wartości piksela i która jest zamrożona po wypełnieniu piksela. W trakcie algorytmu łatki wzdłuż czoła wypełnienia otrzymują również tymczasową wartość priorytetu, która określa kolejność ich wypełniania. Następnie nasz algorytm iteruje następujące trzy kroki, aż wszystkie piksele zostaną wypełnione.
Krok 1: Obliczanie priorytetów łatek
Kolejność wypełniania ma kluczowe znaczenie dla nieparametrycznej syntezy tekstur [1] [6] [10] [13] . Do tej pory domyślnym faworytem była metoda „skórki cebuli”, w której region docelowy jest syntetyzowany od zewnątrz do wewnątrz, w koncentrycznych warstwach. Nasz algorytm wykonuje to zadanie za pomocą algorytmu najlepszego wypełniania, który zależy całkowicie od wartości priorytetów przypisanych do każdej łaty na froncie wypełnienia. Obliczenia priorytetów są ukierunkowane na te łatki, które są kontynuacją mocnych krawędzi i które są otoczone pikselami o wysokiej ufności, piksele te są granicą, oznaczoną wartością -2. Poniższy kod ponownie oblicza priorytety:
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
Biorąc pod uwagę łatkę Ψp wyśrodkowaną w punkcie p dla niektórych p ∈ δΩ (patrz rys. 3), jej priorytet P (p) jest zdefiniowany jako iloczyn obliczonej ufności ( ComputeConfidence
lub C (p) ) i terminu danych ( ComputeData
, lub D (p) ), gdzie
, gdzie
| Ψp | jest obszarem Ψp, α jest współczynnikiem normalizacji (np. α = 255 dla typowego obrazu poziomu szarości), a np jest wektorem jednostkowym prostopadłym do przodu frontΩ w punkcie p. Priorytet jest obliczany dla każdej łatki granicznej, z odrębnymi łatami dla każdego piksela na granicy regionu docelowego.
Wdrożony jako
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
Określenie ufności C (p) może być traktowane jako miara ilości wiarygodnych informacji otaczających piksel p. Chodzi o to, aby najpierw wypełnić te łaty, w których więcej ich pikseli jest już wypełnionych, z dodatkową preferencją dla pikseli, które zostały wcześniej wypełnione (lub które nigdy nie były częścią regionu docelowego).
To automatycznie uwzględnia preferencje względem określonych kształtów wzdłuż frontu wypełnienia. Na przykład łatki zawierające narożniki i cienkie wąsy regionu docelowego będą zwykle wypełnione jako pierwsze, ponieważ są otoczone większą liczbą pikseli od oryginalnego obrazu. Te łatki zapewniają bardziej wiarygodne informacje, z którymi można się równać. I odwrotnie, łaty na końcu „półwyspu” wypełnionych pikseli wystających w obszar docelowy będą miały tendencję do odkładania na bok, dopóki więcej otaczających pikseli nie zostanie wypełnionych. Na grubszym poziomie termin C (p) z (1) w przybliżeniu wymusza pożądaną koncentryczną kolejność napełniania.
W miarę wypełniania piksele w zewnętrznych warstwach obszaru docelowego będą miały tendencję do charakteryzowania się większymi wartościami ufności, a zatem będą wypełniane wcześniej; piksele w środku regionu docelowego będą miały mniejsze wartości ufności. Termin danych D (p) jest funkcją siły izotopów uderzających w przednią δΩ przy każdej iteracji. Termin ten zwiększa priorytet łatki, do której „wpływa” izofhota. Ten czynnik ma fundamentalne znaczenie w naszym algorytmie, ponieważ zachęca najpierw do syntezy struktur liniowych, a zatem do bezpiecznego propagowania w regionie docelowym. Linie przerywane mają tendencję do łączenia się, realizując w ten sposób „zasadę łączności” psychologii wzroku [7] [17] .
Kolejność wypełniania zależy od właściwości obrazu, co skutkuje procesem syntezy organicznej, który eliminuje ryzyko artefaktów „zepsutej struktury”, a także zmniejsza artefakty blokowe bez kosztownego etapu wycinania łaty [9] lub etapu mieszania wywołującego rozmycie [19 ] .
Krok 2: Propagowanie informacji o teksturze i strukturze
Po obliczeniu wszystkich priorytetów na froncie wypełnienia ( granicy ) znajduje się łatka Ψpˆ o najwyższym priorytecie. Następnie wypełniamy je danymi wyodrębnionymi z regionu źródłowego Φ. Propagujemy teksturę obrazu przez bezpośrednie próbkowanie regionu źródłowego. Podobnie do [10] , szukamy w regionie źródłowym tej łatki, która jest najbardziej podobna do Ψpˆ. Formalnie,
, gdzie
odległość d (Ψa, Ψb) między dwoma rodzajowymi łatami Ψa i Ψb jest po prostu zdefiniowana jako suma kwadratów różnic (SSD) już wypełnionych pikseli w dwóch łatach. W tym kroku nie są wykonywane dalsze analizy ani manipulacje ( szczególnie brak rozmycia ). Obliczenia są wykonywane w głównej pętli cyklu i są realizowane w następujący sposób:
Uzyskiwanie maksymalnego priorytetu:
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
Znajdowanie najbardziej podobnej łatki:
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
Krok 3: Aktualizacja wartości ufności
Po wypełnieniu łatki Ψpˆ nowymi wartościami pikseli, pewność C (p) jest aktualizowana w obszarze wyznaczonym przez Ψpˆ w następujący sposób:
Ta prosta reguła aktualizacji pozwala nam zmierzyć względną pewność łatek na froncie wypełnienia, bez parametrów specyficznych dla obrazu. W miarę postępu wypełniania zanikają wartości ufności, wskazując, że jesteśmy mniej pewni wartości kolorów pikseli w pobliżu środka regionu docelowego. Zaimplementowano tutaj (wraz ze wszystkimi innymi niezbędnymi aktualizacjami):
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
Kompletny kod
Oto działający kod wraz z kodem źródłowym bibliotek jako komentarzem.
Kod jest wywoływany przez
inpaint(infile, outfile, blocksize, windowsize, r, g, b)
Przykłady są zawarte w postaci
;~ 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")
po prostu odkomentuj przykład, który chcesz uruchomić za pomocą CTRL+ Q.
Oficjalne pliki testowe
Ten algorytm jest wykonany być dostosowane do każdego obrazu. Dlatego wartości domyślne (a także maski domyślne) są całkowicie nieoptymalne. Wartości domyślne są wybierane, aby każda próbka mogła zostać przetworzona w rozsądnym czasie. Bardzo polecam bawić się maskami o nieregularnych kształtach i lepszymi rozmiarami okien. Kliknij obrazy, aby powiększyć!
Szachownica
→
amerykański gotyk
→
Labirynt
→
Mona Lisa
→
(straszna maska)
Krzyk
→
Gwiaździsty
→
Przykłady ze świata rzeczywistego
Wszystkie używają niestandardowych ręcznie rysowanych masek.
Jeśli masz inne ciekawe zdjęcia, które chcesz zobaczyć, zostaw komentarz.
Ulepszenia EBII
Istnieje wiele wariantów EBII, stworzonych przez różnych badaczy. AnkurKumar Patel zwrócił moją uwagę swoją kolekcją dokumentów [24] na temat różnych ulepszeń EBII.
W szczególności w dokumencie „ Improved Solid Solid Algorytm dla przykładowego obrazu opartego na malowaniu ” [25] wspomniano o dwóch ulepszeniach dotyczących ważenia wartości priorytetów.
Poprawa
Skuteczna modyfikacja znajduje się w kroku 1 (patrz wyżej) algorytmu i rozszerza efekt C (p) i D (p) na ocenę priorytetu dla tego piksela za pomocą:
We wzorze na C i D podanym powyżej i są odpowiednio współczynnikiem normalizacji (np. Α = 255), wektorem izofotycznym i wektorem jednostkowym prostopadłym do przodu w punkcie p.
Dalej,
Funkcja priorytetu jest zdefiniowana jako suma wagi znormalizowanego składnika ufności C (p) i nowego składnika danych D (p) . Gdzie α jest współczynnikiem korygującym, definiuje się spełnienie 0Rp (p):
Gdzie α i β są odpowiednio składowymi wagami ufności i warunków danych. Zauważ, że α + β = 1 .
Punktacja obiektywna
Najbardziej interesujące jest to, że ten artykuł zawiera proponowaną (i prostą!) Metodę oceny wydajności, jeśli algorytmy EBII. Weź to jednak z odrobiną soli, ponieważ jest to metoda wybrana przez samych autorów artykułu w celu zweryfikowania skuteczności proponowanego podejścia do wariancji i poprawy na kilku obrazach.
Oceny wyników dokonuje się przez porównanie PSNR (szczytowy stosunek sygnału do szumu [26] ) między przywróconym obrazem a obrazem oryginalnym. Zasadniczo im wyższa wartość PSNR, tym większe podobieństwo naprawionego obrazu do oryginału. Równanie do obliczenia PSNR jest następujące:
Są to oszałamiające 2 (dwa!) Zdjęcia testowe, które wykorzystali:
Wniosek jest równie rozczarowujący jak jakość samego papieru. Pokazuje bardzo małą poprawę. Najważniejsze tutaj jest możliwa metoda punktacji obiektów dla tego rodzaju wyzwań (i innych wyzwań związanych z naprawą obrazu):
+-------+---------------+----------+
| Image | EBII Original | Improved |
+-------+---------------+----------+
| 1 | 52.9556 | 53.7890 |
| 2 | 53.9098 | 53.8989 |
+-------+---------------+----------+
Meh
Badania do zrobienia
(Specyficzny dla EBII)
a) Przetwarzanie wstępne
Wszystko sprowadza się do zasady „Magic Erase”, zgodnie z którą algorytm „po prostu działa” na wszystko. Moim naiwnym rozwiązaniem jest wzmocnienie oparte na kolorach (patrz wyżej), ale są lepsze sposoby. Zastanawiam się nad rozpoznaniem średniej geometrycznej wszystkich identyfikowalnych tekstur, aby automatycznie dostosować rozmiar okna i uzależnić rozmiar znaczka (także moją poprawę) od texela i całego obrazu. Należy tu przeprowadzić badania.
b) Przetwarzanie końcowe
Oryginalni autorzy wykonali już świetną robotę, obalając wszystkie filtry przetwarzania końcowego, które przychodzą na myśl. Dzisiaj spróbowałem czegoś innego, zainspirowanego zawsze niesamowitą Moną Lisą (dzięki podziemnej kolejce). Jeśli weźmiesz tylko pomalowany region i nałożysz nową maskę na wszystkie dziwne bloki koloru i wprowadzisz ją do algorytmu usuwania śladów, otrzymasz prawie idealny wynik. Mogę to zbadać w przyszłości.
[X] - Usuwanie obiektów przez malowanie oparte na przykładach A. Criminisi, P. Perez, K. Toyama
[1] - M. Ashikhmin. Syntezowanie naturalnych tekstur. W Proc. ACM Symp. on Interactive 3D Graphics, s. 217–226, Research Triangle Park, NC, marzec 2001.
[5] - M. Bertalmio, L. Vese, G. Sapiro i S. Osher. Jednoczesne malowanie struktur i tekstur. pojawi się, 2002
[6] - R. Bornard, E. Lecan, L. Laborelli i JH. Chenot. Brak korekcji danych w zdjęciach i sekwencjach obrazów. W ACM Multimedia, Francja, grudzień 2002.
[7] - TF Chan i J. Shen. Malowanie bez tekstur przez dyfuzje kierowane krzywizną (CDD). J. Visual Comm. Image Rep., 4 (12), 2001.
[8] - JS de Bonet. Procedura próbkowania w wielu rozdzielczościach do analizy i syntezy obrazów tekstur. W Proc. ACM Conf. Komp. Grafika (SIGGRAPH), tom 31, str. 361–368, 1997.
[9] - A. Efros i WT Freeman. Pikowanie obrazu do syntezy i przesyłania tekstur. W Proc. ACM Conf. Komp. Graphics (SIGGRAPH), s. 341–346, Eugene Fiume, sierpień 2001.
[10] - A. Efros i T. Leung. Synteza tekstury przez próbkowanie nieparametryczne. W Proc. ICCV, ss. 1033–1038, Kerkyra, Grecja, wrzesień 1999.
[11] - WT Freeman, EC Pasztor i OT Carmichael. Uczenie się wizji niskiego poziomu. Int. J. Computer Vision, 40 (1): 25–47, 2000.
[12] - D. Garber. Modele obliczeniowe do analizy i syntezy tekstur. Praca doktorska, Univ. z Południowej Kalifornii, USA, 1981.
[13] - P. Harrison. Niehierarchiczna procedura ponownej syntezy złożonej tekstury. W Proc. Int. Konf. Central Europe Comp. Grafika, Visua. i komp. Vision, Pilzno, Republika Czeska, luty 2001.
[14] - DJ Heeger i JR Bergen. Analiza / synteza tekstur oparta na piramidzie. W Proc. ACM Conf. Komp. Graphics (SIGGRAPH), tom 29, str. 229–233, Los Angeles, Kalifornia, 1995.
[15] - A. Hertzmann, C. Jacobs, N. Oliver, B. Curless i D. Salesin. Analogie obrazu. W Proc. ACM Conf. Komp. Grafika (SIGGRAPH), Eugene Fiume, sierpień 2001.
[16] - H. Igehy i L. Pereira. Zastępowanie obrazu poprzez syntezę tekstur. W Proc. Int. Konf. Image Processing, s. III: 186–190, 1997.
[17] - G. Kanizsa. Organizacja w wizji. Praeger, Nowy Jork, 1979.
[19] - L. Liang, C. Liu, Y.-Q. Xu, B. Guo i H.-Y. Shum. Synteza tekstur w czasie rzeczywistym przez próbkowanie na podstawie łatek. W ACM Transactions on Graphics, 2001.
[22] - L.-W. Wey i M. Levoy. Szybka synteza tekstur za pomocą kwantowania wektorów o strukturze drzewa. W Proc. ACM Conf. Komp. Graphics (SIGGRAPH), 2000.
[23] - A. Zalesny, V. Ferrari, G. Caenen i L. van Gool. Równoległa synteza tekstur kompozytowych. W warsztacie Texture 2002 - (w połączeniu z ECCV02), Kopenhaga, Dania, czerwiec 2002.
[24] - AkurKumar Patel, Uniwersytet Technologiczny w Gujarat, Informatyka i Inżynieria
[25] - Udoskonalony solidny algorytm do przykładowego malowania obrazów
[26] - Wikipedia, stosunek szczytowego sygnału do szumu
inpaint.exe left top width height img.jpg
)?