支付宝红包,发红包的同学拍一张物体的照片,系统加黑线处理. 收红包的同学在地图上找到这个物体,同样摄像头以同样的角度,距离对着扫,就可以领到红包.
这种玩法很有趣,调动了大家的积极性。我觉得这个玩法应该首先在百度地图上实现,只可惜老东家的产品经理们没有想到类似的玩法.
下面说一下破解的对策,由于支付宝后台匹配算法计算的也是相似度,因此并不是一定要找到藏红包的地址,只需要从线索图片里进行处理,就可能通过验证,拿到红包。
网上有photoshop教程,用黑线相近的区域填充黑线覆盖的区域,就可以通过验证。同样,可以用python等脚本来实现。
一个简单的思路就是设置好固定的黑线和实景的像素宽度,用PIL去处理,进行复制和粘贴工作..网上有很多类似的实现.但是缺点也明显,不同手机像素不同,需要自己去调节,并且,阿里修改了黑线宽度策略,随机化宽度,让这种方式的工具丢掉了太多实景像素,而不能通过验证。
更好的解决方案是,通过选取几列像素,通过像素值来动态计算判断黑线的位置,然后通过黑线相近的像素用插值的方法去填充,这样能损失最少的实景像素,并且处理之后的图片看起来更柔和。
https://github.com/whiled0ne 上,我已经写了一个demo,经测试,可以领到不少红包
.
尽管在某些类型的图片上,这种方法近乎“完美”,但是在更多情况下,这种方式有很多弊端,它依赖你对黑线像素的阀值设置。如果背景颜色变化比较多,你需要自己调节这个黑线的阀值。
一个更好的黑线判断思路是,将图像的rgb做一条曲线,黑线的中心位置应该落在曲线的奇点上,利用相邻像素值的差来检测,可以解决实景像素跟黑线接近的场景。首先,我们把每行像素的r g b相加,作出曲线
可以看到,图片不同,像素不同,但是都在12的整数倍这里,达到最低点. 这里就是黑线的最低值. 而这个点可以通过每行像素跟前一行的增值来判断,这个d小于0,说明曲线递减,当0第一次由小于零变为大于0,就可以判断黑点的位置了
另外一个工作就是判断黑线的宽度,这也可以通过d的值辅助判断,另外黑线还有一个明显的特征,我们取每行像素的最大值和最小值,黑线范围内的两个数的比值应该接近,用 log(e,max/min) 计算得到的数值接近0,这个特征算是必要不充分条件,结合一些其它特征,就可以不考虑像素点的具体值,具体范围,就可以修复图片.
目前成功率在百分之五十左右,根据具体图片不同,会有一些不同。