Erstellen Sie ein Programm, mit dem Sie Pixel im Bild neu anordnen können, damit es nicht erkannt wird. Ihr Programm sollte es jedoch wieder in das Originalbild konvertieren können.
Sie können zwei Funktionen schreiben - zum Kodieren und Dekodieren, aber eine Funktion, die wiederholt angewendet wurde, ergibt das Originalbild (Beispiel in Mathe - f(x) = 1 - x
), ist ein Bonus.
Das Erzeugen eines Musters in der Ausgabe gibt auch einen Bonus.
Das Bild kann als 1D / 2D-Array oder Bildobjekt dargestellt werden, wenn Ihre Sprache dies unterstützt. Beachten Sie, dass Sie nur die Reihenfolge der Pixel ändern können!
Es wird logisch sein, als Gewinnercode einen Code zu wählen, der ein weniger erkennbares Bild erzeugt. Ich weiß jedoch nicht, wie ich es genau messen soll. Alle Möglichkeiten, die ich mir vorstellen kann, können betrogen werden. Aus diesem Grund habe ich diese Frage als Beliebtheitswettbewerb ausgewählt - lassen Sie die Benutzer die beste Antwort auswählen!
Testbild 1 (800 x 422 px): Testbild 2 (800 x 480 px): Bitte geben Sie ein Code-Ausgabebild an.
quelle
Antworten:
Python 2.7 (mit PIL) - Keine Pseudozufälligkeit
Ich zerlege das Bild in 2 mal 2 Blöcke (den Rest ignorierend) und drehe jeden Block um 180 Grad, dann mache ich dasselbe mit 3 mal 3 Blöcken, dann 4 usw. bis zu einem gewissen Parameter BLKSZ. Dann mache ich dasselbe für BLKSZ-1, dann BLKSZ-2, bis hinunter zu 3, dann 2. Diese Methode kehrt sich genau um; Die Uncramble-Funktion ist die Scramble-Funktion.
Der Code :
Abhängig von der Blockgröße können Sie die Berechnung so einstellen, dass alle Ähnlichkeiten mit dem Originalbild beseitigt werden: (BLKSZ = 50)
Oder machen Sie die Berechnung effizient: (BLKSZ = 10)
quelle
BLKSZ = 10
Landschaft ist wirklich cool!C #, Winform
Bearbeiten Wenn Sie die Art und Weise ändern, in der Sie das Koordinatenfeld ausfüllen, können Sie verschiedene Muster verwenden (siehe unten)
Magst du diese Art von Muster?
Bonus:
Tauschen Sie alle Pixel in der oberen Hälfte genau einmal mit allen Pixeln in der unteren Hälfte aus. Wiederholen Sie das gleiche Verfahren zum Entschlüsseln (Bonus).
Code
Scramble.cs
Scramble.designer.cs
Program.cs
Überprüfen Sie 'Unsicherer Code' in der Projekteigenschaft zum Kompilieren.
Komplexes Muster
Ändern Sie den ersten Teil der Arbeitsfunktion in Application.DoEvents:
quelle
C, willkürliche Unschärfe, leicht umkehrbar
Spät zur Party. Hier ist mein Eintrag!
Diese Methode führt eine Verwacklungsunschärfe aus. Ich nenne es Scramblur . Es ist sehr einfach. In einer Schleife wählt es ein zufälliges Pixel aus und tauscht es dann mit einem zufällig ausgewählten Pixel in der Nähe in einem torusförmigen Canvas-Modell aus. Sie legen den maximalen Abstand fest, der definiert, was "Pixel in der Nähe" bedeutet (1 bedeutet, dass immer ein benachbartes Pixel ausgewählt wird), die Anzahl der Iterationen und optional einen Startwert für eine Zufallszahl. Je größer der maximale Abstand und je größer die Anzahl der Iterationen ist, desto unschärfer ist das Ergebnis.
Sie kann durch Angabe einer negativen Anzahl von Iterationen rückgängig gemacht werden (dies ist lediglich eine bequeme Befehlszeilenschnittstelle; es gibt tatsächlich keine negativen Iterationen). Intern verwendet es ein benutzerdefiniertes 64-Bit-LCPRNG (Generator für lineare kongruente Pseudozufallszahlen) und generiert einen Werteblock vor. Die Tabelle ermöglicht das Durchlaufen des Blocks entweder vorwärts oder rückwärts zum Verwürfeln bzw. zum Aufheben der Verwürfelung.
Demo
Bei den ersten beiden Bildern wird beim Scrollen nach unten jedes Bild mit einem höheren maximalen Versatz verwischt: Oberstes Bild ist das Originalbild (z. B. 0-Pixel-Versatz), gefolgt von 1, 2, 4, 8, 16, 32, 64 , 128 und schließlich 256. Die Iterationszahl beträgt 10⁶ = 1.000.000 für alle Bilder unten.
Bei den zweiten beiden Bildern wird jedes Bild mit einem progressiv niedrigeren Versatz (z. B. vom verschwommensten zum am wenigsten verschwommenen) von maximal 256 bis hinunter zu 0 verwischt . Viel Spaß!
Und für diese beiden nächsten Bilder können Sie die Progressionen hier und hier in voller Größe sehen :
Code
Ich habe das in ungefähr einer Stunde zusammen gehackt, als ich heute Morgen aufgewacht bin, und es enthält fast keine Dokumentation. Ich werde vielleicht in ein paar Tagen zurückkommen und später weitere Unterlagen hinzufügen, wenn die Leute es anfordern.
quelle
Python 3.4
Bei Erreichen von Bonus 2 durch Verwendung eines zusätzlichen Schlüsselbildes geht Bonus 1 nicht verloren. Das Programm ist immer noch selbstinvers, sofern es erneut mit demselben Schlüsselbild ausgeführt wird.
Standardgebrauch
Testbild 1:
Testbild 2:
Wenn Sie das Programm mit einer einzelnen Bilddatei als Argument ausführen, wird eine Bilddatei gespeichert, deren Pixel gleichmäßig über das gesamte Bild verteilt sind. Wenn Sie es mit der verschlüsselten Ausgabe erneut ausführen, wird eine Bilddatei mit der erneut angewendeten Verschlüsselung gespeichert, wodurch das Original wiederhergestellt wird, da der Verschlüsselungsprozess seine eigene Umkehrung darstellt.
Der Scrambling-Prozess ist selbstinvers, da die Liste aller Pixel in 2 Zyklen aufgeteilt ist, so dass jedes Pixel mit einem und nur einem anderen Pixel ausgetauscht wird. Wenn Sie es ein zweites Mal ausführen, wird jedes Pixel mit dem Pixel ausgetauscht, mit dem es zuerst ausgetauscht wurde, und alles wird auf den ursprünglichen Zustand zurückgesetzt. Wenn es eine ungerade Anzahl von Pixeln gibt, wird es eines geben, das sich nicht bewegt.
Dank der Antwort von mfvonh als erstem, der 2 Zyklen vorschlägt.
Verwendung mit einem Schlüsselbild
Scrambling Testbild 1 mit Testbild 2 als Schlüsselbild
Scrambling Testbild 2 mit Testbild 1 als Schlüsselbild
Wenn Sie das Programm mit einem zweiten Argument für eine Bilddatei (dem Schlüsselbild) ausführen, wird das Originalbild basierend auf dem Schlüsselbild in Bereiche unterteilt. Jede dieser Regionen ist separat in 2 Zyklen unterteilt, so dass das gesamte Verwürfeln innerhalb von Regionen auftritt und Pixel nicht von einer Region zu einer anderen verschoben werden. Dadurch werden die Pixel über jede Region verteilt, und die Regionen erhalten eine einheitliche gesprenkelte Farbe, jedoch mit einer geringfügig unterschiedlichen Durchschnittsfarbe für jede Region. Dies gibt eine sehr grobe Annäherung an das Schlüsselbild in den falschen Farben.
Bei erneuter Ausführung werden dieselben Pixelpaare in jeder Region ausgetauscht, sodass jede Region in ihren ursprünglichen Zustand zurückgesetzt wird und das Bild als Ganzes wieder angezeigt wird.
Dank der Antwort von edc65 als erstem Vorschlag, das Bild in Regionen zu unterteilen. Ich wollte dies erweitern, um beliebige Regionen zu verwenden, aber der Ansatz, alles in Region 1 mit allem in Region 2 zu tauschen, bedeutete, dass die Regionen von identischer Größe sein mussten. Meine Lösung besteht darin, die Regionen voneinander isoliert zu halten und einfach jede Region in sich selbst zu mischen. Da Regionen nicht länger von ähnlicher Größe sein müssen, wird es einfacher, beliebig geformte Regionen anzuwenden.
Code
Brennen von JPEG-Bildern
.jpg-Dateien werden sehr schnell verarbeitet, jedoch auf Kosten der Überhitzung. Dies hinterlässt ein eingebranntes Nachbild, wenn das Original wiederhergestellt wird:
Im Ernst, ein verlustbehaftetes Format führt dazu, dass einige der Pixelfarben geringfügig geändert werden, wodurch die Ausgabe an sich ungültig wird. Wenn ein Schlüsselbild verwendet wird und das Mischen von Pixeln auf Regionen beschränkt ist, wird die gesamte Verzerrung in der Region beibehalten, in der sie aufgetreten ist, und verteilt sich dann gleichmäßig über diese Region, wenn das Bild wiederhergestellt wird. Der Unterschied in der durchschnittlichen Verzerrung zwischen Regionen lässt einen sichtbaren Unterschied zwischen ihnen übrig, so dass die Regionen, die beim Verwürfelungsprozess verwendet werden, im wiederhergestellten Bild immer noch sichtbar sind.
Durch die Konvertierung in das PNG-Format (oder in ein verlustfreies Format) vor dem Verschlüsseln wird sichergestellt, dass das unverschlüsselte Bild mit dem Original identisch ist und weder Brennen noch Verzerren auftritt:
Kleine Details
quelle
Hier ist eine nicht zufällige Transformation für eine Änderung
nx
malny
malDie Transformation ist fast selbstinvertierend und wiederholt die Transformation insgesamt
size_x
mehrmals (in x-Richtung), um das Originalbild zurückzugeben. Ich habe die exakte Mathematik nicht herausgefunden, aber die Verwendung eines ganzzahligen Vielfachen vonint(log_2(size_x))
ergibt das beste Mischen mit den kleinsten GeisterbildernSo sehen die ersten Schritte 20 Iterationen aus (nx = ny, beachten Sie den Effekt verschiedener Auflösungen)
quelle
Mathematica
Das ist ziemlich einfach. Ich wähle
5 * nPixels
zufällige Koordinatenpaare aus und tausche diese beiden Pixel aus (was das Bild komplett verdeckt). Um es zu entschlüsseln, mache ich dasselbe in umgekehrter Reihenfolge. Natürlich muss ich den PRNG setzen, um in beiden Schritten die gleichen Koordinatenpaare zu erhalten.Der einzige Unterschied zwischen den beiden Funktionen liegt
Reverse@
inunscramble
. Beide Funktionen nehmen ein aktuelles Bildobjekt auf. Sie können sie wie folgt verwenden:out
undin
sind identisch. Soscr
sieht es aus:quelle
FindPermutation
?{c, a, b}[[{2, 3, 1}]]
verwendet werden kann?C # (+ Bonus für symmetrischen Algorithmus)
Dies funktioniert, indem ein
x
solches gefundenx^2 == 1 mod (number of pixels in image)
und dann der Index jedes Pixels mit multipliziert wirdx
, um seine neue Position zu finden. Auf diese Weise können Sie mit genau demselben Algorithmus ein Bild ver- und entschlüsseln.quelle
1
(Originalbild) undmodulo-1
(invertiertes / umgekehrtes Bild) geben. Die meisten Zahlen haben nicht-triviale Lösungen, aber es scheint einige Ausnahmen zu geben . (im Zusammenhang mit der Primfaktorisierung vonmodulo
)1
das Originalbild aus und-1
gibt z. B. imgur.com/EiE6VW2C #, selbstinvers, keine Zufälligkeit
Wenn das Originalbild Dimensionen mit Zweierpotenzen hat, wird jede Zeile und Spalte mit der Zeile und Spalte mit dem umgekehrten Bitmuster ausgetauscht, z. B. für ein Bild mit einer Breite von 256, dann wird Zeile 0xB4 mit Zeile 0x2D ausgetauscht. Bilder anderer Größen werden in Rechtecke mit Zweierpotenzseiten aufgeteilt.
Erstes Bild:
Zweites Bild:
quelle
C #
Gleiche Methode für das Scrambling und Uncrambling. Ich würde mich über Verbesserungsvorschläge freuen.
Die Ausgabe führt zu einem psychedelischen Plaid
quelle
Python 2 (selbstinvers, keine Zufälligkeit, kontextsensitiv)
Dies wird keine Preise für "am wenigsten erkennbar" gewinnen, aber vielleicht kann es als "interessant" punkten. :-)
Ich wollte etwas kontextsensitives machen, bei dem das Verwürfeln der Pixel tatsächlich vom Bild selbst abhängt.
Die Idee ist ganz einfach: Sortieren Sie alle Pixel nach einem beliebigen Wert, der sich aus der Farbe des Pixels ergibt, und tauschen Sie dann die Positionen des ersten Pixels in dieser Liste mit dem letzten, des zweiten mit dem vorletzten und so weiter.
Leider gibt es bei diesem einfachen Ansatz ein Problem mit Pixeln der gleichen Farbe, so dass mein Programm ein bisschen komplizierter wurde, um es selbstinvers zu machen ...
Das ist das Ergebnis:
Sie können ganz unterschiedliche Ergebnisse erzielen, indem Sie die Hash-Funktion ändern
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
:quelle
Mathematica (+ Bonus)
Dies reduziert die Farbkanäle und verschlüsselt das Bild als eine lange Liste von Daten. Das Ergebnis ist eine noch weniger erkennbare verschlüsselte Version, da sie nicht die gleiche Farbverteilung wie das Original aufweist (da diese Daten ebenfalls verschlüsselt wurden). Dies ist am deutlichsten in dem zweiten verschlüsselten Bild zu erkennen, aber wenn Sie genau hinsehen, werden Sie den gleichen Effekt auch in dem ersten sehen. Die Funktion ist eine eigene Inverse.
Es gab einen Kommentar, dass dies möglicherweise nicht gültig ist, da pro Kanal verschlüsselt wird. Ich denke es sollte sein, aber es ist keine große Sache. Die einzige Änderung, die notwendig ist, um ganze Pixel (anstatt pro Kanal) zu verschlüsseln, ist die Änderung
Flatten @ x
aufFlatten[x, 1]
:)Erläuterung
Definiert eine Funktion
f
, die ein zweidimensionales Array annimmtx
. Die Funktion verwendet das Produkt der Bildabmessungen als zufälligen Startwert und fasst das Array dann zu einer eindimensionalen Listef
(lokal schattiert) zusammen. Dann wird eine Liste des Formulars erstellt,{1, 2, ... n}
in dern
die Länge derf
Liste angegeben ist. Diese Liste wird zufällig permutiert, in Segmente von 2 unterteilt (z. B. "{{1, 2}, {3, 4}, ...}
Letzte Zahl löschen", wenn beide Dimensionen ungerade sind). Anschließend wird die Liste permutiert,f
indem die Werte bei vertauscht werden Die in jeder soeben erstellten Unterliste angegebenen Positionen und schließlich die Neuformung der permutierten Liste auf die ursprünglichen reduzieren auch die Kanaldatenx
. es pro Kanal verwürfelt , weil zusätzlich zu den Bildabmessungen Kollabieren derFlatten
Befehl reduziert auch die Kanaldaten in jedem Pixel. Die Funktion ist ihre eigene Inverse, da die Zyklen jeweils nur zwei Pixel enthalten.Verwendungszweck
Hier wird verwendet
Flatten[x, 1]
.quelle
f @ f @ img1 // Image
ist (in voller Syntax)Image[f[f[img1]]]
Matlab (+ Bonus)
Grundsätzlich wechsle ich die Position von zwei Pixeln nach dem Zufallsprinzip und markiere jedes Pixel, das geschaltet wurde, damit es nicht erneut geschaltet wird. Dasselbe Skript kann erneut für die 'Entschlüsselung' verwendet werden, da ich den Zufallszahlengenerator jedes Mal zurücksetze. Dies geschieht, bis fast alle Pixel umgeschaltet sind (deshalb ist die Schrittweite größer als 2).
EDIT: Habe gerade gesehen, dass Martin Büttner einen ähnlichen Ansatz gewählt hat - ich hatte nicht vor, die Idee zu kopieren - ich habe angefangen, meinen Code zu schreiben, als es keine Antworten gab. Tut mir leid. Ich denke immer noch, dass meine Version einige andere Ideen verwendet =) (Und mein Algorithmus ist weitaus ineffizienter, wenn man sich das Bit ansieht, bei dem die zwei zufälligen Koordinaten ausgewählt werden ^^)
Bilder
Code
quelle
Mathematica - Verwende eine Permutation zum Verwürfeln und ihre Umkehrung zum Entschlüsseln.
Ein JPG-Bild ist eine dreidimensionale Anordnung von
{r,g,b}
Pixelfarben. (Die drei Dimensionen strukturieren die Pixelmenge nach Zeile, Spalte und Farbe.) Es kann zu einer Liste von{r,g,b}
Tripeln zusammengefasst, dann gemäß einer "bekannten" Zyklusliste permutiert und schließlich zu einem Array mit den ursprünglichen Abmessungen wieder zusammengesetzt werden. Das Ergebnis ist ein verschlüsseltes Bild.Beim Entschlüsseln wird das verschlüsselte Bild mit der Umkehrung der Zyklusliste verarbeitet. Es gibt ja das ursprüngliche Bild aus.
Eine einzige Funktion (im vorliegenden Fall
scramble
) dient also zum Verwürfeln und Entschlüsseln von Pixeln in einem Bild.Ein Bild wird zusammen mit einer Startnummer eingegeben (um sicherzustellen, dass sich der Zufallszahlengenerator beim Verwürfeln und Entwürfeln im gleichen Zustand befindet). Wenn der Parameter reverse auf False gesetzt ist, wird die Funktion verschlüsselt. Wenn es wahr ist, wird die Funktion entschlüsseln.
Gerangel
Die Pixel werden abgeflacht und eine zufällige Liste von Zyklen wird erzeugt. Permute verwendet Zyklen, um die Position von Pixeln in der reduzierten Liste zu ändern.
entschlüsseln
scramble
Dieselbe Funktion wird zum Entschlüsseln verwendet. Die Reihenfolge der Zyklusliste ist jedoch umgekehrt.Beispiele
Das gleiche Saatgut (37) wird zum Verwürfeln und Entwürfeln verwendet.
Dies erzeugt das verwürfelte Bild des Berges. Das Bild unten zeigt, dass die Variable scrambledMount durch das tatsächliche Bild der Bergszene ersetzt werden kann.
Nun führen wir das Inverse aus; scrambledMount wird eingegeben und das ursprüngliche Bild wird wiederhergestellt.
Gleiches gilt für die Kreise:
quelle
Python
Ich mag dieses Rätsel, er schien interessant zu sein und ich kam mit einer Wickel- und Bewegungsfunktion, um es auf das Bild anzuwenden.
Gewickelt
Ich lese das Bild als Text (von links nach rechts, auf und ab) und schreibe es als Schneckenhaus.
Diese Funktion ist zyklisch: In N gibt es zum Beispiel f ^ (n) (x) = x für ein Bild von 4 * 2, f (f (f (x))) = x
Bewegung
Ich nehme eine Zufallszahl und verschiebe jede Spalte und ligne daraus
Code
Bilder
Erste Umdrehung:
dann Permutation:
Und beim letzten Wechsel:
Wie für das andere Beispiel:
quelle
VB.NET (+ Bonus)
Dies basiert auf der Idee von flawr, verwendet jedoch einen anderen Austausch- und Überprüfungsalgorithmus. Das Programm codiert und decodiert auf die gleiche Weise.
Bilder ausgeben:
quelle
Nachdem ich daran erinnert wurde, dass dies im Begriff ist, die Pixel zu tauschen und nicht zu ändern, ist hier meine Lösung dafür:
Verschlüsselt:
Restauriert:
Dies geschieht durch Randomisierung der Pixelreihenfolge. Um sie jedoch wiederherstellen zu können, ist die Randomisierung festgelegt. Dies geschieht durch Verwendung eines Pseudozufalls mit einem festen Startwert und durch Generieren einer Liste von Indizes, die beschreiben, welche Pixel ausgetauscht werden sollen. Da der Austausch identisch ist, wird mit derselben Liste das ursprüngliche Image wiederhergestellt.
Beachten Sie, dass die Verwendung dieses Algorithmus bei einem verlustbehafteten Komprimierungsformat nicht zum gleichen Ergebnis führt, da das Bildformat die Daten verändert. Dies sollte mit jedem verlustfreien Codec wie PNG gut funktionieren.
quelle
Mathematica
Wir definieren eine Hilfsfunktion
h
und die Verwürfelungsfunktionscramble
als:Ein Bild nach dem Laden, können Sie anrufen ,
scramble[img, k]
wok
eine ganze Zahl ist, das Bild unkenntlich zu machen . Ein erneuter Anruf mit-k
entschlüsselt. (Wennk
ja0
, dann wird keine Änderung vorgenommen.) Normalerweisek
sollte so etwas gewählt werden100
, das ein ziemlich durcheinandergebrachtes Bild ergibt:quelle
Matlab: Zeilen- und Spalten-Scrambling basierend auf Zeilen- / Spalten-Summen-Invarianzen
Das schien ein lustiges Puzzle zu sein, also habe ich es mir überlegt und mir die folgende Funktion ausgedacht. Es basiert auf der Invarianz von Zeilen- und Spaltenpixelwertsummen während des zirkularen Verschiebens: Es verschiebt jede Zeile und dann jede Spalte um die Gesamtsumme der Pixelwerte der Zeile / Spalte (unter der Annahme eines uint8 für eine ganze Zahl in der Verschiebungsvariablen) ). Dies kann dann umgekehrt werden, indem jede Spalte und Zeile um ihren Summenwert in die entgegengesetzte Richtung verschoben wird.
Es ist nicht so hübsch wie die anderen, aber ich mag es, dass es nicht zufällig ist und vom Bild vollständig spezifiziert wird - keine Auswahlparameter.
Ich habe es ursprünglich so entworfen, dass jeder Farbkanal separat verschoben wird, aber dann ist mir aufgefallen, dass nur ganze Pixel verschoben werden sollen.
quelle
Java
Dieses Programm tauscht zufällig Pixel aus (erstellt Pixel-zu-Pixel-Mapping), verwendet jedoch anstelle der Zufallsfunktion Math.sin () (Ganzzahl x). Es ist vollständig umkehrbar. Mit Testbildern werden einige Muster erstellt.
Parameter: Ganzzahl (Anzahl der Durchgänge, negative Zahl für Rückwärtsfahrt, 0 macht nichts), Eingabemagier und Ausgabebild (können identisch sein). Die Ausgabedatei sollte ein Format haben, das verlustfreie Komprimierung verwendet.
1 Durchgang:
100 Pässe (es dauert ein paar Minuten):
Code:
quelle
Python 2.7 mit PIL
Ein bisschen zu spät zur Party, aber ich dachte, es würde Spaß machen, die Bilder in Plaids umzuwandeln (und natürlich zurück). Zuerst verschieben wir die Spalten um das 4-fache nach oben oder unten (gerade Spalten nach unten, ungerade Spalten nach oben). Dann verschieben wir die Zeilen nach links oder rechts um das Vierfache der Zeilennummer (gerade Spalten nach links, ungerade Spalten nach rechts).
Das Ergebnis ist ziemlich tartanisch.
Umgekehrt tun wir dies einfach in umgekehrter Reihenfolge und verschieben uns um den entgegengesetzten Betrag.
Code
Ergebnisse
Das Plaid aus Bild 1:
Das karierte Bild 2:
quelle
offset = x*xsize/ysize
und ändernoffset = y*ysize/xsize
. Leider wird das Bild dadurch auch nicht wirklich ausgeblendet.Python (+ Bonus) - Permutation der Pixel
Bei dieser Methode wird jedes Pixel an einer anderen Position platziert, mit der Einschränkung, dass das andere Pixel an der ersten Position platziert wird. Mathematisch handelt es sich um eine Permutation mit der Zykluslänge 2. Die Methode ist als solche eine eigene Inverse.
Rückblickend ist es mfvonh sehr ähnlich, aber diese Vorlage ist in Python und ich musste diese Permutation selbst konstruieren.
Erstes Testbild: Zweites Testbild:
quelle
Python 2.7 + PIL, Inspiration von den Schiebepuzzles
Hatte gerade eine andere Idee. Grundsätzlich unterteilt diese Methode ein Bild in gleich große Blöcke und mischt dann deren Reihenfolge. Da die neue Reihenfolge auf einem festen Startwert basiert, kann der Vorgang mit demselben Startwert vollständig rückgängig gemacht werden. Außerdem können mit dem zusätzlichen Parameter Granularität unterschiedliche und nicht erkennbare Ergebnisse erzielt werden.
Ergebnisse:
Original
Granularität 16
Granularität 13
Granularität 10
Granularität 3
Granularität 2
Granularität 1
Original
Granularität 16
Granularität 13
Granularität 10
Granularität 3
Granularität 2
Granularität 1
Code:
quelle
47
94 Zeilen. 47 zum Codieren, 47 zum Decodieren.
codegolf-35005_ref.rb
(konvertiert zu jpg)
(Original verkleinert)
quelle
Matlab mit einer Prise Gruppentheorie (+ Bonus)
Bei diesem Ansatz nehmen wir an, dass wir eine gerade Anzahl von Gesamtpixeln haben. (Wenn nicht, ignorieren wir einfach ein Pixel.) Wir müssen also die Hälfte der Pixel auswählen, um sie mit der anderen Hälfte zu tauschen. Dazu indizieren wir alle Pixel von
0
bis zu2N-1
und betrachten diese Indizes als zyklische Gruppe.Unter den Primzahlen suchen wir nach einer Zahl
p
, die nicht zu klein und nicht zu groß ist und die2N
der Ordnung unserer Gruppe entspricht. Dies bedeutet,g
erzeugt unsere Gruppe oder{k*g mod 2N | k=0,1,...,2N-1} = {0,1,...,2N-1}
.Also wählen wir die ersten
N
Vielfachen vong
als eine Menge und alle verbleibenden Indices als die andere Menge und tauschen einfach die entsprechende Menge von Pixeln aus.Bei
p
richtiger Wahl wird der erste Satz gleichmäßig über das gesamte Bild verteilt.Die beiden Testfälle:
Etwas abseits des Themas, aber interessant:
Während des Tests habe ich festgestellt, dass, wenn Sie es in einem (verlustbehafteten komprimierten) JPG (anstelle eines verlustfrei komprimierten PNG) speichern und die Transformation hin und her anwenden, Sie ziemlich schnell Artefakte der Komprimierung sehen, die Ergebnisse zweier aufeinanderfolgender Neuanordnungen :
Wie Sie sehen können, sieht das Ergebnis durch die JPG-Komprimierung fast schwarzweiß aus!
quelle
JavaScript (+ Bonus) - Pixel Divide Swap Repeater
quelle
Python 2.7 + PIL, Spalten- / Zeilen-Scrambler
Diese Methode verschlüsselt einfach die Zeilen und Spalten des Bildes. Es ist möglich, nur eine der Dimensionen oder beide zu verschlüsseln. Außerdem basiert die Reihenfolge der neuen verschlüsselten Zeile / Spalte auf einem Passwort. Eine weitere Möglichkeit ist das Verwürfeln des gesamten Bildarrays ohne Berücksichtigung der Abmessungen.
Ergebnisse:
Scrambling das gesamte Bild:
Scrambling die Spalten:
Scrambling die Zeilen:
Scrambling sowohl Spalten als auch Zeilen:
Ich habe auch versucht, mehrere Läufe auf das Bild anzuwenden, aber die Endergebnisse unterschieden sich nicht sehr, nur die Schwierigkeit, es zu entschlüsseln.
Code:
quelle
C # Winforms
Bild1:
Bild 2:
Quellcode:
quelle
Python 3.6 + Pypng
Riffle / Master Shuffle
Mein Algorithmus wendet das Riffle-Shuffle in eine Richtung und ein Master-Shuffle in die andere Richtung an (da die beiden Inversen voneinander sind), wobei jede Iteration in eine beliebige Anzahl von Untergruppen anstatt nur in zwei aufgeteilt wird. Der Effekt ist, dass Sie einen Permutationsschlüssel mit mehreren Iterationen erstellen können, da das Bild nicht wiederhergestellt werden kann, ohne die genaue Reihenfolge von Riffle- und Master-Shuffles zu kennen. Eine Sequenz kann mit einer Reihe von Ganzzahlen angegeben werden, wobei positive Zahlen Riffles und negative Zahlen Master darstellen.
Ich habe die Landschaft mit der Taste [3, -5, 2, 13, -7] gemischt:
Interessanterweise passieren einige interessante Dinge aus [3, -5], wobei einige Artefakte aus dem Originalbild übrig bleiben:
Hier ist das abstrakte Muster, das mit der Taste [2, 3, 5, 7, -11, 13, -17] gemischt wird:
Wenn nur ein Parameter im Schlüssel falsch ist, wird das Image durch das Zurückmischen nicht wiederhergestellt:
quelle