W popularnym oprogramowaniu do edycji obrazów dostępna jest funkcja, która łata (termin używany w przetwarzaniu obrazu jest malowaniem, jak wskazał @ mınxomaτ.) Wybrany obszar obrazu, na podstawie informacji poza tą łatką. I robi całkiem dobrą robotę, biorąc pod uwagę, że to tylko program. Jako człowiek czasami widzisz, że coś jest nie tak, ale jeśli ściśniesz oczy lub po prostu rzucisz okiem, łatka wydaje się całkiem dobrze wypełniać lukę .
Wyzwanie
Biorąc pod uwagę obraz i maskę określającą prostokątny obszar obrazu, należy go załatać (również jako obraz lub inny preferowany format), twój program powinien spróbować wypełnić określony obszar łatką, która próbuje wtopić się w resztę Obraz. Program nie może użyć informacji o oryginalnym obrazie, który był w określonym obszarze.
Możesz założyć, że łatka zawsze ma przynajmniej szerokość od boków i wysokość od góry i dołu obrazu. Oznacza to, że maksymalny obszar łatki wynosi 1/9 całego obrazu.
Dodaj krótki opis działania algorytmu.
Głosowanie
Głosujący proszeni są o ocenę skuteczności algorytmów i głosowanie odpowiednio.
Kilka sugestii dotyczących sposobu oceniania: (Jeszcze raz dziękuję @ mınxomaτ za więcej kryteriów).
- Jeśli zmrużysz oczy, a obraz wygląda dobrze?
- Czy możesz dokładnie powiedzieć, gdzie jest łatka?
- Jak dobrze kontynuowane są struktury i tekstury z tła obrazu i okolic?
- Ile pikseli bezpańskich fałszywych kolorów zawiera edytowany obszar?
- Czy są jakieś jednolicie kolorowe plamy / bloki w obszarze, które wydają się tam nie należeć?
- Czy edytowany obszar ma jakieś drastyczne zmiany koloru / kontrastu lub jasności w porównaniu z resztą obrazu?
Kryterium ważności
Aby przesłanie było prawidłowe, obraz wyjściowy musi dokładnie pasować do obrazu wejściowego poza określonym obszarem.
Przypadek testowy
Po lewej stronie obraz źródłowy, po prawej odpowiednia maska:
inpaint.exe left top width height img.jpg
)?Odpowiedzi:
AutoIt , VB
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:
Biblioteka jest później tworzona za pomocą CLSID i IID:
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 z
Scan0
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:
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
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:
Znajdowanie najbardziej podobnej łatki:
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):
Kompletny kod
Oto działający kod wraz z kodem źródłowym bibliotek jako komentarzem.
Kod jest wywoływany przez
Przykłady są zawarte w postaci
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):
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
źródło
Matlab
Jest to proste podejście interpolacyjne. Chodzi o to, aby najpierw wykonać kopię lustrzaną tego, co jest po każdej stronie łatki. Następnie te lustrzane odbicie pikseli są interpolowane według odległości od odpowiedniej krawędzi:
Trudną częścią było znalezienie ładnych wag interpolacyjnych. Po krótkiej zabawie wymyśliłem racjonalną funkcję, która jest zerowa na wszystkich krawędziach oprócz tej, w której dublowaliśmy się. Jest to następnie przekształcane przez wielomian trzeciego stopnia w celu wygładzenia:
To proste podejście zaskakująco dobrze sprawdza się na „naturalnych” obrazach, ale gdy tylko natrafisz na ostre krawędzie, gra się kończy. W amerykańskim gotyckim przykładzie kolce widelca siana ładnie układają się z siatką pikseli, co sprawia, że wygląda całkiem ładnie, ale inaczej byłoby znacznie gorzej.
Oto wyniki:
I na koniec kod:
źródło
Matematyka
To używa
Inpaint
funkcji Mathematica . Ponieważ sama Mathematica wykonuje ciężkie prace, jest to wiki społeczności.inPaint
(poniżej) to prosta adaptacjaInpaint
. W przypadku kolorowych obrazów / zdjęć używa domyślnego ustawienia „TextureSynthesis”. Jeśli wykryje, że obraz jest czarno-biały (ponieważ dane obrazu są takie same jak dane obrazu w postaci binarnej obrazu), binaryzuje obraz i zastosuje łatkę „TotalVariation”.If
Klauzula albo zastosowanieBinarize
lubIdentity
do obrazu. (Identity
Funkcja zwraca argument bez zmian.)Obraz i maska są wprowadzane jako argumenty do
inPaint
.Partition
iGrid
służą wyłącznie do formatowania.Wyjścia zostały załatane. Po tym nie było retuszu zdjęć
inPaint
.źródło
Inpaint
wydaje się szukać symetrii na całym czarno-białym obrazie. - DavidC 9 godzin temuPython 2 i PIL
Ten program łączy kopie regionów Północ, Południe, Wschód i Zachód w celu utworzenia pikseli zastępczych, które używają kolorów, tekstur i cieniowania z lokalnego regionu obrazu.
Przykładowe dane wyjściowe:
Kod najpierw znajduje obwiednię dla łatki. Następnie dla każdego generowanego piksela oblicza kolor każdego kanału (RGB) na podstawie sumy ważonej 4 otaczających obszarów.
źródło
Python 3, PIL
Ten program używa operatora sobel i na tej podstawie rysuje linie na obrazie.
Operator sobel znajduje kąt każdej krawędzi, więc wszelkie krawędzie wytłaczające w nieznany obszar powinny być kontynuowane.
Tymczasem oto przykładowe obrazy.
Mona Lisa Mona Lisa Ḿ͠oǹ̰͎̣a ̾̇Lisa Ḿ͠o̢̎̓̀ǹ̰͎̣aͧ̈ͤ ̣̖̠̮̘̹̠̾̇ͣLisa Ḿ̳̜͇͓͠o̢̎̓̀ǹ̰͎̣͙a̤̩̖̞̝ͧ̈ͤͤ ̣̖̠̮̘̹̠̾̇ͣL͉̻̭͌i̛̥͕̱͋͌ş̠͔̏̋̀ạ̫͕͎ͨͮͪ̐͡ͅ
Obszar na powyższym zdjęciu jest gładki jak kaktus
Nie jest bardzo dobry ze stałym kolorem.
źródło
Python 2
Prosty skrypt Pythona, który tworzy łatkę przy użyciu wartości z pikseli znajdujących się poza luką. Pobiera wartości kolorów z końca wiersza i kolumny pikseli i oblicza średnią ważoną na podstawie odległości od tych pikseli.
Produkcja nie jest taka ładna, ale to sztuka .
A następnie kod:
źródło
Matematyka
Tak się składa, że Mathematica ma wbudowaną funkcję, która wykonuje dokładnie to zadanie, a mam na myśli dokładnie :
Domyślnie używa „najlepiej dopasowanej metody syntezy tekstur przy użyciu losowego próbkowania”, która daje dobre wyniki na obrazach, ale słabe wyniki dla labiryntu i szachownicy:
Zabawa z ustawieniami nie przyniosła mi wzrostu jakości na wszystkich obrazach, więc po prostu użyłem wartości domyślnych (aby zaoszczędzić bajty - w
codegolf.se
końcu to jest !).źródło
Binarize
(aby wyeliminować szare smugi). Spróbuj tego:methods = {"TextureSynthesis", "Diffusion", "FastMarching", "NavierStokes", "TotalVariation"};g[pic_, mask_] := Join[{Labeled[Framed@pic, "Original"]}, Labeled[ Binarize@Inpaint[pic, mask, Method -> #], #] & /@ methods]
TextureSynthesis
dobrze wygląda tylko na obrazach; i nie sądzę, abyśmy mogli dostroić nasze ustawienia dla każdego indywidualnego przypadku testowego. (Gdybyśmy mogli, moglibyśmy trywialnie dostarczyć brakującą porcję jako „ustawienie”.)inPaint[picture_, mask_] := If[bw = ImageData@Rasterize[Binarize[picture]] == ImageData[picture], Binarize, Identity]@ Inpaint[picture, mask, Method -> If[bw, "TotalVariation", "TextureSynthesis"]]
Python3
Ta odpowiedź implementuje ten pomysł w artykule „Deep Image Prior” autorstwa Uljanowa i in. (CVPR 2018) W tym artykule badali ideę, że sposób, w jaki zaprojektowane są dobrze działające sieci neuronowe do przetwarzania obrazu, ściśle odzwierciedla nasze wyobrażenie o tym, jak powinien wyglądać naturalny obraz („wcześniejsza” dystrybucja).
Zaproponowali metodę, która może być używana do malowania, a także usuwania szumów i artefaktów, która wykorzystuje tylko dany obraz bez szkolenia innych danych. Rzeczywista koncepcja jest dość prosta: sieć jest wyszkolona do wyświetlania pożądanego obrazu (dla niektórych ustalonych losowych szumów jako danych wejściowych) poprzez karanie tylko za błędy poza pewną maską. Jeśli chcesz usunąć hałas, po prostu nie musisz niczego maskować, ale po prostu przestań wcześnie na treningu.
W celu malowania zamaskuj część, którą chcesz pomalować i trenuj, aż do zbieżności. Z pewnością nie jest to najnowocześniejsze, ale nadal chciałem opublikować wypróbować i opublikować tutaj tutaj ze względu na prostotę pomysłu i wciąż niezwykłą wydajność. W moich eksperymentach malowanie większych łat nie wypadło tak dobrze, ale w przypadku mniejszych segmentów wyniki mogą być znacznie bardziej przekonujące.
Zaimplementowałem to za pomocą popularnej architektury U-Net z Jaxony na github . Kod do szkolenia i przetwarzania obrazów można znaleźć poniżej.
Trening
Jest to wizualizacja procesu szkolenia. Każda ramka jest stanem pewnej liczby iteracji:
Przykłady
Kod
Zauważ, że na jednostce centralnej uruchomienie pojedynczego obrazu może potrwać kilka godzin, a dobre GPU z włączoną funkcją cuda może zająć znacznie mniej czasu.
źródło
Python z OpenCV
OpenCV ma funkcję o nazwie inpaint. Istnieją dwa rodzaje malowania, użyję metody szybkiego marszu. Zgodnie z dokumentacją algorytm działa w następujący sposób:
Oto kod *:
Zwróć uwagę, jak przekonwertowałem BGR na RGB z powodów drukowania. Obracam to. Oto wyniki:
Mona Lisa powraca!
Jak widać, nie jest najlepszy z tymi dwoma kolorami.
źródło
Jawa
Metoda uśredniania kolorów. Prawdopodobnie można to poprawić.
Wyniki:
źródło