introduzione
Questa è un'implementazione dell'algoritmo Inpainting basato su Exemplar-Based Inpainting sviluppato da A. Criminisi, P. Perez (Cambridge Microsoft Research Ltd.) e K. Toyama (Microsoft) [X] . Questo algoritmo è mirato alle immagini ad alta informazione (e ai frame video) e mira ad essere l'equilibrio tra ricostruzione strutturale e ricostruzione organica.I paragrafi di questa risposta contengono citazioni di testo completo dal documento originale (poiché non è più ufficialmente disponibile) per rendere questa risposta più autonoma.
L'algoritmo
Obiettivo : sostituire un selezionato ( mascherato ) (preferibilmente un oggetto in primo piano separato visivamente) con sfondi visivamente plausibili.
In lavori precedenti, diversi ricercatori hanno considerato la sintesi di trame come un modo per riempire grandi aree di immagini con trame "pure" - ripetitivi modelli tessurali bidimensionali con moderata stocastica. Questo si basa su un ampio corpus di ricerche sulla sintesi delle trame, che cerca di replicare la trama all'infinito , dato un piccolo campione di pura trama [1] [8] [9] [10] [11] [12] [14] [15] [16] [19] [22] .
Per quanto efficaci siano queste tecniche nel replicare trame coerenti, hanno difficoltà a riempire buchi nelle fotografie di scene del mondo reale, che spesso consistono in strutture lineari e trame composte - trame multiple che interagiscono spazialmente [23] . Il problema principale è che i confini tra regioni dell'immagine sono un prodotto complesso di influenze reciproche tra diverse trame. Contrariamente alla natura bidimensionale delle trame pure, questi confini formano quelle che potrebbero essere considerate strutture di immagine più monodimensionali o lineari.
Le tecniche di verniciatura delle immagini riempiono i buchi nelle immagini propagando strutture lineari (chiamate isophotes nella letteratura di verniciatura ) nella regione target tramite diffusione. Sono ispirati alle equazioni differenziali parziali del flusso di calore fisico e funzionano in modo convincente come algoritmi di ripristino. Il loro svantaggio è che il processo di diffusione introduce un po 'di sfocatura, che è evidente.
La regione da riempire, ovvero la regione target è indicata da Ω e il suo contorno è indicato con δΩ. Il contorno si evolve verso l'interno man mano che l'algoritmo progredisce e quindi ci riferiamo anche ad esso come "riempimento frontale". La regione di origine, Φ, che rimane fissa in tutto l'algoritmo, fornisce campioni utilizzati nel processo di riempimento. Ci concentriamo ora su una singola iterazione dell'algoritmo per mostrare come la struttura e la trama sono gestite adeguatamente dalla sintesi basata su esempi. Supponiamo che il modello quadrato Ψp ∈ Ω centrato nel punto p (fig. 2b), debba essere riempito. Il campione con la migliore corrispondenza dalla regione di origine proviene dalla patch Ψqˆ ∈ Φ, che è molto simile a quelle parti che sono già state compilate in Ψp. Nell'esempio di fig. 2b, vediamo che se liesp si trova sulla continuazione di un bordo dell'immagine, le migliori corrispondenze più probabili si troveranno lungo lo stesso bordo (o un colore simile) (ad esempio, Ψq 'e Ψq' 'nella figura 2c). Tutto ciò che serve per propagare l'isofoto verso l'interno è un semplice trasferimento del pattern dalla patch sorgente più adatta (fig. 2d). Si noti che l'orientamento isofoto viene automaticamente preservato. Nella figura, nonostante il bordo originale non sia ortogonale al contorno target δΩ, la struttura propagata ha mantenuto lo stesso orientamento della regione di origine.
Dettagli di implementazione e algoritmo
La funzionalità di questa implementazione è incapsulata in una DLL COM ActiveX che viene rilasciata dal programma host come binario e quindi invocata al volo chiamando l'iPainter da IID. In questo caso specifico, l'API è scritta in VisualBasic e può essere chiamata da qualsiasi linguaggio abilitato COM. La seguente sezione del codice elimina il file binario:
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
La libreria viene successivamente istanziata utilizzando CLSID e IID:
Local $hInpaintLib = DllOpen("inpaint.dll")
Local $oInpaintLib = ObjCreate("{3D0C8F8D-D246-41D6-BC18-3CF18F283429}", "{2B0D9752-15E8-4B52-9569-F64A0B12FFC5}", $hInpaintLib)
La libreria accetta un handle GDIOBJECT, in particolare una DIBSection di qualsiasi bitmap GDI / + (file, stream ecc.). Il file di immagine specificato viene caricato e disegnato su una bitmap vuota costruita a partire Scan0
dalle dimensioni dell'immagine di input.
Il file di input per questa implementazione è qualsiasi formato di file compatibile GDI / + contenente dati di immagine mascherati. Le maschere sono una o più regioni di colore uniforme nell'immagine di input. L'utente fornisce un valore di colore RGB per la maschera, solo i pixel con esattamente quel valore di colore verranno abbinati. Il colore di mascheramento predefinito è verde (0, 255, 0). Tutte le regioni mascherate insieme rappresentano la regione target, Ω, da rimuovere e riempire. La regione di origine, Φ, è definita come l'intera immagine meno la regione di destinazione (Φ = I − Ω).
Successivamente, come per tutte le sintesi di texture basate su esempi [10] , è necessario specificare la dimensione della finestra del modello Ψ (nota anche come " raggio di scansione "). Questa implementazione fornisce una dimensione predefinita della finestra di 6² pixel, ma in pratica richiede all'utente di impostarlo in modo che sia leggermente più grande del più grande elemento di trama distinguibile, o "texel", nella regione di origine. Un'ulteriore modifica dell'algoritmo originale è la " dimensione del blocco " definibile dall'utente che determina l'area dei pixel da sostituire con un nuovo colore uniforme. Ciò aumenta la velocità e diminuisce la qualità. Le dimensioni del blocco più grandi di 1px sono pensate per essere utilizzate con aree estremamente uniformi (acqua, sabbia, pelliccia ecc.), Tuttavia, Ψ devono essere mantenute al massimo. .5 volte la dimensione del blocco (che può essere impossibile a seconda della maschera).
Per non bloccare l'algoritmo su immagini a 1 bit, ogni volta che si riceve un'immagine con meno di 5 colori, la dimensione della finestra viene amplificata di 10x.
Una volta determinati questi parametri, il resto del processo di riempimento della regione è completamente automatico. Nel nostro algoritmo, ogni pixel mantiene un valore di colore (o "vuoto", se il pixel non è riempito) e un valore di confidenza, che riflette la nostra fiducia nel valore del pixel e che viene congelato una volta riempito un pixel. Nel corso dell'algoritmo, alle patch lungo il fronte di riempimento viene inoltre assegnato un valore di priorità temporaneo, che determina l'ordine in cui vengono riempite. Quindi, il nostro algoritmo esegue l'iterazione dei tre passaggi seguenti fino a quando tutti i pixel sono stati riempiti.
Passaggio 1: calcolo delle priorità delle patch
L'ordine di riempimento è fondamentale per la sintesi di trama non parametrica [1] [6] [10] [13] . Finora, il preferito di default è stato il metodo della "buccia di cipolla", in cui la regione target è sintetizzata dall'esterno verso l'interno, in strati concentrici. Il nostro algoritmo esegue questa attività attraverso un algoritmo di riempimento best-first che dipende interamente dai valori di priorità assegnati a ciascuna patch sul fronte di riempimento. Il calcolo della priorità è distorto verso quelle patch che si trovano sulla continuazione di spigoli forti e che sono circondate da pixel ad alta confidenza, questi pixel sono il confine, contrassegnato dal valore -2. Il seguente codice ricalcola le priorità:
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
Dato un patch Ψp centrato nel punto p per alcuni p ∈ δΩ (vedere la figura 3), la sua priorità P (p) è definita come il prodotto della fiducia calcolata ( ComputeConfidence
o C (p) ) e il termine dati ( ComputeData
, o D (p) ), dove
, dove
| Ψp | è l'area di Ψp, α è un fattore di normalizzazione (ad esempio, α = 255 per una tipica immagine a livello di grigio) e np è un vettore unitario ortogonale alla parte anteriore δΩ nel punto p. La priorità viene calcolata per ogni patch di bordo, con patch distinte per ciascun pixel al limite dell'area di destinazione.
Implementato come
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
Il termine di confidenza C (p) può essere considerato come una misura della quantità di informazioni affidabili che circondano il pixel p. L'intenzione è di riempire prima quelle patch che hanno già più dei loro pixel già riempiti, con un'ulteriore preferenza data ai pixel che sono stati riempiti all'inizio (o che non facevano mai parte della regione target).
Ciò incorpora automaticamente la preferenza verso determinate forme lungo la parte frontale del riempimento. Ad esempio, le patch che includono angoli e viticci sottili della regione di destinazione tenderanno a essere riempite per prime, poiché sono circondate da più pixel dell'immagine originale. Queste patch forniscono informazioni più affidabili rispetto alle quali corrispondere. Al contrario, le patch sulla punta delle "penisole" di pixel riempiti che si protendono nella regione target tenderanno a essere messe da parte fino a quando non saranno riempiti più pixel circostanti. A livello approssimativo, il termine C (p) di (1) circa applica l'ordine di riempimento concentrico desiderabile.
Man mano che il riempimento procede, i pixel negli strati esterni della regione target tenderanno ad essere caratterizzati da maggiori valori di confidenza, e quindi saranno riempiti prima; i pixel al centro della regione target avranno valori di confidenza inferiori. Il termine dati D (p) è una funzione dell'intensità degli isofoti che colpiscono il fronte δΩ ad ogni iterazione. Questo termine aumenta la priorità di una patch in cui "scorre" un isofoto. Questo fattore è di fondamentale importanza nel nostro algoritmo perché incoraggia prima la sintesi delle strutture lineari e, quindi, la propagazione sicura nella regione target. Le linee spezzate tendono a connettersi, realizzando così il "Principio di connettività" della psicologia della visione [7] [17] .
L'ordine di riempimento dipende dalle proprietà dell'immagine, con il risultato di un processo di sintesi organica che elimina il rischio di artefatti a "struttura spezzata" e riduce anche gli artefatti a blocchi senza una costosa fase di taglio della patch [9] o una fase di fusione che induce la sfocatura [19 ] .
Passaggio 2: propagazione delle informazioni sulla trama e sulla struttura
Una volta calcolate tutte le priorità sul fronte di riempimento ( contorno ), viene trovata la patch Ψpˆ con la massima priorità. Lo riempiamo quindi con i dati estratti dalla regione di origine Φ. Propaghiamo la trama delle immagini campionando direttamente la regione di origine. Simile a [10] , cerchiamo nella regione di origine quella patch che è più simile a Ψpˆ. formalmente,
, dove
la distanza d (Ψa, Ψb) tra due patch generiche Ψa e Ψb è semplicemente definita come la somma delle differenze quadrate (SSD) dei pixel già riempiti nelle due patch. In questo passaggio non vengono eseguite ulteriori analisi o manipolazioni ( soprattutto nessuna sfocatura ). Questo calcolo viene eseguito nel ciclo principale e viene implementato come segue:
Ottenere la massima priorità:
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
Trovare la patch più simile:
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
Passaggio 3: aggiornamento dei valori di affidabilità
Dopo che la patch Ψpˆ è stata riempita con nuovi valori di pixel, la confidenza C (p) viene aggiornata nell'area delimitata da Ψpˆ come segue:
Questa semplice regola di aggiornamento ci consente di misurare la relativa sicurezza delle patch sul fronte di riempimento, senza parametri specifici dell'immagine. Man mano che il riempimento procede, i valori di confidenza diminuiscono, indicando che siamo meno sicuri dei valori di colore dei pixel vicino al centro dell'area target. Implementato qui (insieme a tutti gli altri aggiornamenti necessari):
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
Codice completo
Ecco il codice eseguibile, completo di codice sorgente delle librerie come commenti.
Il codice è invocato da
inpaint(infile, outfile, blocksize, windowsize, r, g, b)
Gli esempi sono inclusi sotto forma di
;~ 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")
basta decommentare l'esempio che si desidera eseguire usando CTRL+ Q.
File di test ufficiali
Questo algoritmo è progettato per essere adattato per ogni immagine. Pertanto, i valori predefiniti (e anche le maschere predefinite) sono completamente non ottimali. I valori predefiniti vengono scelti in modo che ogni campione possa essere elaborato in un ragionevole lasso di tempo. Consiglio vivamente di giocare con maschere di forma irregolare e dimensioni delle finestre migliori. Clicca sulle immagini per ingrandire!
Scacchiera
→
gotico americano
→
Labirinto
→
Monna Lisa
→
(maschera terribile)
Urlare
→
Stellato
→
Esempi del mondo reale
Tutti usano maschere personalizzate disegnate a mano.
Se hai altre immagini interessanti che vorresti vedere incluse, lascia un commento.
Miglioramenti EBII
Esistono diverse varianti di EBII, create da vari ricercatori. AnkurKumar Patel ha attirato la mia attenzione con la sua raccolta di documenti [24] su vari miglioramenti di EBII.
Nello specifico, il documento " Algoritmo migliorato per la verniciatura delle immagini basata su esempi " [25] menziona due miglioramenti nella valutazione dei valori di priorità.
Il miglioramento
La modifica effettiva è nel passaggio 1 (vedi sopra) dell'algoritmo e estende l' effetto C (p) e D (p) sulla classificazione di priorità per questo pixel usando questo:
Nella formula per C e D di cui sopra, e sono rispettivamente il fattore di normalizzazione (ad esempio, α = 255), il vettore isofoto e il vettore unità ortogonale alla parte anteriore nel punto p.
Ulteriore,
La funzione prioritaria è definita come la somma ponderata del termine di confidenza regolarizzato C (p) e del nuovo termine di dati D (p) . Dove α è il coefficiente di regolazione, viene definito 0Rp (p) soddisfacente come segue:
Dove α e β sono rispettivamente i pesi componenti della fiducia e i termini dei dati. Si noti che α + β = 1 .
Punteggio obiettivo
Ciò che è veramente interessante è che questo documento contiene un metodo proposto (e semplice!) Per assegnare un punteggio alle prestazioni degli algoritmi EBII. Prendi questo con un granello di sale, poiché si tratta di un metodo scelto dagli stessi autori di carta per verificare l'efficacia dell'approccio alla varianza proposto e il miglioramento su diverse immagini.
La valutazione del risultato viene eseguita confrontando il PSNR (Rapporto segnale-rumore di picco [26] ) tra l'immagine ripristinata e l'immagine originale. Generalmente più alto è il valore PSNR maggiore è la somiglianza dell'immagine riparata con l'originale. L'equazione per calcolare il PSNR è la seguente:
Queste sono le incredibili 2 (due!) Immagini di test del mondo reale che hanno usato:
La conclusione è deludente quanto la qualità della carta stessa. Mostra pochissimi miglioramenti. La cosa principale qui è un possibile metodo di punteggio dell'oggetto per questo tipo di sfida (e altre sfide di riparazione delle immagini):
+-------+---------------+----------+
| Image | EBII Original | Improved |
+-------+---------------+----------+
| 1 | 52.9556 | 53.7890 |
| 2 | 53.9098 | 53.8989 |
+-------+---------------+----------+
Meh.
Ricerca da fare
(Specifico per EBII)
a) Pre-elaborazione
Tutto si riduce al principio "Cancellazione magica" secondo cui l'algoritmo dovrebbe "funzionare" per tutto. La mia ingenua soluzione per questo è un'amplificazione basata sul colore (vedi sopra), ma ci sono modi migliori. Sto pensando di riconoscere la media geometrica di tutti i tex tracciabili per regolare automaticamente le dimensioni della finestra e rendere le dimensioni del timbro (anche il mio miglioramento) dipendenti dalla risoluzione del texel e dell'immagine intera. La ricerca deve essere fatta qui.
b) Post-elaborazione
Gli autori originali hanno già fatto un ottimo lavoro di debunking di tutti i filtri di post elaborazione che vengono in mente. Oggi ho provato qualcos'altro, ispirato dalla sempre inquietante Mona Lisa (grazie alla metropolitana sotterranea). Se prendi solo la regione dipinta e applichi una nuova maschera a tutti gli strani blocchi di colore e la inserisci in un algoritmo di despeckling, ti rimane un risultato quasi perfetto. Potrei esplorare questo un po 'di tempo in futuro.
[X] - Rimozione di oggetti mediante pittura a base di esemplare di A. Criminisi, P. Perez, K. Toyama
[1] - M. Ashikhmin. Sintetizzare trame naturali. Nel Proc. ACM Symp. sulla grafica 3D interattiva, pagg. 217–226, Research Triangle Park, NC, marzo 2001.
[5] - M. Bertalmio, L. Vese, G. Sapiro e S. Osher. Verniciatura simultanea di immagini di strutture e strutture. apparire, 2002
[6] - R. Bornard, E. Lecan, L. Laborelli e JH. Chenot. Correzione dei dati mancanti nelle immagini fisse e nelle sequenze di immagini. In ACM Multimedia, Francia, dicembre 2002.
[7] - TF Chan e J. Shen. Verniciatura senza trama mediante diffusioni guidate dalla curvatura (CDD). J. Visual Comm. Image Rep., 4 (12), 2001.
[8] - JS de Bonet. Procedura di campionamento multiresoluzione per analisi e sintesi di immagini di trama. Nel Proc. Conf. ACM Comp. Grafica (SIGGRAPH), volume 31, pagg. 361–368, 1997.
[9] - A. Efros e WT Freeman. Trapuntatura di immagini per la sintesi e il trasferimento di trame. Nel Proc. Conf. ACM Comp. Grafica (SIGGRAPH), pp. 341-346, Eugene Fiume, agosto 2001.
[10] - A. Efros e T. Leung. Sintesi di trama mediante campionamento non parametrico. Nel Proc. ICCV, pagg. 1033-1038, Kerkyra, Grecia, settembre 1999.
[11] - WT Freeman, EC Pasztor e OT Carmichael. Apprendimento della visione a basso livello. Int. J. Computer Vision, 40 (1): 25–47, 2000.
[12] - D. Garber. Modelli computazionali per l'analisi delle trame e la sintesi delle trame. Tesi di dottorato, Univ. della California del sud, USA, 1981.
[13] - P. Harrison. Una procedura non gerarchica per la risintesi di texture complesse. Nel Proc. Int. Conf. Central Europe Comp. Grafica, Visua. e comp. Vision, Plzen, Repubblica Ceca, febbraio 2001.
[14] - DJ Heeger e JR Bergen. Analisi / sintesi di texture a base piramidale. Nel Proc. Conf. ACM Comp. Grafica (SIGGRAPH), volume 29, pp. 229–233, Los Angeles, CA, 1995.
[15] - A. Hertzmann, C. Jacobs, N. Oliver, B. Curless e D. Salesin. Analogie di immagini. Nel Proc. Conf. ACM Comp. Grafica (SIGGRAPH), Eugene Fiume, agosto 2001.
[16] - H. Igehy e L. Pereira. Sostituzione delle immagini attraverso la sintesi delle trame. Nel Proc. Int. Conf. Elaborazione delle immagini, pp. III: 186–190, 1997.
[17] - G. Kanizsa. Organizzazione in visione. Praeger, New York, 1979.
[19] - L. Liang, C. Liu, Y.-Q. Xu, B. Guo e H.-Y. Shum. Sintesi delle texture in tempo reale mediante campionamento basato su patch. In ACM Transactions on Graphics, 2001.
[22] - L.-W. Wey e M. Levoy. Sintesi rapida delle trame mediante quantizzazione vettoriale strutturata ad albero. Nel Proc. Conf. ACM Comp. Grafica (SIGGRAPH), 2000.
[23] - A. Zalesny, V. Ferrari, G. Caenen e L. van Gool. Sintesi di trama composita parallela. Workshop In Texture 2002 - (in collaborazione con ECCV02), Copenaghen, Danimarca, giugno 2002.
[24] - AkurKumar Patel, Gujarat Technological University, Computer Science and Engineering
[25] - Algoritmo robusto migliorato per la pittura di immagini basata su esemplari
[26] - Wikipedia, Rapporto picco-segnale-rumore
inpaint.exe left top width height img.jpg
)?