Utwórz program, który może zmieniać układ pikseli w obrazie, aby nie można go było rozpoznać. Jednak Twój program powinien móc przekonwertować go z powrotem na oryginalny obraz.
Możesz napisać dwie funkcje - do kodowania i dekodowania, jednak jedna funkcja, która zastosowana wielokrotnie daje oryginalny obraz (przykład z matematyki - f(x) = 1 - x
) jest bonusem.
Również wytwarzanie pewnego wzorca wyjściowego daje bonus.
Obraz może być reprezentowany jako tablica 1D / 2D lub obiekt obrazu, jeśli Twój język go obsługuje. Pamiętaj, że możesz zmienić tylko kolejność pikseli!
Logiczne będzie wybranie kodu zwycięzcy, który generuje mniej rozpoznawalny obraz, jednak nie wiem, jak dokładnie go zmierzyć, wszystkie sposoby, które mogę sobie wyobrazić, można oszukać. Dlatego wybrałem to pytanie jako konkurs popularności - pozwól użytkownikom wybrać najlepszą odpowiedź!
Obraz testowy 1 (800 x 422 px): Obraz testowy 2 (800 x 480 px): Proszę podać kod wyjściowy obrazu.
źródło
Odpowiedzi:
Python 2.7 (z PIL) - brak pseudolosowości
Rozbijam obraz na 2 na 2 bloki (ignorując resztę) i obracam każdy blok o 180 stopni, następnie robię to samo z 3 na 3 bloki, a następnie 4 itd. Do pewnego parametru BLKSZ. Następnie robię to samo dla BLKSZ-1, następnie BLKSZ-2, aż do 3, następnie 2. Ta metoda odwraca się dokładnie; funkcja rozszyfrowania jest funkcją szyfrowania.
Kod :
W zależności od rozmiaru bloku można sprawić, że obliczenia wyeliminują wszystkie podobieństwa do oryginalnego obrazu: (BLKSZ = 50)
Lub spraw, aby obliczenia były wydajne: (BLKSZ = 10)
źródło
BLKSZ = 10
Krajobraz jest naprawdę cool!C #, Winform
Edytuj Zmieniając sposób wypełniania tablicy współrzędnych, możesz mieć różne wzory - patrz poniżej
Czy podoba ci się ten wzór?
Premia:
Losowo zamień dokładnie jeden raz wszystkie piksele w górnej połowie ze wszystkimi pikselami w dolnej połowie. Powtórz tę samą procedurę dla rozszyfrowania (bonus).
Kod
Scramble.cs
Scramble.designer.cs
Program.cs
Zaznacz „Niebezpieczny kod” we właściwości projektu, aby go skompilować.
Złożony wzór
Zmień pierwszą część funkcji pracy, aż do Application.DoEvents:
źródło
C, dowolne rozmycie, łatwo odwracalne
Późno na imprezę. Oto mój wpis!
Ta metoda powoduje rozmycie szyfrujące. Nazywam to scramblur . To jest bardzo proste. W pętli wybiera losowy piksel, a następnie zamienia go losowo wybranym pobliskim pikselem w toroidalnym modelu płótna. Użytkownik określa maksymalną odległość określającą, co oznacza „piksel w pobliżu” (1 oznacza zawsze wybór sąsiedniego piksela), liczbę iteracji i opcjonalnie ziarno liczby losowej. Im większa maksymalna odległość i większa liczba iteracji, tym bardziej rozmyty jest wynik.
Można to odwrócić, podając ujemną liczbę iteracji (jest to po prostu wygoda interfejsu wiersza poleceń; w rzeczywistości nie ma czegoś takiego jak iteracje ujemne). Wewnętrznie wykorzystuje niestandardowy 64-bitowy LCPRNG (liniowy kongruencjalny generator liczb pseudolosowych) i wstępnie generuje blok wartości. Tabela pozwala na zapętlanie bloku do przodu lub do tyłu, odpowiednio dla szyfrowania lub rozszyfrowywania.
Próbny
W przypadku pierwszych dwóch obrazów podczas przewijania w dół każdy obraz jest rozmazany przy użyciu wyższego maksymalnego przesunięcia: Najwyższy jest obraz oryginalny (np. Przesunięcie 0 pikseli), a następnie 1, 2, 4, 8, 16, 32, 64 , 128, a na koniec 256. Liczba iteracji wynosi 10⁶ = 1 000 000 dla wszystkich zdjęć poniżej.
W przypadku dwóch drugich obrazów każde zdjęcie jest rozmazane przy użyciu stopniowo zmniejszanego przesunięcia - np. Najbardziej rozmyte do najmniej rozmytego - od maksymalnego przesunięcia 256 do 0. Ciesz się!
A dla tych dwóch następnych zdjęć możesz zobaczyć postępy w pełnym rozmiarze tutaj i tutaj :
Kod
Zhakowałem to razem w około godzinę podczas budzenia się rano i nie zawiera prawie żadnej dokumentacji. Mogę wrócić za kilka dni i dodać więcej dokumentacji później, jeśli ludzie tego zażądają.
źródło
Python 3.4
Kiedy bonus 2 zostanie osiągnięty, poprzez użycie dodatkowego obrazu klucza, bonus 1 nie zostanie utracony. Program jest nadal odwrotny, pod warunkiem, że zostanie ponownie uruchomiony z tym samym obrazem klucza.
Standardowe użycie
Obraz testowy 1:
Obraz testowy 2:
Uruchomienie programu z pojedynczym plikiem obrazu, ponieważ jego argument zapisuje plik obrazu z pikselami równomiernie zaszyfrowanymi na całym obrazie. Ponowne uruchomienie z zaszyfrowanym wyjściem zapisuje plik obrazu z ponownie zastosowanym szyfrowaniem, co przywraca oryginał, ponieważ proces szyfrowania jest odwrotny.
Proces mieszania jest odwrotny, ponieważ lista wszystkich pikseli jest podzielona na 2 cykle, dzięki czemu każdy piksel jest zamieniany na jeden i tylko jeden piksel. Uruchomienie go po raz drugi zamienia każdy piksel pikselem, z którym został zamieniony, przywracając wszystko do początku. Jeśli jest nieparzysta liczba pikseli, będzie taki, który się nie poruszy.
Dzięki odpowiedzi mfvonh jako pierwszej sugerującej 2-cykle.
Użycie z kluczowym obrazem
Mieszanie obrazu testowego 1 z obrazem testowym 2 jako obrazem kluczowym
Mieszanie obrazu testowego 2 z obrazem testowym 1 jako obrazem kluczowym
Uruchomienie programu z drugim argumentem pliku obrazu (obraz klucza) dzieli oryginalny obraz na regiony na podstawie obrazu klucza. Każdy z tych obszarów jest podzielony na 2 cykle osobno, dzięki czemu całe szyfrowanie odbywa się w obrębie regionów, a piksele nie są przenoszone z jednego regionu do drugiego. Rozkłada to piksele na każdy region, dzięki czemu regiony stają się jednolitym plamkowym kolorem, ale z nieco innym średnim kolorem dla każdego regionu. Daje to bardzo przybliżone przybliżenie kluczowego obrazu, w niewłaściwych kolorach.
Ponowne uruchomienie zamienia te same pary pikseli w każdym regionie, dzięki czemu każdy region jest przywracany do pierwotnego stanu, a obraz jako całość pojawia się ponownie.
Dzięki odpowiedzi edc65 jako pierwszej zasugerował podział obrazu na regiony. Chciałem rozwinąć tę kwestię, aby używać dowolnych regionów, ale podejście polegające na zamianie wszystkiego w regionie 1 na wszystko w regionie 2 oznaczało, że regiony musiały być tej samej wielkości. Moim rozwiązaniem jest utrzymanie regionów w izolacji od siebie i po prostu wtłoczenie każdego regionu w siebie. Ponieważ regiony nie muszą już mieć podobnej wielkości, łatwiej jest zastosować regiony o dowolnym kształcie.
Kod
Wypalanie obrazu JPEG
Pliki .jpg są przetwarzane bardzo szybko, ale kosztem zbyt wysokiej temperatury. Powoduje to wypalenie obrazu po przywróceniu oryginału:
Ale poważnie, format stratny spowoduje nieznaczną zmianę niektórych kolorów pikseli, co samo w sobie powoduje, że dane wyjściowe są nieprawidłowe. Gdy używany jest kluczowy obraz, a tasowanie pikseli jest ograniczone do regionów, całe zniekształcenie jest utrzymywane w regionie, w którym się zdarzyło, a następnie równomiernie rozłożone w tym regionie po przywróceniu obrazu. Różnica w średnich zniekształceniach między regionami pozostawia widoczną różnicę między nimi, więc regiony użyte w procesie mieszania są nadal widoczne na przywróconym obrazie.
Konwersja do formatu .png (lub dowolnego formatu bezstratnego) przed szyfrowaniem zapewnia, że nieszyfrowany obraz jest identyczny z oryginałem bez wypalenia lub zniekształceń:
Małe szczegóły
źródło
Oto nieprzypadkowa transformacja dla zmiany
nx
czasyny
razy wierszyTransformacja jest prawie odwrotna do siebie, powtarzanie transformacji ogółem
size_x
(w kierunku x) zwraca oryginalny obraz. Nie ustaliłem dokładnej matematyki, ale użycie liczb całkowitych całkowitychint(log_2(size_x))
daje najlepsze tasowanie z najmniejszymi obrazami duchówTak wyglądają pierwsze kroki 20 iteracji (nx = ny, zwróć uwagę na efekt różnych rozdzielczości)
źródło
Matematyka
To całkiem proste. Wybieram
5 * nPixels
losowe pary współrzędnych i zamieniam te dwa piksele (co całkowicie zasłania obraz). Aby to rozszyfrować, robię to samo w odwrotnej kolejności. Oczywiście muszę zaszczepić PRNG, aby uzyskać te same pary współrzędnych na obu krokach.Jedyna różnica pomiędzy tymi dwoma funkcjami jest
Reverse@
wunscramble
. Obie funkcje przyjmują rzeczywisty obiekt obrazu. Możesz użyć ich w następujący sposób:out
iin
są identyczne. Oto jakscr
wygląda:źródło
FindPermutation
?{c, a, b}[[{2, 3, 1}]]
można wykorzystać?C # (+ Bonus za algorytm symetryczny)
Działa to poprzez znalezienie
x
takiegox^2 == 1 mod (number of pixels in image)
, a następnie pomnożenie indeksu każdego piksela przezx
w celu znalezienia jego nowej lokalizacji. Pozwala to na użycie tego samego algorytmu do szyfrowania i deszyfrowania obrazu.źródło
1
(oryginalny obraz) imodulo-1
(odwrócony / odwrócony obraz). Większość liczb ma nietrywialne rozwiązania, ale wydaje się , że istnieją pewne wyjątki . (związane z pierwszą faktoryzacjąmodulo
)1
wyświetla oryginalny obraz i-1
wysyła np. Imgur.com/EiE6VW2C #, samo-odwrotność, brak losowości
Jeśli oryginalny obraz ma wymiary, które są potęgami dwóch, to każdy wiersz i kolumna są wymieniane z rzędem i kolumną, która ma odwrócony wzór bitowy, na przykład dla obrazu o szerokości 256, wówczas wiersz 0xB4 jest wymieniany z rzędem 0x2D. Obrazy o innych rozmiarach są podzielone na prostokąty o bokach o sile 2.
Pierwsze zdjęcie:
Drugi obraz:
źródło
DO#
Ta sama metoda szyfrowania i dekodowania. Byłbym wdzięczny za sugestie dotyczące poprawy tego.
Wyprowadza wyniki w psychodeliczną kratę
źródło
Python 2 (samo-odwrotny, bez losowości, kontekstowy)
To nie wygra żadnych nagród za „najmniej rozpoznawalne”, ale może może być uznane za „interesujące”. :-)
Chciałem stworzyć coś kontekstowego, w którym mieszanie pikseli zależy od samego obrazu.
Pomysł jest dość prosty: posortuj wszystkie piksele według dowolnej arbitralnej wartości pochodzącej z koloru piksela, a następnie zamień pozycje pierwszego piksela na tej liście z ostatnim, drugim z drugim do ostatniego i tak dalej.
Niestety w tym prostym podejściu pojawia się problem z pikselami tego samego koloru, więc aby nadal było odwrotnie, mój program stał się nieco bardziej skomplikowany ...
Oto wynik:
Możesz osiągnąć zupełnie inne wyniki, zmieniając funkcję skrótu
f
:r-g-b
:r+g/2.**8+b/2.**16
:math.sin(r+g*2**8+b*2**16)
:(r+g+b)//600
:0
:źródło
Matematyka (+ bonus)
Spowoduje to zwinięcie kanałów kolorów i zaszyfrowanie obrazu jako jednej długiej listy danych. Rezultatem jest jeszcze mniej rozpoznawalna zaszyfrowana wersja, ponieważ nie ma takiego samego rozkładu kolorów jak oryginał (ponieważ te dane również zostały zaszyfrowane). Jest to najbardziej oczywiste na drugim zaszyfrowanym obrazie, ale jeśli przyjrzysz się uważnie, zobaczysz ten sam efekt również na pierwszym. Funkcja jest własną odwrotnością.
Pojawił się komentarz, że może nie być poprawny, ponieważ koduje się na kanał. Myślę, że tak powinno być, ale to nie jest wielka sprawa. Jedyną zmianą konieczną do szyfrowania całych pikseli (zamiast na kanał) byłaby zmiana
Flatten @ x
naFlatten[x, 1]
:)Wyjaśnienie
Definiuje funkcję,
f
która przyjmuje tablicę dwuwymiarowąx
. Funkcja wykorzystuje iloczyn wymiarów obrazu jako losowe ziarno, a następnie spłaszcza tablicę do listy jednowymiarowejf
(lokalnie zacienionej). Następnie tworzy listę postaci, w{1, 2, ... n}
którejn
jest długośćf
, losowo permutuje tę listę, dzieli ją na segmenty 2 (czyli np.{{1, 2}, {3, 4}, ...}
(Upuszczając ostatnią liczbę, jeśli oba wymiary są nieparzyste), a następnie permutujef
, zamieniając wartości na pozycje wskazane w każdej właśnie utworzonej podlistie, a na koniec przekształca permutowaną listę z powrotem do pierwotnych wymiarówx
. Szyfruje się na kanał, ponieważ oprócz zwinięcia wymiarów obrazuFlatten
polecenie również zwija dane kanału w każdym pikselu. Ta funkcja jest odwrotna, ponieważ cykle zawierają tylko dwa piksele.Stosowanie
Oto użycie
Flatten[x, 1]
.źródło
f @ f @ img1 // Image
jest (w pełnej składni)Image[f[f[img1]]]
Matlab (+ bonus)
Zasadniczo zmieniam losowo dwa piksele i zaznaczam każdy piksel, który został przełączony, aby nie mógł zostać ponownie przełączony. Tego samego skryptu można użyć ponownie do „deszyfrowania”, ponieważ za każdym razem resetuję generator liczb losowych. Odbywa się to do momentu, gdy prawie wszystkie piksele zostaną przełączone (dlatego wielkość kroku jest większa niż 2)
EDYCJA: Właśnie zobaczyłem, że Martin Büttner zastosował podobne podejście - nie zamierzałem kopiować pomysłu - zacząłem pisać kod, gdy nie było odpowiedzi, więc przepraszam za to. Nadal uważam, że moja wersja używa różnych pomysłów =) (A mój algorytm jest znacznie bardziej nieefektywny, jeśli spojrzysz na fragment, w którym wybierane są dwie losowe współrzędne ^^)
Zdjęcia
Kod
źródło
Matematyka - użyj permutacji do szyfrowania, a jej odwrotność do rozszyfrowania.
Obraz jpg to trójwymiarowa tablica
{r,g,b}
kolorów pikseli. (3 wymiary tworzą zestaw pikseli według rzędu, kolumny i koloru). Można go spłaszczyć do listy{r,g,b}
potrójnych, a następnie permutować zgodnie ze „znaną” listą cykli, a na końcu ponownie złożyć w szereg oryginalnych wymiarów. Rezultatem jest zakodowany obraz.Rozszyfrowanie pobiera zaszyfrowany obraz i przetwarza go na odwrocie listy cykli. Wyprowadza, tak, oryginalny obraz.
Tak więc pojedyncza funkcja (w tym przypadku
scramble
) służy do szyfrowania, a także do rozszyfrowywania pikseli na obrazie.Obraz jest wprowadzany wraz z numerem początkowym (aby upewnić się, że generator liczb losowych będzie w tym samym stanie dla szyfrowania i rozszyfrowywania). Gdy parametr „reverse” ma wartość False, funkcja będzie się mieszać. Gdy jest to prawda, funkcja rozszyfruje.
rozchwytać
Piksele są spłaszczone i generowana jest losowa lista cykli. Permute używa cykli do przełączania pozycji pikseli na spłaszczonej liście.
rozszyfrować
Ta sama funkcja
scramble
służy do rozszyfrowania. Jednak kolejność listy cykli jest odwrócona.Przykłady
To samo ziarno (37) służy do mieszania i rozszyfrowywania.
To tworzy zakodowany obraz góry. Poniższy obrazek pokazuje, że zmienną scrambledMount można zastąpić faktycznym obrazem sceny górskiej.
Teraz wykonujemy odwrotność; scrambledMount zostaje wprowadzony, a oryginalne zdjęcie zostaje odzyskane.
To samo dotyczy kręgów:
źródło
Pyton
Podoba mi się ta łamigłówka, wydawał się interesujący, a ja przyszedłem z zawiniętą funkcją ruchu, aby zastosować na obrazie.
Wrapped
Czytam obraz jako tekst (od lewej do prawej, w górę iw dół) i piszę go jako muszlę ślimaka.
Ta funkcja jest cykliczna: na przykład występuje w N, f ^ (n) (x) = x, dla obrazu 4 * 2, f (f (f (x))) = x
Ruch
Biorę losową liczbę i przenoszę z niej każdą kolumnę i ligne
Kod
Kino
Pierwszy obrót:
następnie permutacja:
I z ostatnią rotacją:
Jeśli chodzi o inny przykład:
źródło
VB.NET (+ bonus)
To dzięki pomysłowi flawr, dzięki niemu, wykorzystuje jednak inny algorytm zamiany i sprawdzania. Program koduje i dekoduje w ten sam sposób.
Obrazy wyjściowe:
źródło
Po przypomnieniu, że ma zamiar zamienić piksele i ich nie zmieniać, oto moje rozwiązanie tego problemu:
Jajecznica:
Przywrócono:
Odbywa się to przez losową kolejność pikseli, ale aby móc ją przywrócić, losowość jest ustalona. Odbywa się to poprzez użycie pseudolosowego ze stałym ziarnem i wygenerowanie listy indeksów opisujących, które piksele należy zamienić. Ponieważ zamiana będzie taka sama, ta sama lista przywróci oryginalny obraz.
Należy pamiętać, że użycie tego algorytmu w formacie kompresji stratnej nie da tego samego wyniku, ponieważ format obrazu zmieni dane. Powinno to działać dobrze z każdym bezstratnym kodekiem, takim jak PNG.
źródło
Matematyka
Definiujemy funkcję pomocnika
h
i funkcję szyfrowaniascramble
jako:Po załadowaniu obrazu można nazwać
scramble[img, k]
gdziek
jest dowolną liczbą całkowitą, wspiąć się obraz. Ponowne wywołanie z-k
rozszyfruje. (Jeślik
tak0
, to nie wprowadza się żadnych zmian.) Zazwyczajk
należy wybrać coś podobnego100
, co daje dość zakodowany obraz:źródło
Matlab: Mieszanie wierszy i kolumn na podstawie niezmienności sum wierszy / kolumn
To wydawało się zabawną łamigłówką, więc pomyślałem o tym i wymyśliłem następującą funkcję. Opiera się na niezmienności sum pikselowych wartości wierszy i kolumn podczas przesunięcia kołowego: przesuwa każdy wiersz, a następnie każdą kolumnę o całkowitą sumę wartości pikseli rzędu / kolumny (przyjmując uint8 dla liczby całkowitej w zmiennej shift ). Można to następnie odwrócić, przesuwając każdą kolumnę, a następnie rząd o ich wartość sumaryczną w przeciwnym kierunku.
Nie jest tak ładny jak inne, ale podoba mi się, że jest nieprzypadkowy i w pełni określony przez obraz - bez wybierania parametrów.
Pierwotnie zaprojektowałem go, aby przesuwał każdy kanał kolorów osobno, ale potem zauważyłem specyfikację, aby przenosić tylko pełne piksele.
źródło
Jawa
Ten program losowo zamienia piksele (tworzy odwzorowanie piksel na piksel), ale zamiast funkcji losowej używa Math.sin () (liczba całkowita x). Jest w pełni odwracalny. Z obrazami testowymi tworzy pewne wzory.
Parametry: liczba całkowita (liczba przebiegów, liczba ujemna do odwrócenia, 0 nic nie robi), mag wejściowy i obraz wyjściowy (mogą być takie same). Plik wyjściowy powinien być w formacie wykorzystującym bezstratną kompresję.
1 przejście:
100 podań (zajmuje to kilka minut):
Kod:
źródło
Python 2.7 z PIL
Trochę późno na imprezę, ale pomyślałem, że fajnie byłoby przekonwertować obrazy na pledy (i oczywiście z powrotem). Najpierw przesuwamy kolumny w górę lub w dół o 4 razy liczbę kolumn (parzyste kolumny w dół, nieparzyste kolumny w górę). Następnie przesuwamy wiersze w lewo lub w prawo o 4-krotność numeru wiersza (parzyste kolumny w lewo, nieparzyste kolumny w prawo).
Rezultat jest dość tartański.
Aby odwrócić, po prostu robimy to w odwrotnej kolejności i przesuwamy o przeciwną wartość.
Kod
Wyniki
Plaid z obrazka 1:
Obraz w kratę 2:
źródło
offset = x*xsize/ysize
i,offset = y*ysize/xsize
ale tak naprawdę nie ukrywa to również obrazu, niestety.Python (+ bonus) - permutacja pikseli
W tej metodzie każdy piksel zostanie umieszczony w innej pozycji, z tym że drugi piksel zostanie umieszczony w pierwszej pozycji. Matematycznie jest to permutacja o długości cyklu 2. W związku z tym metoda jest odwrotna.
Patrząc wstecz, jest bardzo podobny do mfvonh, ale to przesłanie jest w Pythonie i sam musiałem zbudować tę permutację.
Pierwszy obraz testowy: Drugi obraz testowy:
źródło
Python 2.7 + PIL, Inspiracja z przesuwanych puzzli
Właśnie miałem inny pomysł. Zasadniczo ta metoda dzieli obraz na bloki o równej wielkości, a następnie tasuje ich kolejność. Ponieważ nowe zamówienie opiera się na stałym ziarnie, możliwe jest całkowite cofnięcie procesu przy użyciu tego samego ziarna. Poza tym dzięki dodatkowemu parametrowi zwanemu ziarnistością możliwe jest uzyskanie różnych i nierozpoznawalnych wyników.
Wyniki:
Oryginał
Ziarnistość 16
Ziarnistość 13
Ziarnistość 10
Ziarnistość 3
Ziarnistość 2
Ziarnistość 1
Oryginał
Ziarnistość 16
Ziarnistość 13
Ziarnistość 10
Ziarnistość 3
Ziarnistość 2
Ziarnistość 1
Kod:
źródło
47
94 linie. 47 do kodowania, 47 do dekodowania.
codegolf-35005_ref.rb
(przekonwertowane na jpg)
(oryginał zmniejszony)
źródło
Matlab ze szczyptą teorii grupy (+ bonus)
W tym podejściu zakładamy, że mamy parzystą liczbę wszystkich pikseli. (Jeśli nie, po prostu ignorujemy jeden piksel). Musimy więc wybrać połowę pikseli, aby zamienić drugą połowę. Do tego mamy indeksowania wszystkich pikseli od
0
góry do2N-1
i rozważenia tych indeksów jako grupy cyklicznej.Wśród liczb pierwszych szukamy liczby,
p
która nie jest zbyt mała i nie jest zbyt duża, a więc jest zgodna2N
z porządkiem naszej grupy. Oznacza to, żeg
generuje naszą grupę lub{k*g mod 2N | k=0,1,...,2N-1} = {0,1,...,2N-1}
.Wybieramy więc pierwsze
N
wielokrotnościg
jednego zestawu, a wszystkie pozostałe indki jako drugi zestaw, i po prostu zamieniamy odpowiedni zestaw pikseli.Jeśli
p
zostanie wybrany we właściwy sposób, pierwszy zestaw zostanie równomiernie rozłożony na cały obraz.Dwa przypadki testowe:
Nieco tematyczny, ale interesujący:
Podczas testów zauważyłem, że jeśli zapiszesz go w (bezstratnie skompresowanym) jpg (zamiast bezstratnie skompresowanego png) i zastosujesz transformację tam iz powrotem, dość szybko zobaczysz artefakty kompresji, to pokazuje wyniki dwóch kolejnych przestawień :
Jak widać, kompresja jpg sprawia, że wynik wygląda prawie czarno-biały!
źródło
JavaScript (+ bonus) - repeater dzielenia pikseli
źródło
Python 2.7 + PIL, szyfrator kolumn / wierszy
Ta metoda po prostu szyfruje wiersze i kolumny obrazu. Możliwe jest szyfrowanie tylko jednego z wymiarów lub obu. Poza tym kolejność nowego zakodowanego wiersza / kolumny zależy od hasła. Inną możliwością jest szyfrowanie całej tablicy obrazów bez uwzględnienia wymiarów.
Wyniki:
Mieszanie całego obrazu:
Mieszanie kolumn:
Wymieszać rzędy:
Mieszanie zarówno kolumn, jak i wierszy:
Próbowałem również zastosować kilka przebiegów do obrazu, ale wyniki końcowe nie różniły się zbytnio, tylko trudność w odszyfrowaniu.
Kod:
źródło
C # Winforms
Zdjęcie 1:
Zdjęcie 2:
Kod źródłowy:
źródło
Python 3.6 + pypng
Riffle / Master Shuffle
Mój algorytm stosuje losowanie losowe w jednym kierunku i losowe w drugim (ponieważ oba są odwrotnymi względem siebie), po kilka iteracji, ale każda jest uogólniona w celu podzielenia na dowolną liczbę podgrup zamiast tylko dwóch. W efekcie można utworzyć klucz permutacji z wieloma iteracjami, ponieważ obraz nie zostanie przywrócony bez znajomości dokładnej kolejności losowania riffle i master. Sekwencję można określić za pomocą szeregu liczb całkowitych, przy czym liczby dodatnie reprezentują riffy, a liczby ujemne - wzorce.
Przetasowałem krajobraz kluczem [3, -5, 2, 13, -7]:
Co ciekawe, niektóre interesujące rzeczy pochodzą z [3, -5], gdzie pozostały artefakty z oryginalnego obrazu:
Oto abstrakcyjny wzór tasowany klawiszem [2, 3, 5, 7, -11, 13, -17]:
Jeśli tylko jeden parametr jest niepoprawny w kluczu, odtwarzanie losowe nie przywróci obrazu:
źródło