Roztrząsaj obraz w skali szarości na czysty czarno-biały z własnym algorytmem.
Wskazówki: Musisz wymyślić własny nowy algorytm. Nie możesz użyć wcześniej istniejących algorytmów (np. Floyd-Steinburg), ale możesz użyć ogólnej techniki. Twój program musi być w stanie odczytać obraz i wygenerować obraz tego samego rozmiaru. To konkurs popularności, więc wygrywa ten, kto wyprodukuje najlepszy (najbliższy oryginałowi) i najbardziej kreatywny (określony głosami). Bonus, jeśli kod jest krótki, ale nie jest to konieczne.
Jako wejścia możesz użyć dowolnego obrazu w skali szarości, powinien on być większy niż 300 x 300. Każdy format pliku jest w porządku.
Przykładowe dane wejściowe:
Przykładowe dane wyjściowe:
To całkiem niezła robota, ale nadal widoczne są linie i wzory.
Odpowiedzi:
Fortran
Okej, używam niejasnego formatu obrazu o nazwie FITS, który jest używany w astronomii. Oznacza to, że istnieje biblioteka Fortran do odczytu i zapisu takich obrazów. ImageMagick i Gimp mogą także odczytywać / zapisywać obrazy FITS.
Algorytm, którego używam, opiera się na ditheringu „Sierra Lite”, ale z dwoma ulepszeniami:
a) Zmniejszam błąd propagacji o czynnik 4/5.
b) Wprowadzam losową zmienność w matrycy dyfuzyjnej, utrzymując stałą jej sumę.
Razem prawie całkowicie eliminują wzorce widoczne na przykładzie PO.
Zakładając, że masz zainstalowaną bibliotekę CFITSIO, skompiluj ją
Nazwy plików są zakodowane na stałe (nie było problemu, aby to naprawić).
Kod:
Przykładowe dane wyjściowe dla zdjęcia szczeniaka w PO: Post
przykładowe wyniki:
źródło
GraphicsMagick / ImageMagick
Dithering zamówiony:
Zanim narzekam na to, że używam „ustalonego algorytmu”, przeczytaj ChangeLog dla GraphicsMagick i ImageMagick z kwietnia 2003 r., Gdzie zobaczysz, że zaimplementowałem algorytm w tych aplikacjach. Również kombinacja „-gamma .45455” z „-ordered-dither” jest nowa.
„-Gamma .45455” dba o to, aby obraz był zbyt jasny. Parametr „wszystko” jest potrzebny tylko w GraphicsMagick.
Jest pasowanie, ponieważ na obrazie z 4x4 uporządkowanym ditheringiem jest tylko 17 gravevels. Wygląd pasm można zmniejszyć, stosując uporządkowany drenaż 8x8, który ma 65 poziomów.
Oto oryginalny obraz, uporządkowane dane wyjściowe 4x4 i 8x8 oraz dane losowe:
Wolę wersję z ditheringiem uporządkowanym, ale dołączam wersję z progiem losowym dla kompletności.
„10 x 90%” oznacza renderowanie pikseli o intensywności poniżej 10 procent jako czystej czerni i powyżej 90 procent jako czystej bieli, aby uniknąć posiadania kilku samotnych plamek w tych obszarach.
Prawdopodobnie warto zauważyć, że oba są tak wydajne pod względem pamięci, jak to tylko możliwe. Nie ma też żadnej dyfuzji, więc działają one jeden piksel na raz, nawet przy pisaniu bloków uporządkowanego ditheringu i nie muszą nic wiedzieć o sąsiednich pikselach. ImageMagick i GraphicsMagick przetwarzają wiersz po kolei, ale dla tych metod nie jest to konieczne. Konwersja uporządkowanego roztrząsania zajmuje mniej niż 0,04 sekundy w czasie rzeczywistym na moim starym komputerze x86_64.
źródło
Przepraszam za styl kodu, rzuciłem to razem za pomocą bibliotek, które właśnie zbudowaliśmy w mojej klasie Java, i ma zły przypadek kopiowania-wklejania i magicznych liczb. Algorytm wybiera losowe prostokąty na obrazie i sprawdza, czy średnia jasność jest większa na skrawku obrazu lub na oryginalnym obrazie. Następnie włącza lub wyłącza piksel, aby zbliżyć jasność do siebie, wybierając piksele, które bardziej różnią się od oryginalnego obrazu. Myślę, że lepiej jest wydobyć cienkie detale, takie jak sierść szczeniaka, ale obraz jest głośniejszy, ponieważ próbuje wydobyć szczegóły nawet w obszarach, w których nie ma żadnych.
źródło
Ghostscript (przy niewielkiej pomocy ImageMagick)
Daleki od bycia moim „nowym algorytmem”, ale niestety nie mogłem się mu oprzeć.
Oczywiście działa lepiej bez ograniczeń „tego samego rozmiaru”.
źródło
JAWA
Oto moje zgłoszenie. Pobiera obraz JPG, oblicza jasność pikseli na piksel (dzięki Bonanowi w tym pytaniu SO), a następnie porównuje go z przypadkowym wzorem, aby dowiedzieć się, czy wynikowy piksel będzie czarny czy biały. Najciemniejsze piksele będą zawsze czarne, a najjaśniejsze piksele będą zawsze białe, aby zachować szczegóły obrazu.
Inne przykłady:
Działa również z kolorowymi obrazami:
źródło
CJam
95 bajtów :)
Używa formatu ASCII PGM (P2) bez wiersza komentarza, zarówno dla wejścia, jak i wyjścia.
Metoda jest bardzo podstawowa: sumuje kwadraty 2 * 2 pikseli, konwertuje do zakresu 0..4, a następnie wykorzystuje odpowiedni wzór 4 bitów do wygenerowania 2 * 2 czarno-białych pikseli.
Oznacza to również, że szerokość i wysokość muszą być równe.
Próba:
I losowy algorytm tylko w 27 bajtach:
Używa tego samego formatu pliku.
Próba:
I wreszcie podejście mieszane: losowe dithering z nastawieniem na wzór szachownicy; 44 bajty:
Próba:
źródło
Java (1.4+)
Nie jestem pewien, czy wymyślam tutaj koło, ale myślę, że może być wyjątkowy ...
Z ograniczoną liczbą losowych sekwencji
Czysty losowy dithering
Obraz miasta z odpowiedzi Averroesa
Algorytm wykorzystuje koncepcję zlokalizowanej energii świetlnej i normalizacji w celu zachowania cech. Pierwotna wersja wykorzystywała następnie przypadkowe drgania, aby uzyskać sparaliżowane spojrzenie na obszarach o podobnej jasności. Nie było to jednak tak atrakcyjne wizualnie. Aby temu przeciwdziałać, ograniczony zestaw ograniczonych losowych sekwencji jest odwzorowywany na surową jasność pikseli wejściowych, a próbki są używane iteracyjnie i wielokrotnie dają rozczochrane tła.
źródło
Pyton
Pomysł jest następujący: obraz dzieli się na
n x n
kafelki. Średni kolor każdego z tych kafelków obliczamy. Następnie mapujemy zakres kolorów0 - 255
na zakres,0 - n*n
który daje nam nową wartośćv
. Następnie kolorujemy wszystkie piksele z tego kafelka na czarno, a losowov
piksele w kafelku są białe. Jest daleki od optymalnego, ale wciąż daje nam rozpoznawalne wyniki. W zależności od rozdzielczości działa zwykle najlepiej w trybien=2
lubn=3
. Podczas gdyn=2
możesz już znaleźć artefakty z „symulowanej głębi kolorów”, na wypadekn=3
, gdyby stało się już trochę rozmazane. Zakładałem, że obrazy powinny pozostać tego samego rozmiaru, ale oczywiście możesz również użyć tej metody i po prostu podwoić / potroić rozmiar generowanego obrazu, aby uzyskać więcej szczegółów.PS: Wiem, że jestem trochę spóźniony na imprezę, pamiętam, że nie miałem żadnych pomysłów, kiedy wyzwanie się zaczęło, ale teraz miałem falę mózgową =)
Wyniki:
n=2:
n=3:
źródło
Zdefiniujmy bardzo zwarty, teoretyczny format pliku dla tego pytania, ponieważ którykolwiek z istniejących formatów plików ma zbyt duży narzut, aby napisać szybką odpowiedź.
Niech pierwsze cztery bajty pliku obrazu określają odpowiednio szerokość i wysokość obrazu w pikselach:
po których następują
w * h
bajty wartości skali szarości od 0 do 255:Następnie możemy zdefiniować fragment kodu w Pythonie (145 bajtów), który weźmie ten obraz i wykona:
który „ditheruje”, zwracając biały lub czarny z prawdopodobieństwem równym wartości skali szarości tego piksela.
Nałożony na przykładowy obraz daje coś takiego:
Nie jest zbyt ładny, ale wygląda bardzo podobnie po zmniejszeniu w podglądzie, a dla zaledwie 145 bajtów Pythona nie wydaje mi się, żeby można było znacznie poprawić.
źródło
Kobra
Pobiera 24-bitowy lub 32-bitowy plik PNG / BMP (JPG wytwarza dane wyjściowe z pewnymi szarościami). Jest również rozszerzalny na pliki zawierające kolory.
Wykorzystuje ELA o zoptymalizowanej prędkości do roztrząsania obrazu w 3-bitowym kolorze, który powróci jako czarno-biały po otrzymaniu obrazu testowego.
Czy wspominałem, że jest naprawdę szybki?
źródło
col
i pozostawienie jejimage.setPixel(x,y,col)
do samego końca?Jawa
Kod niskopoziomowy, wykorzystujący PNGJ i dodatek szumu plus podstawowa dyfuzja. Ta implementacja wymaga 8-bitowego źródła PNG w skali szarości.
(Dodaj ten słoik do ścieżki kompilacji, jeśli chcesz go wypróbować).
Jako bonus: jest niezwykle wydajny w użyciu pamięci (przechowuje tylko trzy rzędy), dzięki czemu można go używać do dużych obrazów.
źródło
Jawa
Po prostu prosty algorytm oparty na RNG oraz logika do obsługi kolorowych obrazów. Ma prawdopodobieństwo b ustawienia dowolnego danego piksela na biały, w przeciwnym razie ustawia go na czarny; gdzie b to oryginalna jasność tego piksela.
Oto potencjalny wynik obrazu psa:
źródło