Buat program yang dapat mengatur ulang piksel dalam gambar sehingga tidak dapat dikenali. Namun program Anda harus dapat mengubahnya kembali menjadi gambar asli.
Anda dapat menulis dua fungsi - untuk encoding dan decoding, namun satu fungsi yang diterapkan berulang kali memberikan gambar asli (misalnya dalam matematika - f(x) = 1 - x
) adalah bonus.
Juga menghasilkan beberapa pola dalam hasil juga memberikan bonus.
Gambar dapat direpresentasikan sebagai array 1D / 2D atau objek gambar jika bahasa Anda mendukungnya. Perhatikan bahwa Anda hanya dapat mengubah urutan piksel!
Akan logis untuk memilih kode pemenang yang menghasilkan gambar yang kurang dapat dikenali, namun saya tidak tahu bagaimana mengukurnya dengan tepat, semua cara yang dapat saya bayangkan dapat ditipu. Karenanya saya memilih pertanyaan ini untuk menjadi kontes popularitas - biarkan pengguna memilih apa jawaban terbaik!
Gambar uji 1 (800 x 422 px): Gambar uji 2 (800 x 480 px): Berikan gambar kode keluaran.
sumber
Jawaban:
Python 2.7 (dengan PIL) - Tanpa Pseudorandomness
Saya memecah gambar menjadi 2 oleh 2 blok (mengabaikan sisanya) dan memutar setiap blok dengan 180 derajat, kemudian saya melakukan hal yang sama dengan 3 oleh 3 blok, kemudian 4, dll hingga beberapa parameter BLKSZ. Lalu saya melakukan hal yang sama untuk BLKSZ-1, lalu BLKSZ-2, semuanya kembali ke 3, lalu 2. Metode ini membalikkan dirinya dengan tepat; fungsi unscramble adalah fungsi scramble.
Kode :
Bergantung pada ukuran blok, Anda dapat membuat perhitungan memberantas semua kemiripan dengan gambar asli: (BLKSZ = 50)
Atau buat komputasi menjadi efisien: (BLKSZ = 10)
sumber
BLKSZ = 10
landscape benar-benar keren!C #, Winform
Sunting Mengubah cara Anda mengisi array koordinat Anda dapat memiliki pola yang berbeda - lihat di bawah
Apakah Anda menyukai pola seperti ini?
Bonus:
Tukar acak tepat satu kali semua piksel di bagian atas dengan semua piksel di bagian bawah. Ulangi prosedur yang sama untuk menguraikan (bonus).
Kode
Scramble.cs
Scramble.designer.cs
Program.cs
Periksa 'Kode tidak aman' di properti proyek untuk dikompilasi.
Pola rumit
Ubah bagian pertama fungsi kerja, hingga Application.DoEvents:
sumber
C, kabur acak, mudah dibalik
Terlambat ke pesta. Inilah entri saya!
Metode ini melakukan pengacakan kabur. Saya menyebutnya scramblur . Ini sangat sederhana. Dalam satu lingkaran, ia memilih piksel acak dan kemudian menukarnya dengan piksel terdekat yang dipilih secara acak dalam model kanvas toroidal. Anda menentukan jarak maksimum yang mendefinisikan arti "piksel terdekat" (1 berarti selalu memilih piksel yang berdekatan), jumlah iterasi, dan secara opsional seed number acak. Semakin besar jarak maksimum dan semakin besar jumlah iterasi, semakin kabur hasilnya.
Ia dapat dibalik dengan menetapkan sejumlah iterasi negatif (ini hanyalah kenyamanan antarmuka baris perintah; sebenarnya tidak ada yang namanya iterasi negatif). Secara internal, ia menggunakan LCPRNG 64-bit kustom (generator angka pseudorandom linier kongruensial) dan pra-menghasilkan blok nilai. Tabel ini memungkinkan pengulangan melalui blok maju atau mundur untuk masing-masing pengacakan atau pengacakan.
Demo
Untuk dua gambar pertama, saat Anda menggulir ke bawah, setiap gambar dikaburkan menggunakan offset maksimum yang lebih tinggi: Paling atas adalah gambar asli (mis., Offset 0-piksel), diikuti oleh 1, 2, 4, 8, 16, 32, 64 , 128, dan akhirnya 256. Hitungan iterasi adalah 10⁶ = 1.000.000 untuk semua gambar di bawah.
Untuk dua gambar kedua, setiap gambar dikaburkan menggunakan offset yang semakin rendah - misalnya, paling buram hingga paling tidak kabur - dari offset maksimum 256 ke 0. Nikmati!
Dan untuk dua gambar berikut ini, Anda dapat melihat perkembangan ukuran penuh di sini dan di sini :
Kode
Saya meretas ini bersama dalam waktu sekitar satu jam ketika bangun pagi ini dan hampir tidak ada dokumentasi. Saya mungkin kembali dalam beberapa hari dan menambahkan lebih banyak dokumentasi nanti jika orang memintanya.
sumber
Python 3.4
Ketika bonus 2 tercapai, dengan menggunakan gambar kunci tambahan, bonus 1 tidak hilang. Program ini masih terbalik sendiri, asalkan dijalankan dengan gambar kunci yang sama lagi.
Penggunaan standar
Gambar uji 1:
Gambar uji 2:
Menjalankan program dengan file gambar tunggal karena argumennya menyimpan file gambar dengan piksel yang diacak secara merata di seluruh gambar. Menjalankannya kembali dengan output teracak menyimpan file gambar dengan pengacakan diterapkan lagi, yang mengembalikan yang asli karena proses pengacakan adalah kebalikannya sendiri.
Proses pengacakan adalah terbalik sendiri karena daftar semua piksel dibagi menjadi 2-siklus, sehingga setiap piksel ditukar dengan satu dan hanya satu piksel lainnya. Menjalankannya untuk kedua kali menukar setiap piksel dengan piksel yang pertama kali ditukar, mengembalikan semuanya ke awal. Jika ada jumlah piksel ganjil, akan ada piksel yang tidak bergerak.
Berkat jawaban mfvonh sebagai yang pertama menyarankan 2 siklus.
Penggunaan dengan gambar kunci
Scrambling Test image 1 dengan Test image 2 sebagai key image
Scrambling Test image 2 dengan Test image 1 sebagai key image
Menjalankan program dengan argumen file gambar kedua (gambar kunci) membagi gambar asli ke dalam wilayah berdasarkan gambar kunci. Masing-masing daerah ini dibagi menjadi 2 siklus secara terpisah, sehingga semua pengacakan terjadi di dalam wilayah, dan piksel tidak dipindahkan dari satu daerah ke daerah lain. Ini menyebar piksel di setiap daerah dan daerah menjadi warna berbintik seragam, tetapi dengan warna rata-rata yang sedikit berbeda untuk masing-masing daerah. Ini memberikan perkiraan kasar dari gambar kunci, dalam warna yang salah.
Berjalan kembali menukar pasangan piksel yang sama di setiap wilayah, sehingga setiap wilayah dikembalikan ke keadaan semula, dan gambar secara keseluruhan muncul kembali.
Berkat jawaban edc65 sebagai yang pertama menyarankan untuk membagi gambar menjadi daerah. Saya ingin memperluas ini untuk menggunakan daerah sewenang-wenang, tetapi pendekatan menukar segala sesuatu di wilayah 1 dengan segala sesuatu di wilayah 2 berarti bahwa wilayah tersebut harus berukuran sama. Solusi saya adalah menjaga daerah terisolasi satu sama lain, dan hanya mengocok masing-masing daerah itu sendiri. Karena daerah tidak perlu lagi memiliki ukuran yang sama, menjadi lebih mudah untuk menerapkan daerah berbentuk sewenang-wenang.
Kode
Gambar JPEG terbakar
File .jpg diproses dengan sangat cepat, tetapi dengan biaya terlalu panas. Ini meninggalkan gambar setelah terbakar ketika dokumen asli dipulihkan:
Namun serius, format lossy akan mengakibatkan beberapa warna piksel sedikit berubah, yang dengan sendirinya membuat output menjadi tidak valid. Ketika gambar utama digunakan dan pengocokan piksel dibatasi untuk wilayah, semua distorsi disimpan di dalam wilayah di mana itu terjadi, dan kemudian menyebar secara merata di wilayah itu ketika gambar dikembalikan. Perbedaan dalam distorsi rata-rata antar daerah meninggalkan perbedaan yang terlihat di antara mereka, sehingga daerah yang digunakan dalam proses pengacakan masih terlihat dalam gambar yang dipulihkan.
Mengonversi ke .png (atau format non-lossy) sebelum pengacakan memastikan bahwa gambar yang diacak identik dengan yang asli tanpa pembakaran atau distorsi:
Detail kecil
sumber
Berikut ini adalah transformasi non-acak untuk perubahan
nx
kaliny
kaliTransformasi hampir terbalik sendiri, mengulangi transformasi total
size_x
kali (dalam arah x) mengembalikan gambar asli. Saya tidak tahu persis matematika, tetapi menggunakan kelipatan integerint(log_2(size_x))
menghasilkan pengocokan terbaik dengan gambar hantu terkecilIni adalah bagaimana langkah pertama 20 iterasi terlihat seperti (nx = ny, perhatikan efek dari resolusi yang berbeda)
sumber
Mathematica
Ini sangat mudah. Saya memilih
5 * nPixels
pasangan koordinat acak dan menukar kedua piksel tersebut (yang sepenuhnya mengaburkan gambar). Untuk menguraikannya saya melakukan hal yang sama secara terbalik. Tentu saja, saya perlu seed PRNG untuk mendapatkan pasangan koordinat yang sama di kedua langkah.Satu-satunya perbedaan antara dua fungsi ini
Reverse@
diunscramble
. Kedua fungsi mengambil objek gambar yang sebenarnya. Anda dapat menggunakannya sebagai berikut:out
danin
identik. Berikut iniscr
tampilannya:sumber
FindPermutation
?{c, a, b}[[{2, 3, 1}]]
bisa digunakan?C # (+ Bonus untuk Algoritma Simetris)
Ini berfungsi dengan menemukan
x
sedemikian rupax^2 == 1 mod (number of pixels in image)
, dan kemudian mengalikan indeks setiap piksel denganx
untuk menemukan lokasi baru. Ini memungkinkan Anda menggunakan algoritma yang sama persis untuk mengacak dan mengacak gambar.sumber
1
(gambar asli) danmodulo-1
(gambar terbalik / terbalik). Sebagian besar angka memiliki solusi non-sepele, tetapi ada beberapa pengecualian, tampaknya . (terkait dengan faktorisasi utamamodulo
)1
menampilkan gambar asli, dan-1
menampilkan misalnya imgur.com/EiE6VW2C #, terbalik sendiri, tidak ada keacakan
Jika gambar asli memiliki dimensi yang merupakan kekuatan dua, maka setiap baris dan kolom dipertukarkan dengan baris dan kolom yang memiliki pola bit terbalik, misalnya untuk gambar dengan lebar 256 maka baris 0xB4 dipertukarkan dengan baris 0x2D. Gambar dengan ukuran lain dibagi menjadi empat persegi panjang dengan sisi kekuatan 2.
Gambar pertama:
Gambar kedua:
sumber
C #
Metode yang sama untuk pengacakan dan pengacakan. Saya akan sangat menghargai saran untuk meningkatkan ini.
Keluaran menghasilkan kotak-kotak psikedelik
sumber
Python 2 (terbalik sendiri, tidak ada keacakan, peka konteks)
Ini tidak akan memenangkan hadiah untuk "paling tidak dikenali", tapi mungkin itu bisa dinilai sebagai "menarik". :-)
Saya ingin membuat sesuatu yang sensitif terhadap konteks, di mana pengacakan piksel sebenarnya tergantung pada gambar itu sendiri.
Idenya cukup sederhana: Urutkan semua piksel berdasarkan nilai sewenang-wenang yang diperoleh dari warna piksel dan kemudian tukar posisi piksel pertama dalam daftar itu dengan yang terakhir, yang kedua dengan yang kedua ke terakhir, dan seterusnya.
Sayangnya dalam pendekatan sederhana ini ada masalah dengan piksel-piksel dengan warna yang sama, jadi untuk membuatnya tetap terbalik program saya tumbuh sedikit lebih rumit ...
Ini hasilnya:
Anda dapat mencapai hasil yang sangat berbeda dengan mengubah fungsi hash
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
:sumber
Mathematica (+ bonus)
Ini menciutkan saluran warna dan mengacak gambar sebagai satu daftar panjang data. Hasilnya adalah versi acak yang kurang dapat dikenali karena tidak memiliki distribusi warna yang sama dengan aslinya (karena data itu juga diacak). Ini paling jelas pada gambar kedua yang diacak, tetapi jika Anda melihat lebih dekat, Anda akan melihat efek yang sama di gambar pertama juga. Fungsi adalah kebalikannya sendiri.
Ada komentar bahwa ini mungkin tidak valid karena mengacak per saluran. Saya pikir itu harus, tetapi itu bukan masalah besar. Satu-satunya perubahan yang diperlukan untuk mengacak seluruh piksel (bukan per saluran) akan berubah
Flatten @ x
menjadiFlatten[x, 1]
:)Penjelasan
Menentukan fungsi
f
yang mengambil array 2 dimensix
. Fungsi ini menggunakan produk dari dimensi gambar sebagai benih acak, dan kemudian meratakan array ke daftar 1 dimensif
(dibayangi secara lokal). Kemudian ia membuat daftar bentuk di{1, 2, ... n}
manan
panjangnyaf
, secara acak mengizinkan daftar itu, mempartisi ke dalam segmen 2 (jadi, misalnya,{{1, 2}, {3, 4}, ...}
(menjatuhkan angka terakhir jika dimensi keduanya ganjil), dan kemudian mengizinkanf
dengan menukar nilai pada posisi yang ditunjukkan dalam setiap sublist yang baru saja dibuat, dan akhirnya membentuk kembali daftar yang diijinkan kembali ke dimensi asli darix
. Ini mengacak per saluran karena selain mengecilkan dimensi gambar yangFlatten
perintah juga menciutkan data saluran di setiap piksel. Fungsi ini kebalikannya sendiri karena siklus masing-masing hanya terdiri dari dua piksel.Pemakaian
Di sini menggunakan
Flatten[x, 1]
.sumber
f @ f @ img1 // Image
is (dalam sintaks lengkap)Image[f[f[img1]]]
Matlab (+ bonus)
Saya pada dasarnya mengganti posisi dua piksel secara acak dan menandai setiap piksel yang telah diaktifkan sehingga tidak akan beralih lagi. Script yang sama dapat digunakan lagi untuk 'dekripsi' karena saya mengatur ulang generator nomor acak setiap kali. Ini dilakukan sampai hampir semua piksel diaktifkan (karena itu ukuran stepsize lebih besar dari 2)
EDIT: Baru saja melihat bahwa Martin Büttner menggunakan pendekatan yang sama - saya tidak bermaksud menyalin ide - saya mulai menulis kode saya ketika tidak ada jawaban, sangat menyesal untuk itu. Saya masih berpikir versi saya menggunakan beberapa ide yang berbeda =) (Dan algoritma saya jauh lebih tidak efisien jika Anda melihat bit di mana dua koordinat acak dipetik ^^)
Gambar-gambar
Kode
sumber
Mathematica-Gunakan permutasi untuk mengacak dan kebalikannya untuk menguraikan.
Gambar jpg adalah susunan
{r,g,b}
warna piksel tiga dimensi . (3 dimensi menyusun kumpulan piksel berdasarkan baris, kolom, dan warna). Ini dapat diratakan menjadi daftar{r,g,b}
tiga kali lipat, kemudian diijinkan sesuai dengan daftar siklus "diketahui", dan akhirnya dirakit kembali ke dalam array dimensi asli. Hasilnya adalah gambar acak.Unscrambling mengambil gambar yang diacak dan memprosesnya dengan kebalikan dari daftar siklus. Ini menghasilkan, ya, gambar asli.
Jadi satu fungsi (dalam kasus ini,
scramble
) berfungsi untuk mengacak serta menguraikan piksel dalam suatu gambar.Sebuah gambar dimasukkan bersama dengan nomor benih (untuk memastikan bahwa generator angka acak akan berada dalam kondisi yang sama untuk pengacakan dan pengacakan). Saat parameter, mundur, salah, fungsi akan berebut. Ketika Benar, fungsi akan terurai.
berebut
Pixel diratakan dan daftar siklus acak dihasilkan. Izinkan menggunakan siklus untuk mengganti posisi piksel dalam daftar yang diratakan.
menguraikan
Fungsi yang sama,
scramble
digunakan untuk menguraikan. Namun urutan daftar siklus dibalik.Contohnya
Benih yang sama (37) digunakan untuk pengacakan dan pengacakan.
Ini menghasilkan citra gunung yang acak-acakan. Gambar di bawah ini menunjukkan bahwa variabel scrambledMount dapat diganti dengan gambar sebenarnya dari pemandangan gunung.
Sekarang kita menjalankan invers; scrambledMount dimasukkan dan gambar aslinya dipulihkan.
Hal yang sama untuk lingkaran:
sumber
Python
Saya suka teka-teki ini, ia tampak menarik dan saya datang dengan fungsi Gerakan dan bungkus untuk diterapkan pada gambar.
Terbungkus
Saya membaca gambar sebagai teks (dari kiri ke kanan, atas dan bawah) dan menuliskannya sebagai cangkang siput.
Fungsi ini adalah siklik: ada dalam N, f ^ (n) (x) = x misalnya, untuk gambar 4 * 2, f (f (f (x))) = x
Gerakan
Saya mengambil nomor acak dan memindahkan setiap kolom dan ligne darinya
Kode
Foto-foto
Rotasi pertama:
lalu permutasi:
Dan dengan rotasi terakhir:
Adapun contoh lainnya:
sumber
VB.NET (+ bonus)
Ini menggunakan ide flawr, terima kasih kepadanya, namun ini menggunakan algoritma swapping dan checking yang berbeda. Program mengkodekan dan mendekode dengan cara yang sama.
Output gambar:
sumber
Setelah diingatkan bahwa ini akan menukar piksel dan tidak mengubahnya, berikut ini solusi saya untuk ini:
Diacak:
Pulih:
Ini dilakukan dengan mengacak urutan piksel, tetapi untuk dapat mengembalikannya, pengacakan diperbaiki. Ini dilakukan dengan menggunakan pseudo-random dengan seed tetap dan menghasilkan daftar indeks yang menggambarkan piksel mana yang akan ditukar. Karena swap akan sama, daftar yang sama akan mengembalikan gambar aslinya.
Perhatikan bahwa menggunakan algoritma ini pada format kompresi lossy tidak akan menghasilkan hasil yang sama, karena format gambar akan mengubah data. Ini harus bekerja dengan baik dengan codec loss-less seperti PNG.
sumber
Mathematica
Kami mendefinisikan fungsi pembantu
h
dan fungsi pengacakscramble
sebagai:Setelah memuat gambar, Anda dapat memanggil bilangan bulat
scramble[img, k]
manak
saja, untuk mengacak gambar. Menelepon lagi dengan-k
akan menguraikan. (Jikak
ini0
, maka tidak ada perubahan yang dibuat.) Biasanyak
harus dipilih menjadi sesuatu seperti100
, yang memberikan gambar yang cukup bergegas:sumber
Matlab: Perebutan Baris dan Kolom berdasarkan pada invariances jumlah baris / kolom
Ini tampak seperti teka-teki yang menyenangkan, jadi saya memikirkannya dan membuat fungsi berikut. Ini didasarkan pada invariansi jumlah nilai piksel baris dan kolom selama pemindahan sirkuler: ia menggeser setiap baris, lalu setiap kolom, dengan jumlah total nilai piksel baris / kolom (dengan asumsi uint8 untuk seluruh angka dalam variabel-shift) ). Ini kemudian dapat dibalik dengan menggeser setiap kolom lalu baris dengan nilai penjumlahannya di arah yang berlawanan.
Ini tidak secantik yang lain, tapi saya suka itu tidak acak dan sepenuhnya ditentukan oleh gambar - tidak ada parameter pemilihan.
Saya awalnya mendesainnya untuk menggeser setiap saluran warna secara terpisah, tetapi kemudian saya perhatikan spesifikasinya hanya memindahkan piksel penuh.
sumber
Jawa
Program ini secara acak menukar piksel (membuat pemetaan piksel ke piksel), tetapi alih-alih fungsi acak ia menggunakan Math.sin () (integer x). Ini sepenuhnya reversibel. Dengan gambar uji itu menciptakan beberapa pola.
Parameter: angka integer (jumlah lintasan, angka negatif untuk dibalik, 0 tidak melakukan apa-apa), input mage dan gambar output (bisa sama). File output harus dalam format yang menggunakan kompresi lossless.
1 lulus:
100 berlalu (dibutuhkan beberapa menit untuk melakukannya):
Kode:
sumber
Python 2.7 dengan PIL
Sedikit terlambat ke pesta, tapi saya pikir akan menyenangkan untuk mengubah gambar menjadi plaids (dan tentu saja kembali). Pertama kita menggeser kolom ke atas atau ke bawah sebanyak 4 kali jumlah kolom (bahkan kolom ke bawah, kolom aneh ke atas). Kemudian, kami menggeser baris ke kiri atau kanan sebanyak 4 kali jumlah baris (bahkan kolom kiri, kolom aneh kanan).
Hasilnya cukup Tartanish.
Untuk membalikkan, kami hanya melakukan ini dalam urutan yang berlawanan dan bergeser dengan jumlah yang berlawanan.
Kode
Hasil
Kotak-kotak dari gambar 1:
Gambar bentuk kotak-kotak 2:
sumber
offset = x*xsize/ysize
danoffset = y*ysize/xsize
Tapi, sayangnya itu tidak menyembunyikan gambar juga, sayangnya.Python (+ bonus) - permutasi piksel
Dalam metode ini, setiap piksel akan ditempatkan di posisi lain, dengan batasan bahwa piksel lainnya akan ditempatkan di posisi pertama. Secara matematis, ini adalah permutasi dengan panjang siklus 2. Dengan demikian, metode ini adalah kebalikannya sendiri.
Dalam retrospeksi, ini sangat mirip dengan mfvonh, tetapi pengiriman ini menggunakan Python dan saya harus membangun permutasi itu sendiri.
Gambar uji pertama: Gambar uji kedua:
sumber
Python 2.7 + PIL, Inspirasi dari Sliding Puzzles
Punya ide lain. Pada dasarnya, metode ini membagi gambar menjadi blok berukuran sama dan kemudian mengocok pesanan mereka. Karena pesanan baru didasarkan pada benih tetap, dimungkinkan untuk sepenuhnya mengembalikan proses menggunakan benih yang sama. Selain itu, dengan parameter tambahan yang disebut granularity, dimungkinkan untuk mencapai hasil yang berbeda dan tidak dapat dikenali.
Hasil:
Asli
Granularitas 16
Granularitas 13
Perincian 10
Perincian 3
Perincian 2
Rincian 1
Asli
Granularitas 16
Granularitas 13
Perincian 10
Perincian 3
Perincian 2
Rincian 1
Kode:
sumber
47
94 baris. 47 untuk encoding, 47 untuk decoding.
codegolf-35005_ref.rb
(dikonversi ke jpg)
(asli diturunkan)
sumber
Matlab dengan sejumput Teori Grup (+ bonus)
Dalam pendekatan ini kami menganggap bahwa kami memiliki jumlah piksel total yang genap. (Jika tidak, kita abaikan saja satu piksel) Jadi kita perlu memilih setengah dari piksel untuk bertukar dengan setengah lainnya. Untuk ini, kami mengindeks semua piksel dari
0
hingga2N-1
dan menganggap indeks ini sebagai grup siklik.Di antara bilangan prima kita mencari angka
p
yang tidak terlalu kecil dan tidak terlalu besar, dan itu adalah2N
perintah untuk , kelompok kita. Ini berartig
menghasilkan grup kami atau{k*g mod 2N | k=0,1,...,2N-1} = {0,1,...,2N-1}
.Jadi kami memilih
N
kelipatan pertamag
sebagai satu set, dan semua indeces yang tersisa sebagai set lainnya, dan hanya menukar set piksel yang sesuai.Jika
p
dipilih dengan cara yang benar, set pertama didistribusikan secara merata ke seluruh gambar.Dua uji kasus:
Sedikit keluar dari topik tetapi menarik:
Selama pengujian saya perhatikan, bahwa jika Anda menyimpannya ke jpg (lossy terkompresi) (bukan png terkompresi lossless) dan menerapkan transformasi bolak-balik, Anda cukup cepat melihat artefak kompresi, ini menunjukkan hasil dari dua pengaturan ulang berturut-turut :
Seperti yang Anda lihat, kompresi jpg membuat hasilnya terlihat hampir hitam dan putih!
sumber
JavaScript (+ bonus) - pixel repeater swap divide pixel
sumber
Python 2.7 + PIL, Pengacak Kolom / Baris
Metode ini hanya mengacak baris dan kolom gambar. Dimungkinkan untuk mengacak hanya satu dimensi atau keduanya. Selain itu, urutan baris / kolom orak baru didasarkan pada kata sandi. Juga, kemungkinan lain adalah mengacak seluruh array gambar tanpa mempertimbangkan dimensi.
Hasil:
Mengacak seluruh gambar:
Mengacak kolom:
Mengacak baris:
Mengacak kolom dan baris:
Saya juga mencoba menerapkan beberapa run ke gambar, tetapi hasil akhirnya tidak banyak berbeda, hanya kesulitan untuk mendekripsi itu.
Kode:
sumber
C # Winforms
Image1:
Gambar 2:
Kode sumber:
sumber
Python 3.6 + pypng
Riffle / Master Shuffle
Algoritme saya menerapkan riffle shuffle dalam satu arah dan master shuffle di yang lain (karena keduanya adalah invers satu sama lain), masing-masing beberapa iterasi, tetapi masing-masing digeneralisasikan untuk dibagi menjadi sejumlah subkelompok alih-alih hanya dua. Efeknya adalah Anda bisa membuat kunci permutasi multi-iterasi karena gambar tidak akan dipulihkan tanpa mengetahui urutan yang tepat dari riffle dan master shuffles. Urutan dapat ditentukan dengan serangkaian bilangan bulat, dengan angka positif mewakili riffle dan angka negatif mewakili master.
Saya mengocok lanskap dengan tombol [3, -5, 2, 13, -7]:
Yang cukup menarik, beberapa hal menarik terjadi dari [3, -5], di mana beberapa artefak dari gambar asli ditinggalkan:
Inilah pola abstrak yang dikocok dengan tombol [2, 3, 5, 7, -11, 13, -17]:
Jika salah satu parameter salah dalam kunci, unshuffle tidak akan mengembalikan gambar:
sumber