Créez un programme capable de réorganiser les pixels dans une image de sorte qu'il ne puisse pas être reconnu. Cependant, votre programme devrait pouvoir le reconvertir en image originale.
Vous pouvez écrire deux fonctions - pour l’encodage et le décodage. Cependant, une fonction appliquée de manière répétée à l’image originale (exemple en mathématiques - f(x) = 1 - x
) est un bonus.
Produire également un motif en sortie donne aussi un bonus.
L'image peut être représentée sous forme de tableau 1D / 2D ou d'objet image si votre langage le prend en charge. Notez que vous ne pouvez changer que l'ordre des pixels!
Sera logique de choisir comme code gagnant qui produit une image moins reconnaissable. Cependant, je ne sais pas comment le mesurer exactement, toutes les manières que je peux imaginer peuvent être trompées. C'est pourquoi j'ai choisi cette question comme concours de popularité. Laissez les utilisateurs choisir la meilleure réponse!
Image de test 1 (800 x 422 px): Image de test 2 (800 x 480 px): Veuillez fournir une image de sortie du code.
Réponses:
Python 2.7 (avec PIL) - Pas de pseudo-aléatoire
Je casse l'image en blocs de 2 sur 2 (sans tenir compte du reste) et tourne chaque bloc de 180 degrés, puis je fais la même chose avec des blocs de 3 sur 3, puis de 4, etc., jusqu'à un paramètre BLKSZ. Ensuite, je fais la même chose pour BLKSZ-1, puis BLKSZ-2, puis 3 et 2. Cette méthode s’inverse exactement; la fonction Unscramble est la fonction Scramble.
Le code :
En fonction de la taille des blocs, vous pouvez faire en sorte que le calcul supprime toute ressemblance avec l'image d'origine: (BLKSZ = 50)
Ou rendre le calcul efficace: (BLKSZ = 10)
la source
BLKSZ = 10
paysage est vraiment cool!C #, Winform
Modifier En changeant la manière dont vous remplissez le tableau de coordonnées, vous pouvez avoir différents modèles - voir ci-dessous
Aimez-vous ce genre de motif?
Prime:
Échange aléatoire exactement une fois tous les pixels de la moitié supérieure et tous les pixels de la moitié inférieure. Répétez la même procédure pour déchiffrer (bonus).
Code
Scramble.cs
Scramble.designer.cs
Program.cs
Cochez 'Code non sécurisé' dans la propriété du projet à compiler.
Modèle complexe
Modifiez la première partie de la fonction de travail, jusqu’à Application.DoEvents:
la source
C, flou arbitraire, facilement réversible
En retard à la fête. Voici mon entrée!
Cette méthode crée un flou de brouillage. Je l'appelle scramblur . C'est extrêmement simple. Dans une boucle, il choisit un pixel aléatoire, puis l’échange avec un pixel voisin choisi au hasard dans un modèle de toile toroïdale. Vous spécifiez la distance maximale définissant ce que "pixel voisin" signifie (1 signifie de toujours choisir un pixel adjacent), le nombre d'itérations et, éventuellement, un nombre de départ aléatoire. Plus la distance maximale est grande et plus le nombre d'itérations est grand, plus le résultat est flou.
Il est réversible en spécifiant un nombre négatif d'itérations (il s'agit simplement d'une commodité d'interface de ligne de commande; les itérations négatives n'existent pas en réalité). En interne, il utilise un LCPRNG personnalisé (générateur de nombres pseudo-aléatoires congruentiels linéaires) sur 64 bits et pré-génère un bloc de valeurs. La table permet de parcourir le bloc en avant ou en arrière pour l'embrouillage ou le désembrouillage, respectivement.
Démo
Lorsque vous faites défiler l'écran vers le bas pour les deux premières images, chaque image est floue avec un décalage maximum plus élevé: Plus haute est l'image d'origine (par exemple, décalage 0 pixel), suivi de 1, 2, 4, 8, 16, 32, 64 , 128 et enfin 256. Le nombre d'itérations est 10 = 1 000 000 pour toutes les images ci-dessous.
Pour les deux secondes images, chaque image est floue en utilisant un décalage progressivement plus faible - par exemple, le plus flou au moins flou - d'un offset maximum de 256 à 0. Enjoy!
Et pour ces deux images suivantes, vous pouvez voir les progressions en taille réelle ici et ici :
Code
Au bout d’une heure environ, j’ai piraté le problème ensemble au réveil et il ne contient presque aucune documentation. Je pourrais revenir dans quelques jours et ajouter plus de documentation plus tard si les gens le demandent.
la source
Python 3.4
Lorsque le bonus 2 est atteint, en utilisant une image clé supplémentaire, le bonus 1 n'est pas perdu. Le programme est toujours auto-inverse, à condition qu'il soit exécuté à nouveau avec la même image clé.
Utilisation standard
Image test 1:
Test image 2:
L'exécution du programme avec un seul fichier image comme argument enregistre un fichier image avec les pixels embrouillés de manière uniforme sur toute l'image. Le relancer avec la sortie brouillée enregistre un fichier image avec le brouillage appliqué à nouveau, ce qui restaure le fichier original puisque le processus de brouillage est son propre inverse.
Le processus d'embrouillage est auto-inverse car la liste de tous les pixels est divisée en deux cycles, de sorte que chaque pixel est échangé avec un et un seul autre pixel. Son exécution une seconde fois permet d'échanger chaque pixel avec le pixel avec lequel elle a été échangée pour la première fois, en reprenant le principe initial. S'il y a un nombre impair de pixels, il y en aura un qui ne bouge pas.
Merci à la réponse de mfvonh en tant que premier à suggérer 2 cycles.
Utilisation avec une image clé
Scrambling Test image 1 avec l'image test 2 comme image clé
Scrambling Test image 2 avec l'image test 1 comme image clé
L'exécution du programme avec un deuxième argument de fichier image (l'image clé) divise l'image d'origine en régions basées sur l'image clé. Chacune de ces régions est divisée en 2 cycles séparément, de sorte que tout le brouillage se produit dans les régions et que les pixels ne sont pas déplacés d'une région à une autre. Cela répartit les pixels sur chaque région et les régions deviennent alors une couleur uniforme mouchetée, mais avec une couleur moyenne légèrement différente pour chaque région. Cela donne une approximation très approximative de l'image clé, dans les mauvaises couleurs.
Une nouvelle exécution permute les mêmes paires de pixels dans chaque région. Ainsi, chaque région retrouve son état d'origine et l'image dans son ensemble réapparaît.
Grâce à la réponse de edc65, le premier à suggérer de diviser l’image en régions. Je voulais développer cela pour utiliser des régions arbitraires, mais l'approche consistant à tout permuter dans la région 1 avec tout dans la région 2 impliquait que les régions soient de taille identique. Ma solution est de garder les régions isolées les unes des autres et de mélanger simplement chaque région. Puisque les régions n'ont plus besoin d'être de taille similaire, il devient plus simple d'appliquer des régions de forme arbitraire.
Code
Gravure d'image JPEG
Les fichiers .jpg sont traités très rapidement, mais au prix d'une surchauffe. Cela laisse une image après gravure lorsque l'original est restauré:
Mais sérieusement, un format avec perte entraînera une légère modification de certaines couleurs de pixel, ce qui rend la sortie invalide. Lorsqu'une image clé est utilisée et que le mélange de pixels est limité à des régions, toute la distorsion est conservée dans la région dans laquelle elle s'est produite, puis répartie uniformément sur cette région lorsque l'image est restaurée. La différence de distorsion moyenne entre les régions laisse une différence visible entre elles, de sorte que les régions utilisées dans le processus d'embrouillage sont toujours visibles dans l'image restaurée.
La conversion au format .png (ou à tout autre format sans perte) avant le brouillage garantit que l'image non brouillée est identique à l'original, sans gravure ni distorsion:
Petits détails
la source
Voici une transformation non aléatoire pour un changement
nx
tempsny
foisLa transformation est presque auto-inverse, en répétant la transformation un total de
size_x
fois (dans la direction x) renvoie l'image d'origine. Je n'ai pas compris le calcul exact, mais utiliser des multiples entiers pourint(log_2(size_x))
produire le meilleur brassage avec les plus petites images fantômesVoici à quoi ressemblent les premières étapes 20 itérations (nx = ny, notez l’effet de différentes résolutions)
la source
Mathematica
C'est assez simple. Je choisis
5 * nPixels
des paires de coordonnées aléatoires et permute ces deux pixels (ce qui obscurcit complètement l'image). Pour le déchiffrer, je fais la même chose en sens inverse. Bien sûr, il faut que je sème le PRNG pour obtenir les mêmes paires de coordonnées sur les deux étapes.La seule différence entre les deux fonctions est
Reverse@
dansunscramble
. Les deux fonctions prennent un objet image réel. Vous pouvez les utiliser comme suit:out
etin
sont identiques. Voici à quoiscr
ressemble:la source
FindPermutation
si?{c, a, b}[[{2, 3, 1}]]
peut être utilisé?C # (+ Bonus pour l'algorithme symétrique)
Cela fonctionne en trouvant un
x
tel quex^2 == 1 mod (number of pixels in image)
, puis en multipliant l'index de chaque pixel parx
afin de trouver son nouvel emplacement. Cela vous permet d'utiliser exactement le même algorithme pour brouiller et décoder une image.la source
1
(image d'origine) etmodulo-1
(image inversée / inversée). La plupart des numéros ont des solutions non triviales, mais il semble y avoir quelques exceptions . (lié à la factorisation principale demodulo
)1
affiche l'image d'origine et,-1
par exemple, imgur.com/EiE6VW2C #, auto-inverse, pas de hasard
Si l'image d'origine a des dimensions d'une puissance égale à deux, chaque ligne et colonne est remplacée par la ligne et la colonne contenant le motif de bits inversé, par exemple pour une image de largeur 256, la ligne 0xB4 est remplacée par la ligne 0x2D. Les images d'autres tailles sont divisées en rectangles avec des côtés de puissance de 2.
Première image:
Deuxième image:
la source
C #
Même méthode pour le brouillage et le débrouillage. J'apprécierais des suggestions pour améliorer ceci.
Les résultats ont pour résultat un plaid psychédélique
la source
Python 2 (auto-inverse, pas d’aléatoire, sensible au contexte)
Cela ne remportera aucun prix pour "moins reconnaissable", mais peut-être qu'il peut marquer comme "intéressant". :-)
Je voulais faire quelque chose de sensible au contexte, où le brouillage des pixels dépend en réalité de l'image elle-même.
L'idée est assez simple: triez tous les pixels en fonction d'une valeur arbitraire dérivée de la couleur du pixel, puis permutez les positions du premier pixel de cette liste avec le dernier, le second avec l'avant-dernier, et ainsi de suite.
Malheureusement, dans cette approche simple, il y a un problème avec les pixels de la même couleur, donc pour continuer à l'inverse, mon programme est devenu un peu plus compliqué ...
Voici le résultat:
Vous pouvez obtenir des résultats très différents en modifiant la fonction de hachage
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
:la source
Mathematica (+ bonus)
Cela réduit les canaux de couleur et brouille l'image en une longue liste de données. Le résultat est une version cryptée encore moins reconnaissable car elle ne présente pas la même distribution de couleurs que la version originale (car ces données ont également été cryptées). Ceci est plus évident dans la deuxième image brouillée, mais si vous regardez de plus près, vous verrez le même effet dans la première. La fonction est son propre inverse.
Il y avait un commentaire que cela peut ne pas être valide parce que ça brouille par canal. Je pense que ça devrait l'être, mais ce n'est pas grave. Le seul changement nécessaire pour brouiller les pixels entiers (au lieu de par canal) serait de passer
Flatten @ x
àFlatten[x, 1]
:)Explication
Définit une fonction
f
qui prend un tableau à 2 dimensionsx
. La fonction utilise le produit des dimensions de l'image comme une graine aléatoire, puis aplatit le tableau en une liste à 1 dimensionf
(ombré localement). Ensuite, il crée une liste du formulaire{1, 2, ... n}
oùn
est la longueur def
, permute aléatoirement cette liste, le partitionne en segments de 2 (donc, par exemple,{{1, 2}, {3, 4}, ...}
(en supprimant le dernier numéro si les dimensions sont toutes les deux impaires), puis permutef
en échangeant les valeurs à les positions indiquées dans chaque sous-liste qui vient d'être créée, et finalement elle remodèle la liste permutée aux dimensions d'origine dex
. Elle brouille par canal carFlatten
La commande réduit également les données du canal dans chaque pixel. La fonction est son propre inverse car les cycles n'incluent que deux pixels chacun.Usage
Voici en utilisant
Flatten[x, 1]
.la source
f @ f @ img1 // Image
est (en syntaxe complète)Image[f[f[img1]]]
Matlab (+ bonus)
En gros, je change de façon aléatoire la position de deux pixels et je marque chaque pixel qui a été activé pour qu’il ne le soit plus. Le même script peut être utilisé à nouveau pour le «décryptage» car je réinitialise le générateur de nombres aléatoires à chaque fois. Ceci est fait jusqu'à ce que presque tous les pixels soient activés (c'est pourquoi stepize est supérieur à 2)
EDIT: Je viens de voir que Martin Büttner a utilisé une approche similaire - je n’avais pas l’intention de copier l’idée - j’ai commencé à écrire mon code alors qu’il n’y avait pas de réponse, donc désolé pour cela. Je pense toujours que ma version utilise des idées différentes =) (Et mon algorithme est bien plus inefficace si vous regardez le point où les deux coordonnées aléatoires sont choisies ^^)
Images
Code
la source
Mathematica-Utilise une permutation pour brouiller et son inverse pour déchiffrer.
Une image jpg est un tableau tridimensionnel de
{r,g,b}
couleurs de pixels. (Les 3 dimensions structurent l'ensemble des pixels par rangée, colonne et couleur). Il peut être mis à plat dans une liste de{r,g,b}
triples, puis permuté selon une liste de cycles "connus", et enfin réassemblé dans un tableau des dimensions d'origine. Le résultat est une image brouillée.Le désembrouillage prend l'image brouillée et la traite au verso de la liste des cycles. Il produit, oui, l'image d'origine.
Ainsi, une seule fonction (dans le cas présent
scramble
) sert à brouiller et à brouiller les pixels d'une image.Une image est entrée avec un numéro de départ (pour s'assurer que le générateur de nombres aléatoires sera dans le même état pour l'embrouillage et le désembrouillage). Lorsque le paramètre reverse est False, la fonction sera brouillée. Quand il est vrai, la fonction va déchiffrer.
brouiller
Les pixels sont aplatis et une liste aléatoire de cycles est générée. Permute utilise des cycles pour changer la position des pixels dans la liste aplatie.
déchiffrer
La même fonction
scramble
est utilisée pour le désembrouillage. Cependant, l'ordre de la liste des cycles est inversé.Exemples
La même graine (37) est utilisée pour l'embrouillage et le désembrouillage.
Cela produit l'image brouillée de la montagne. L'image ci-dessous montre que la variable scrambledMount peut être remplacée par l'image réelle de la scène de montagne.
Maintenant nous courons l'inverse; scrambledMount est entré et l'image originale est récupérée.
Même chose pour les cercles:
la source
Python
J'aime ce casse-tête, il semblait intéressant et je suis arrivé avec une fonction d'emballage et de mouvement à appliquer sur l'image.
Enveloppé
Je lis la photo comme un texte (de gauche à droite, de haut en bas) et l'écris comme une coquille d'escargot.
Cette fonction est cyclique: il y a un dans N, f ^ (n) (x) = x par exemple, pour une image de 4 * 2, f (f (f (x))) = x
Mouvement
Je prends un nombre aléatoire et déplace chaque colonne et ligne de celle-ci
Code
Des photos
Première rotation:
alors permutation:
Et avec le dernier tour:
Quant à l'autre exemple:
la source
VB.NET (+ bonus)
Ceci utilise l'idée de flawr, grâce à lui, mais utilise différents algorithmes d'échange et de vérification. Le programme code et décode de la même manière.
Images de sortie:
la source
Après avoir rappelé qu'il est sur le point d'échanger des pixels et non de les modifier, voici ma solution:
Brouillé:
Restauré:
Ceci est fait en randomisant l'ordre des pixels, mais pour pouvoir le restaurer, la randomisation est fixée. Pour ce faire, utilisez un pseudo-aléatoire avec une valeur de départ fixe et générez une liste d’index décrivant les pixels à échanger. Comme l'échange sera le même, la même liste restaurera l'image d'origine.
Notez que l'utilisation de cet algorithme sur un format de compression avec perte ne produira pas le même résultat, car le format d'image modifiera les données. Cela devrait fonctionner correctement avec tout codec sans perte tel que PNG.
la source
Mathematica
Nous définissons une fonction d'assistance
h
et la fonction d'embrouillagescramble
comme suit :Après avoir chargé une image, vous pouvez appeler
scramble[img, k]
oùk
est n'importe quel entier pour brouiller l'image. Appeler à nouveau avec-k
décryptera. (Sik
est0
, alors aucun changement n'est effectué.) Ilk
convient généralement de choisir quelque chose comme100
ce qui donne une jolie image brouillée:la source
Matlab: Brouillage de lignes et de colonnes basé sur des invariances de somme de lignes / colonnes
Cela semblait être un casse-tête amusant, alors j'ai réfléchi à la question et proposé la fonction suivante. Il est basé sur l'invariance des sommes de valeur de pixel de ligne et de colonne lors d'un décalage circulaire: il décale chaque ligne, puis chaque colonne, de la somme totale des valeurs de pixel de la ligne / colonne (en supposant un uint8 pour un nombre entier dans la variable de décalage ) Ceci peut ensuite être inversé en décalant chaque colonne puis chaque ligne de leur valeur de somme dans la direction opposée.
Ce n'est pas aussi joli que les autres, mais j'aime bien le fait qu'il soit non aléatoire et entièrement spécifié par l'image - pas de paramètres de choix.
Je l'avais initialement conçu pour décaler chaque canal de couleur séparément, mais j'ai ensuite remarqué la spécification voulant que seuls les pixels complets soient déplacés.
la source
Java
Ce programme échange aléatoirement des pixels (crée un mappage pixel à pixel), mais au lieu d’une fonction aléatoire, il utilise Math.sin () (entier x). C'est totalement réversible. Avec des images de test, il crée des motifs.
Paramètres: nombre entier (nombre de passes, nombre négatif à inverser, 0 ne fait rien), mage en entrée et image en sortie (peuvent être identiques). Le fichier de sortie doit être au format qui utilise la compression sans perte.
1 passe:
100 passes (il faut quelques minutes pour le faire):
Code:
la source
Python 2.7 avec PIL
Un peu tard pour la fête, mais j'ai pensé que ce serait amusant de convertir les images en plaids (et vice versa). Tout d'abord, nous décalons les colonnes de 4 fois le nombre de colonnes (colonnes égales vers le bas, colonnes impaires vers le haut). Ensuite, nous décalons les lignes de gauche ou de droite de 4 fois le nombre de lignes (colonnes paires à gauche, colonnes impaires à droite).
Le résultat est assez Tartanish.
Pour inverser, nous les faisons simplement dans l’ordre inverse et décalons de la même manière.
Code
Résultats
Le plaid de l'image 1:
La forme de plaid image 2:
la source
offset = x*xsize/ysize
etoffset = y*ysize/xsize
Mais, cela ne cache pas non plus vraiment l'image, malheureusement.Python (+ bonus) - permutation des pixels
Dans cette méthode, chaque pixel sera placé sur une autre position, avec la contrainte que l'autre pixel soit placé sur la première position. Mathématiquement, il s’agit d’une permutation de longueur de cycle 2. En tant que telle, la méthode est elle-même inverse.
Rétrospectivement, il ressemble beaucoup à mfvonh, mais cette soumission est en Python et j'ai dû construire cette permutation moi-même.
Première image de test: Deuxième image de test:
la source
Python 2.7 + PIL, Inspiration des casse-tête coulissants
Juste eu une autre idée. Fondamentalement, cette méthode divise une image en blocs de taille égale, puis mélange leur ordre. Étant donné que la nouvelle commande est basée sur une graine fixe, il est possible de revenir complètement au processus en utilisant la même graine. De plus, avec le paramètre supplémentaire appelé granularité, il est possible d'obtenir des résultats différents et méconnaissables.
Résultats:
Original
Granularité 16
Granularité 13
Granularité 10
Granularité 3
Granularité 2
Granularité 1
Original
Granularité 16
Granularité 13
Granularité 10
Granularité 3
Granularité 2
Granularité 1
Code:
la source
47
94 lignes. 47 pour l'encodage, 47 pour le décodage.
codegolf-35005_ref.rb
(converti en jpg)
(original réduit)
la source
Matlab avec une pincée de théorie des groupes (+ bonus)
Dans cette approche, nous supposons que nous avons un nombre pair de pixels totaux. (Si ce n'est pas le cas, nous ignorons simplement un pixel). Nous devons donc choisir la moitié des pixels à permuter avec l'autre moitié. Pour cela, nous indexons tous les pixels
0
jusqu'à2N-1
et considérons ces indices comme un groupe cyclique.Parmi les nombres premiers, nous recherchons un nombre
p
qui n’est ni trop petit ni trop grand, et qui correspond à2N
l’ordre de notre groupe. Cela signifieg
générer notre groupe ou{k*g mod 2N | k=0,1,...,2N-1} = {0,1,...,2N-1}
.Nous choisissons donc les premiers
N
multiples d'g
un ensemble et tous les autres indices comme l'autre ensemble, et échangeons simplement l'ensemble de pixels correspondant.Si vous
p
choisissez la bonne manière, le premier ensemble est réparti uniformément sur l’ensemble de l’image.Les deux cas de test:
Légèrement hors sujet mais intéressant:
Pendant les tests, j'ai remarqué que si vous sauvegardez le fichier dans un fichier jpg (compressé avec perte) et remplacez-le par un fichier png compressé sans perte, vous verrez assez rapidement les artefacts de la compression et affichera les résultats de deux réarrangements consécutifs. :
Comme vous pouvez le constater, la compression jpg donne un résultat presque noir et blanc!
la source
JavaScript (+ bonus) - répéteur de permutation de division de pixel
la source
Python 2.7 + PIL, brouilleur de colonne / ligne
Cette méthode brouille simplement les lignes et les colonnes de l'image. Il est possible de brouiller une seule des dimensions ou les deux. En outre, l'ordre de la nouvelle ligne / colonne brouillée est basé sur un mot de passe. En outre, une autre possibilité consiste à brouiller l'ensemble du tableau d'images sans tenir compte des dimensions.
Résultats:
Brouiller l'image entière:
Brouiller les colonnes:
Brouiller les lignes:
Brouillage des colonnes et des lignes:
J'ai aussi essayé d'appliquer plusieurs passages à l'image, mais les résultats finaux ne différaient pas beaucoup, seulement la difficulté à la déchiffrer.
Code:
la source
Winforms C #
Image1:
Image 2:
Code source:
la source
Python 3.6 + pypng
Riffle / Master Shuffle
Mon algorithme applique le mélange aléatoire dans un sens et le mélange principal dans l'autre (puisque les deux sont inverses), plusieurs itérations chacune, mais chacune est généralisée pour se scinder en un nombre quelconque de sous-groupes au lieu de deux. L’effet est que vous pouvez créer une clé de permutation multi-itération car l’image ne sera pas restaurée sans connaître la séquence exacte des remaniements et du mélange principal. Une séquence peut être spécifiée avec une série d'entiers, avec des nombres positifs représentant des riffles et des nombres négatifs représentant des maîtres.
J'ai mélangé le paysage avec la clé [3, -5, 2, 13, -7]:
Il est intéressant de noter que certaines choses intéressantes se produisent depuis [3, -5], où il reste des artefacts de l’image originale:
Voici le motif abstrait mélangé avec la clé [2, 3, 5, 7, -11, 13, -17]:
Si un seul paramètre est incorrect dans la clé, le démêlage ne restaure pas l'image:
la source