好久没有水文章了,最近在摸鱼的时候在GitHub
上发现了一个名为 Depix
的项目,截止目前已经8.4k
的Star了。简介中说道:
Depix is a tool for recovering passwords from pixelized screenshots.
Depix是一个从像素化的截图中恢复密码的工具。
先看效果:
可以看到虽然没有完全恢复,但是基本也可以看出原图的文字了。由于线性盒式滤波是确定性算法,因此将相同的值进行像素化将始终导致相同的像素化块。 使用块的相同位置对相同文本进行像素化将产生相同的块值。 我们可以尝试对文本进行像素化以找到匹配的模式。 采用的解决方案就是:生成德布鲁因序列,将生成的序列粘贴到同一编辑器中,并进行截图。 该截图用作类似块的查找图像。
使用
一、运行Example
-
克隆项目到本地并进入目录:
git clone https://github.com/beurtschipper/Depix.git && cd Depix
-
运行
Demo
看看是否能正确输出:python depix.py -p images/testimages/testimage3_pixels.png -s images/searchimages/debruinseq_notepad_Windows10_closeAndSpaced.png -o output.png
等待一会如果成功生成output.png
并且和上面的截图差不多的话那就是成功了。
二、使用自己的图片尝试一下
-
准备一张马赛克图片。
-
准备自己的德布鲁因序列,用你的文字生成序列后使用第一步同样的工具进行截图。
-
在这提供一个
js
版的德布鲁因序列算法:function debruijn(alphabet, wordlength) { const k= alphabet.length; const n= wordlength; if(k <= 0 || n <= 0) return ''; const a= []; for(let i= 0 ; i < k*n ; ++i) a[i]= 0; let res= []; const db= function(t, p) { if(t > n) { if(n%p == 0) { for(var i= 1 ; i <= p ; ++i) res += alphabet[a[i]] + ' '; } } else { a[t]= a[t-p]; db(t+1, p); for(var j= a[t-p]+1 ; j < k ; ++j) { a[t]= j; db(t+1, t); } } } db(1,1); let extra= ''; for(var i= 0, nremain= wordlength-1 ; nremain>0 ; i += 2, --nremain) extra += res[i % res.length] + ' '; res += extra; return res; }
-
或者可以使用在线版的来生成。
-
-
然后运行程序:
python depix.py -p 马赛克图片路径 -s 德布鲁因序列图片路径 -o 输出.png
运行后就可以看到效果了。
在这提供
Colab
的地址,可以在线运行查看效果。
无效果
如果看不到效果也很正常,因为此算法只适合线性过滤器的马赛克。懂的人都知道马赛克技术是一种利用与镶嵌画装饰艺术(Mosaic)类似原理的影像处理方法。此方法将影像特定区域的色阶细节劣化并造成色块打乱的效果。其实是破坏了原图像。由于马赛克算法的不同恢复的时候也没有办法做到统一处理。所以你的图片如果是在ps
中加的马赛克滤镜那么是恢复不了的。