首先看一下目標的驗證形態是什么樣子的
是一種通過驗證推理的驗證方式,用來防人機破解的確是很有效果,但是,But,這里面已經會有一些破綻,比如:
干貨主要有:
① 200 多本 Python 電子書(和經典的書籍)應該有
② Python標準庫資料(最全中文版)
③ 專案原始碼(四五十個有趣且可靠的練手專案及原始碼)
④ Python基礎入門、爬蟲、網路開發、大資料分析方面的視頻(適合小白學習)
⑤ Python學習路線圖(告別不入流的學習)
Python學習交流Q群101677771
(以上是原圖和二值化之后的結果)
(這是正常圖片)
像劃紅線的這些地方,可以看到有明顯的突變,并且二值化之后邊緣趨于直線,但是正常影像是不會有這種這么明顯的突變現象,
初識潘多拉
后來,我去翻閱了機器視覺的相關文章和論文,發現了一個牛逼的演算法,這個演算法就是——Genetic Algorithm遺傳演算法,最貼心的的是,作者利用這個演算法實作了一個功能,“拼圖自動還原”(不是像什么A*演算法尋找最優路線解那種哈,就是單純的拼圖)專案倉庫地址
首先來介紹下如何使用跑起來這個專案吧,坑是真的很多,接下來感受一下pyCham的一路報錯!
這里我用的是python3.10的版本,目前是最新的版本
檔案中這一步執行是會報錯的
pip3 install -r requirements.txt
解決方案:單獨對requirements.txt檔案下的每個包單獨下載,然后根據當前下載的包的最新版本替換舊版本號,
我目前每個包最新使用的是這些版本號
全部替換完了之后,再執行一次下面的代碼,他就不會報錯了
pip3 install -r requirements.txt
然后下一步,執行下面代碼
pip3 install -e .
進入潘多拉
然后我們按照官網的提示來執行,先創建一個拼圖出來,命令是這樣的(這里的檔案名我改了)
create_puzzle images/starry.jpg --size=60 --destination=puzzle.jpg
會發現,好像不行,因為我們沒有在正確的位置上執行,他的腳本位置是在bin檔案夾下面,你可能會遇到如下問題
成功之后的話,會在bin目錄下生成一個拼圖圖片
以上是介紹如何生成圖片,接下來是重頭戲,如何還原圖片
gaps --image=puzzle.jpg --generations=20 --population=600
對于引數的解釋官網是這樣的:
Option
: --image Path to puzzle(需要被還原的圖片)
--size Puzzle piece size in pixels (拼圖的大小)
--generations Number of generations for genetic algorithm (遺傳演算法的代數)
--population Number of individuals in population
--verbose Show best solution after each generation (顯示每一代后的最佳解決方案)
--save Save puzzle solution as image (拼圖結果另存為影像)
先按照官方的走一遍
很好,很舒服,繼續報錯,而且語法拼寫上我們也沒有拼寫錯,沒關系!我已經幫你找到解決方案了,
python gaps --image=puzzle.jpg --generations=20 --population=600 --size=60 --save
或者你不指定遺傳代數和人口數
python gaps --image=puzzle.jpg --size=60 --save
這是完全還原的結果,至此,我們披荊斬棘從解決專案報錯,一路挖坑填坑到demo成功運行,到這里我們已經成功了60%,接下來就是如何利用這個專案,去破解網易易盾的推理拼圖驗證,
探究潘多拉的秘密
首先看一下專案目錄:
gaps檔案夾下面是所有模塊的原始碼,作者對各個基礎功能做了封裝,但是我們想要的功能并不存在,就需要自行閱讀和理解原始碼,然后二開實作自己想要的功能,
我們主要關注這個檔案individual.py:
我來用大白話給你翻譯一下吧,“在所有排列中,幫你找出最優解”
輸出這個映射,結果是這樣的,正好是我們想要的東西
下面會有一個創建影像的方法,這是最后得到最優解影像拼接函式
那么,我們將最后的索引映射取到就OK了!
以下為最優解的映射值輸出實體:
初始化的時候,新增一個變數用來存盤最后的結果
self.pieceMapping = None
自定義一個函式
# 回傳映射值
def getPieceMapping(self):
return self.pieceMapping
每次執行的時候,將最優解傳遞出去
def to_image(self):
"""Converts individual to showable image"""
pieces = [piece.image for piece in self.pieces]
self.pieceMapping = self._piece_mapping
return image_helpers.assemble_image(pieces, self.rows, self.columns)
|
以上,就把我們想要的結果輸出了 呼叫:
PS:對于極度復雜的原始圖片創建的拼圖,在還原之后,誤差會挺大的,
|
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/424889.html
標籤:Python
