MS Paint zawsze był świetnym niszczycielem czasu, ale został odrzucony przez większość grafików. Być może ludzie stracili zainteresowanie z powodu wstrząsającej palety kolorów lub z powodu ograniczonych poziomów cofania. Niezależnie od tego nadal można generować piękne obrazy za pomocą standardowego pędzla i domyślnej palety kolorów.
Wyzwanie
Używając tylko domyślnego pędzla (kwadrat 4x4 bez narożników) i domyślnej palety kolorów (28 kolorów poniżej), spróbuj odtworzyć obraz źródłowy za pomocą techniki opartej na stochastycznym wspinaniu się na wzgórze .
Algorytm
Każda odpowiedź musi być zgodna z tym samym podstawowym algorytmem (stochastyczna wspinaczka). Szczegóły można modyfikować na każdym etapie. Ruch jest uważany za pociągnięciem pędzla (np. Kliknięcie farby).
- Zgadnij następne ruchy. Odgadnij (współrzędne i kolory) dla następnego ruchu (ruchów), jak chcesz. Jednak zgadywanie nie może odwoływać się do obrazu źródłowego.
- Zgadnij. Nanieś pędzel na obraz, aby wykonać ruch.
- Zmierz korzyści płynące z ruchu (ruchów). Odwołując się do obrazu źródłowego, określ, czy ruch (y) przyniosły korzyść obrazowi (tzn. Obraz bardziej przypomina obraz źródłowy). Jeśli jest to korzystne, zachowaj ruch (y), w przeciwnym razie odrzuć ruch (y).
- Powtarzaj aż do konwergencji. Przejdź do kroku 1 i spróbuj zgadnąć, aż algorytm wystarczająco się zbiegnie. W tym momencie obraz powinien mocno przypominać obraz źródłowy.
Jeśli twój program nie pasuje do tych czterech kroków, prawdopodobnie nie jest to stochastyczna wspinaczka. Oznacziłem to jako konkurs popularności, ponieważ celem jest stworzenie interesujących algorytmów malarskich opartych na ograniczonej palecie kolorów i pędzlu.
Przeciwwskazania
- Algorytm powinien być w jakiś sposób stochastyczny .
Obraz źródłowy nie powinien mieć wpływu na następne przypuszczenia. Zgadujesz każdy nowy ruch, a następnie sprawdzasz, czy to pomogło, czy nie. Na przykład nie można określić, gdzie umieścić pędzel na podstawie kolorów obrazu źródłowego (jest to podobne do ditheringu obrazu źródłowego, co nie jest celem).
Możesz wpływać na miejsce docelowe, modyfikując kroki algorytmu w dowolny sposób. Na przykład możesz rozpocząć zgadywanie od krawędzi i przesunąć się do wewnątrz, przeciągnąć pędzel, aby utworzyć linie dla każdego odgadnięcia, lub zdecydować się najpierw pomalować ciemne kolory. Możesz odwoływać się do poprzednich obrazów iteracji (ale nie obrazu źródłowego) w celu obliczenia następnego pożądanego ruchu. Mogą być restrykcyjne, jeśli chcesz (tzn. Zgaduj tylko w lewym górnym kwadrancie dla bieżącej iteracji).
Miarę „różnicy” między obrazem źródłowym a bieżącą iteracją można zmierzyć w dowolny sposób, o ile nie oblicza ona innych potencjalnych ruchów w celu ustalenia, czy ruch ten jest uważany za „najlepszy”. Nie powinien wiedzieć, czy aktualny ruch jest „najlepszy”, tylko czy pasuje do tolerancji kryteriów akceptacji. Na przykład może być tak prosty jak
abs(src.R - current.R) + abs(src.G - current.G) + abs(src.B - current.B)
dla każdego dotkniętego piksela lub dowolnej z dobrze znanych technik różnic kolorów .
Paleta
Możesz pobrać paletę jako obraz 28 x 1 lub utworzyć ją bezpośrednio w kodzie.
Szczotka
Szczotka ma kwadrat 4x4 bez narożników. To jest jego skalowana wersja:
(Twój kod musi używać wersji 4x4)
Przykład
Wejście:
Wynik:
Możesz zobaczyć, jak postępuje podstawowy algorytm w krótkim filmie, który zrobiłem (każda klatka ma 500 iteracji): The Starry Night . Początkowe etapy są interesujące do obejrzenia:
Odpowiedzi:
JavaScript
To rozwiązanie wykorzystuje element canvas HTML5 do wyodrębnienia danych obrazu, ale bez potrzeby używania HTML, co oznacza, że można go uruchomić w konsoli. Uzyskuje dostęp do obrazu palety kolorów jako tablicy; Zapisałem wszystkie kolory z obrazu palety w tablicy). Wysyła dane do konsoli (po zakończeniu), a także zapisuje wynik w zmiennej.
Najbardziej zaktualizowana wersja kodu znajduje się w skrzypcach . Skrzypce wykorzystują również lepszy algorytm do redukcji szumów na zdjęciach. Ulepszenie algorytmu polega głównie na ustaleniu funkcji (maks. Do min.), Która spowodowała wybór odwrotnego koloru.
Kod w kształcie ikony MS Paint! (sformatowany kod w skrzypcach lub stosie fragmentu)
Stosowanie:
Fiddle .
Skrzypce używa crossorigin.me, więc nie musisz się martwić dzieleniem zasobów między źródłami.
Zaktualizowałem również skrzypce, abyś mógł dostosować niektóre wartości, aby uzyskać najlepiej wyglądający obraz. Kolory niektórych zdjęć mogą być wyłączone, aby tego uniknąć, dostosuj wartość accept_rate, aby dostosować algorytm. Niższa liczba oznacza lepsze gradienty, wyższa liczba zapewni ostrzejsze kolory.
Oto skrzypce jako fragment kodu stosu (NIE jest aktualizowany, jeśli skrzypce nie działa):
Pokaż fragment kodu
Aby upamiętnić przelot Plutona w Nowym Horyzoncie, wprowadziłem obraz Plutona:
Dla następujących ustawiłem go tak, aby przypominały oryginał tak blisko, jak to możliwe:
Uruchomiłem to z domyślną tapetą OS X Yosemite. Po pozostawieniu go na chwilę wyniki są absolutnie oszałamiające. Oryginalny plik był ogromny (26 MB), więc zmieniłem jego rozmiar i skompresowałem:
Gwiaździsta noc ( dla uzyskania lepszych rezultatów użyłem obrazu w wyższej rozdzielczości )
Zdjęcie, które znalazłem w Google:
źródło
JavaScript + HTML
Losowy:
Losowy punkt
Wyrównany losowo:
Dzieli płótno na kwadraty 4x4 i wybiera losowo punkt w jednym z kwadratów. Przesunięcia przesuną siatkę, dzięki czemu możesz wypełnić małe luki.
Pętla:
Tworzy siatkę i Pętle przez wszystkie punkty. Przesunięcia przesuwa siatkę. Odstępy określają wielkość każdej komórki. (Zaczną się nakładać)
Różnica barw:
RGB:
HSL:
HSV:
źródło
document.cookie
(po 1000 iteracjach), ponieważ dokument jest w trybie piaskownicy. Czy plik cookie jest konieczny?doThing
zamiastloop
. Zwiększenie prędkości może być warte dodatkowej linii ...C # (implementacja referencyjna)
Jest to kod używany do generowania obrazów w pytaniu. Pomyślałem, że użyteczne byłoby podanie niektórym osobom odniesienia do organizacji ich algorytmu. Zupełnie losowa współrzędna i kolor są wybierane przy każdym ruchu. Działa zaskakująco dobrze, biorąc pod uwagę ograniczenia nałożone przez rozmiar pędzla / kryteria akceptacji.
Używam algorytmu CIEDE2000 do pomiaru różnic kolorów, z biblioteki ColorMine open source . Powinno to dać dokładniejsze dopasowanie kolorów (z ludzkiej perspektywy), ale wydaje się, że nie jest to zauważalna różnica w przypadku użycia z tą paletą.
Następnie możesz wygenerować serię obrazów (jak mój film), wywołując instancję w sposób podobny do poniższego kodu (poprawianie w zależności od liczby żądanych iteracji / klatek / nazwy). Pierwszy argument to ścieżka do pliku źródłowego, drugi argument to ścieżka do palety (połączona w pytaniu), a trzeci argument to ścieżka do plików wyjściowych.
Szukałem w Internecie kolorowych obrazów na płótnie i natknąłem się na poniższe zdjęcia, które wydają się być świetnymi (skomplikowanymi) obrazami testowymi. Wszelkie prawa autorskie należą do ich właścicieli.
Źródło
Źródło
Źródło
źródło
JavaScript Canvas
Aktualizacja
Doskonałe sugestie w komentarzach. Jest teraz szybszy i nie spowalnia interfejsu użytkownika!
źródło
Matematyka
Nie jest to wcale tak szybkie, ale przynajmniej sprawia, że obrazy są ledwo rozpoznawalne, więc jestem szczęśliwy.
Wynik:
Wydajność mogłaby być prawdopodobnie nieco lepsza przy większej liczbie iteracji, a wciąż jest wiele rzeczy, które mogę spróbować przyspieszyć / poprawić konwergencję, ale na razie wydaje się to wystarczająco dobre.
źródło
SmileBASIC
Obraz MSPAINT % [] , szerokość% , wysokość% , kroki% OUT wyjście% []
źródło