Twoim zadaniem jest stworzenie programu, który pobiera czarno-biały obrysowany obraz (przykładowe obrazy są poniżej) i wypełnia go kolorem. Od Ciebie zależy, w jaki sposób oddzielisz każdy region i jaki kolor go wypełnić (możesz nawet użyć RNG).
Na przykład:
Jak widać, jestem wyraźnie artystą wyższego kalibru, jeśli chodzi o MS Paint.
Punktacja
To konkurs popularności, więc wygrywa odpowiedź z największą liczbą głosów netto. Zachęca się wyborców do oceniania odpowiedzi według
- Kryterium wejściowe: każdy obraz, który składa się z białego / jasnoszarego tła i czarnych / ciemnoszarych konturów
- Jak dobrze wykonuje się kolorowanie; co oznacza, że kilka obszarów lub wcale nie są białe w przeciwieństwie do powyższego (chyba że oczywiście zamierzasz użyć białego, np. do chmur)
- Możliwość dostosowania kolorów używanych w niektórych sekcjach
- Jak dobrze system działa na wielu różnych obrazach (o różnych szczegółach)
- Opublikuj, ile czasu zajmuje program na zdjęcie. Być może nie gramy w golfa kodowego, ale krótszy, szybszy i wydajniejszy kod należy uznać za lepszy
- Powinien wyprowadzić nowy obraz na ekran lub do pliku (nie większy niż 2 MB, aby można go było wyświetlić w odpowiedzi)
- Wyjaśnij, dlaczego zdecydowałeś się na wyjście do tego typu obrazu i skomentuj / wyjaśnij działanie twojego kodu
- Możliwość zastosowania koloru zastosowanego do odpowiedniego kształtu, z którym jest związany (realistyczna kolorystyka, tj. Trawa jest zielona, ogrodzenia drewniane są brązowe itp.)
„Mógłbym losowo pokolorować każdy obszar, ale jeśli uda mi się zidentyfikować„ ogrodzenie ”i sprawić, by było podobnie pokolorowane, to jest to coś, co zasługuje na pozytywne głosy”. - NathanMerrill
Ponieważ jest to konkurs popularności, możesz też opcjonalnie ocenić według:
- Ogólny urok (jak dobrze wygląda obraz)
- Talent artystyczny; jeśli możesz programować w cieniowaniu lub kolorystyce w stylu akwareli itp.
Ogólnie rzecz biorąc, wygra najmniejszy obraz wyjściowy (rozmiar pliku) o najwyższej jakości, z programem na czczo i najwyższym publicznym głosowaniem.
Jeśli masz inne specyfikacje oceniania, które Twoim zdaniem powinny być zastosowane, zalecamy je w komentarzach do tego postu.
Przykłady
Nic nie mam; wszystkie przykładowe obrazy są na licencji Creative Commons.
Źródło: https://pixabay.com/ro/stejar-arbore-schi%C5%A3%C4%83-natura-303890/ Źródło: http://www.freestockphotos.biz/stockphoto/10665 Źródło: http: / /crystal-rose1981.deviantart.com/art/Dragon-Tattoo-Outline-167320011 Źródło: http://jaclynonacloudlines.deviantart.com/art/Gryphon-Lines-PF-273195317 Źródło: http://captaincyprus.deviantart.com / art / Dragon-OutLine-331748686 Źródło: http://electric-meat.deviantart.com/art/A-Heroes-Farewell-280271639 Źródło: http://movillefacepalmplz.deviantart.com/art/Background-The-Pumpkin -Farm-of-Good-old-Days-342865938
EDYCJA: Ze względu na wygładzanie linii powodujących nie czarno-białe piksele i niektóre obrazy, które mogą zawierać szary zamiast czarno-białego, jako dodatkowe wyzwanie możesz spróbować sobie z tym poradzić. Moim zdaniem powinno to być dość łatwe.
źródło
Odpowiedzi:
Spektralny aerograf (Python, PIL, scipy)
Wykorzystuje wyrafinowany algorytm matematyczny do generowania kolorowych bzdur. Algorytm jest powiązany z algorytmem Google PageRank Google, ale dotyczy pikseli zamiast stron internetowych.
Przyjąłem to podejście, ponieważ myślałem, że w przeciwieństwie do metod opartych na zalewaniu może poradzić sobie z obrazami takimi jak kurczak i drzewo, gdzie istnieją kształty, które nie są całkowicie zamknięte przez czarne linie. Jak widać, działa to w pewnym sensie, chociaż ma tendencję do kolorowania w różnych częściach nieba różnymi kolorami
Dla matematycznie myślących: w gruncie rzeczy konstruuje wykres sąsiedztwa pikseli while na obrazie, a następnie znajduje 25 najlepszych wektorów własnych wykresu Laplaciana. (Z wyjątkiem tego, że nie do końca tak, ponieważ uwzględniamy ciemne piksele, po prostu nadajemy ich połączeniom mniejszą wagę. Pomaga to w radzeniu sobie z antyaliasingiem, a także ogólnie wydaje się dawać lepsze wyniki.) Po znalezieniu wektorów własnych tworzy ich losowa liniowa kombinacja, ważona ich odwrotnymi wartościami własnymi, w celu utworzenia składowych RGB obrazu wyjściowego.
Ze względu na czas obliczeń obraz jest skalowany w dół przed wykonaniem tego wszystkiego, a następnie ponownie skalowany w górę, a następnie mnożony przez oryginalny obraz. Mimo to nie działa szybko, w zależności od obrazu wejściowego, zajmuje od około 2 do 10 minut, chociaż z jakiegoś powodu kurczak zajął 17 minut.
Być może rzeczywiście można przekształcić ten pomysł w coś użytecznego, tworząc interaktywną aplikację, w której można kontrolować kolor i intensywność każdego z wektorów własnych. W ten sposób możesz wyciszyć te, które dzielą niebo na różne sekcje, i zanikać te, które wychwytują odpowiednie cechy obrazu. Ale nie mam planów, aby zrobić to sam :)
Oto obrazy wyjściowe:
(Nie działało to tak dobrze na dyniach, więc pomijam tę.)
A oto kod:
źródło
Python 2 + PIL też, moja pierwsza kolorowanka
Zrobiłem to samo, co CarpetPython, z tym wyjątkiem, że wypełniam region „gradientami” i używam innego cyklu kolorów.
Moje najwspanialsze kolory:
Czasy obliczeń na moim komputerze:
obraz 1 (chiński smok): prawdziwy użytkownik 0m2.862s 0m2.801s sys 0m0.061s
obraz 2 (gryffon): użytkownik 0m0,991 s 0m0,963s sys 0m0,029s
obraz 3 (jednorożec smok): prawdziwy użytkownik 0m2.260s 0m2.239s sys 0m0.021s
źródło
Python 2 i PIL: Psychedelic Worlds
Użyłem prostego algorytmu, aby zalać każdy biały obszar kolorem z palety kolarskiej. Rezultat jest bardzo kolorowy, ale niezbyt realistyczny.
Zwróć uwagę, że „białe” części na tych zdjęciach nie są bardzo białe. Będziesz musiał również przetestować odcienie szarości.
Kod w Python 2.7:
Przykładowe zdjęcia:
źródło
Matlab
Używamy przestrzeni kolorów HSV i wybieramy każdy region Barwa na podstawie jego względnego rozmiaru między białymi regionami. Największy region będzie niebieski (
Hue = 0.7
), a najmniejszy region będzie fioletowy (Hue = 0.8
). Regiony między tymi dwoma rozmiarami mają odcienie w zakresie0.7 -> 1=0 -> 0.8
. Barwa zakresu jest wybierana liniowo względem funkcjiarea^0.15
. Nasycenie i wartość wynosi zawsze 1 dla każdego nie czarnego piksela.Pokolorowanie obrazu zajmuje mniej niż 1 sekundę.
3 zdjęcia z zamkniętymi regionami, w których algorytm działa przyzwoicie:
I reszta zdjęć:
Na tych zdjęciach znajdują się duże białe obszary połączone, które powinny być idealnie zabarwione wieloma kolorami (problem ten został dobrze rozwiązany w rozwiązaniu Nathaniela) .
źródło
Python 3 with Pillow
Kod jest nieco długi, aby zawrzeć go w tej odpowiedzi, ale oto jego sedno .
Te ostatnie kroki niestety nie wyeliminowały jaśniejszych „aureoli”, które są widoczne w ciemniejszych regionach, ale zrobiły zauważalną różnicę, przynajmniej. Przetwarzanie obrazu nigdy nie było moim obszarem badań, więc wiem, że istnieją bardziej skuteczne i wydajniejsze algorytmy do robienia tego, co próbowałem tutaj zrobić ... ale cóż.
Do tej pory istnieją tylko dwie palety do wyboru dla kroku 4: czysto losowa i bardzo szorstka „naturalna”, która próbuje przypisać kolory nieba do górnych rogów, kolory trawy do dolnych rogów, brązowe (skały lub drewno ) kolory na środku każdej strony i zróżnicowane kolory na środku. Sukces został ... ograniczony.
Stosowanie:
Próbki:
paint_by_prog.py -t 0.7 Gryphon-Lines.png
paint_by_prog.py Dragon-Tattoo-Outline.jpg
paint_by_prog.py -t 0.85 -p natural The-Pumpkin-Farm-of-Good-old-Days.jpg
paint_by_prog.py -t 0.7 Dragon-OutLine.jpg
paint_by_prog.py stejar-arbore-schiţă-natura.png
Kurczak nie wygląda bardzo dobrze, a mój najnowszy wynik dla obrazu linku nie jest najlepszy; ten, który pochodzi z wcześniejszej wersji kodu, był w większości bladożółty i miał w sobie ciekawy klimat pustyni…
Występ:
Przetwarzanie każdego obrazu zajmuje kilka sekund przy ustawieniach domyślnych, co oznacza, że w kroku 5 wykorzystywany jest algorytm przybliżonego najbliższego sąsiada. Prawdziwy najbliższy sąsiad jest znacznie wolniejszy, może potrwać około pół minuty (właściwie go nie mierzyłem).
źródło
Jawa
Losowy wybór kolorów z palety.
Ostrzeżenie: wyszukiwanie regionu jest obecnie bardzo wolne, chyba że białe regiony są niezwykle małe.
Wymaga dwóch danych wejściowych: nazwy pliku i identyfikatora palety. Zawiera pewną korektę antyaliasingu, ale nie zawiera logiki przezroczystych pikseli.
Obecnie rozpoznawane są następujące palety:
Wyniki:
Dragon, paleta Game Boy:
Drugi smok, niebieska + zielona paleta:
GOL martwa natura Mona Lisa (renderowana przez ten program ), trójkolorowa paleta:
źródło