PE來自論壇
全面支持將本PE安裝到本地系統,自動識別當前系統的啟動方式(UEFI或legacy)。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
文件名稱: 大漠孤鷹20170516_Win10_PE_X64.iso
文件大小: 243.78 MB (255,623,168 字節)
修改時間: 2017年05月16日,12:53:47
MD5: 31487F0C8B7B65A77360E2F697ACE7DD
SHA1: 99A9C3A6718C2FB70AAB4031A38A85CADA42AF25
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
下載地址:見評論
3 小時前 上傳
點擊文件名下載附件
sshot-1.jpg (74.34 KB, 下載次數: 0)
下載附件
3 天前 上傳
作者:打字的小強
識別驗證碼一直是本人想要做的事情,一直在接觸按鍵精靈,了解到有一個虹魚圖靈識別插件專門做驗證碼和圖像識別,原理就是圖片處理和制作字庫識別,制作字庫我一直覺得很麻煩,工程量太大。不管怎樣,它能夠達到我的目的,并且比機器學習,opencv是要簡單點,那我就講講這個虹魚圖靈識別插件。
先亮一下成果勾引,嘿嘿
私信小編001即可獲取大量python學習資料!
一.收集驗證碼圖片。
就找一個最常見的藍奏云的下載輸入的驗證碼。fiddler抓一下,說一下這個驗證碼特征,都是數字,1-4個數字,沒有旋轉,沒有在一行,有干擾直線,有干擾點。
找到鏈接了,接下來寫代碼,這個驗證碼圖片接口,沒有任何反爬。新建一個save_img.py,新建兩個文件夾,一個做字庫,一個做驗證集。一個100張。先爬兩百張圖片。
import requests
urls = "https://vip.d0.baidupan.com/file/imagecode.php"
for i in range(100):
datas = requests.get(urls)
with open('./verify/'+str(i)+'.png', 'wb') as file:
file.write(datas.content)
二.處理圖片,制作字庫
預先說明,虹魚圖靈識別插件跟大漠一樣,只能用32位的python調用,建議用conda新建python3.7 32位的python虛擬環境,cmd進入環境安裝相關包,不要在pycharm安裝。
虹魚圖靈識別插件需要事先注冊到系統,下載圖靈2.82(Python公開版),里面有安裝教程,本人測試的系統為win10。
import TURING
import easygui
import cv2
def identi(names):
img_data = "./pic/"+str(names)+".png"
TURING.Pixel_FromPicture(img_data)
im = cv2.imread(img_data)
#切割圖片,保留有效的圖片
im = im[0:30, 0:99]
TURING.Filter_Tailor(0,0,99,30)
#色調分離,將整個圖片的顏色分為幾種。下面的函數將圖片分成四種顏色分別為:0,85,170,255。將每一個點的rgb平均值放到四個區間對比。這四個區間為:0-64,64-128,128-192,192-255。落在每個區間就會固定一個顏色值,方便后面的圖像處理
TURING.Filter_Posterization(4)
#二值化,其中的參數是色階閾值,色階閾值:一個點分為rgb三個值,三個值的平均值為閾值。該函數的作用就是遍歷圖像的每一個點的rgb平均值改變點的顏色,大于閾值為白色。小于閾值為黑色,現在設置閾值為95,處理后就會變成黑白色的圖片了。
TURING.Filter_Binaryzation("95")
#去除雜點,現在是白底黑字,每個像素點周圍一共8個點。周圍大于8個白點是就由白變黑 ,作用就是去除孤立的顏色點
TURING.Filter_Despeckle(8,0,0)
#顏色反轉 轉前白底黑字 轉后黑底白字,只有黑底白字才能進行字符切割。
TURING.Filter_InverseColor()
#范圍投影字符切割,最重要的一步,非常難解釋。為插件作者獨創的算法,簡單的說一下大概的內容,如有人想仔細了解可以問作者哈哈。作用就是找到切割驗證碼的字符,識別有幾個字符,字符的范圍和位置
#現在是黑底白字的圖片,以每一個白點為一個字符范圍起始點。字符范圍為一個矩形,需要一個終點才能圈成一個矩形,從上往下從左往右遍歷找終點,第一步就是識別這個白點的右下角的顏色如果也是白色,終點往下移動,(高度+1),如果是黑色,終點就要往右下角移動(高+1,寬+1),直到遇到圖片的邊緣或者超過設置的間隙。
#這時候要注意一個字可能會被切成兩個部分,就要設置行間隙和列間隙。下面根據實際情況設置最小的行間隙和列間隙就是8,字符之間的間隔最少為8個像素,還可以設置其他的參數,比如矩形框的寬高范圍,不在范圍的框框拋棄
TURING.Incise_ScopeAisle(8,8)
#獲取切割后的數據,返回值是字符串比較長,每個框的數據以豎杠分割,其中一個框的數據有四個,分別是左上角的坐標,寬高,圖色數據以逗號分割,拿兩個點的數據給大家看看
#8, 13, 8, 10, 00111111000111110110110001000110001000011000100000110011001101100111100000001100 | 30, 11, 8, 10, 00110000000011000110100001001110000100011000000001110010001101011011100001101100
datas = TURING.Incise_GetCharData()
# add_num這是要在opencv畫框的邊緣擴充參數,下面會用插件的捕獲到框框數據繪制大一點的框框來制作字庫,好看一點
add_num = 3
if len(datas)>0:
datas_list = datas.split("|")
for j in datas_list:
data_lists = j.split(",")
x1 =int(data_lists[0])-add_num #左上角的x坐標
y1 = int(data_lists[1])-add_num #左上角y坐標
x2 = int(data_lists[0]) +int(data_lists[2])+add_num #框的寬
y2 = int(data_lists[1])+int(data_lists[3])+add_num #框的高
cv2.rectangle(im,(int(x1),int(y1)),(int(x2),int(y2)),(255,0,255),1) #繪制框框
im = cv2.resize(im, None, fx=2.5, fy=2.5, interpolation=cv2.INTER_CUBIC) # 圖太小了,需要寬高各乘以2.5來看下這個圖以便人工識別這個圖的數字是多少
cv2.imshow("draw_0", im)
cv2.moveWindow("draw_0", 800, 300) # 移動顯示圖片的窗口,因為默認的位置遮擋了下面的輸入彈窗
#統計識別的字符個數
data_len = len(datas_list)
#彈窗顯示原始驗證碼,顯示驗證碼的個數,輸入框人工輸入數字
input_data = easygui.enterbox(msg="請輸入" + str(data_len) + "個字符添加進入字庫:", title=' ', default=' ', strip=True,
image=img_data, root=None)
for k in range(data_len):
# 組裝字庫的內容
data_lists = datas_list[k].split(",")
#制作字庫
insert_data = input_data[k] + "|" + data_lists[2] + "," + data_lists[3] + "|" + data_lists[4]
#添加字庫數據進入字庫文件
print("插入數據:"+input_data[k] + "|" + data_lists[2] + "," + data_lists[3] + "|" + data_lists[4] )
with open("識別庫1.lib", 'a+') as f:
f.write(insert_data + "\n")
#關閉所有opencv創建的窗口
cv2.destroyAllWindows()
else:
return
#遍歷所有的驗證碼
for i in range(100):
identi(i)
三.來驗證,算一下正確率
運行的效果就是本貼第一個圖
import TURING
import easygui
def identifys(names):
#打開圖片,同樣的處理圖片
TURING.Pixel_FromPicture("./verify/" + str(names) + ".png")
TURING.Filter_Tailor(0, 0, 99, 30)
TURING.Filter_Posterization(4)
TURING.Filter_Binaryzation("95")
TURING.Filter_Despeckle(8, 0, 0)
# 顏色反轉 ()轉后黑底白字,轉前白底黑字
TURING.Filter_InverseColor()
TURING.Incise_ScopeAisle(8, 8)
TURING.Lib_Load("識別庫1.lib") #加載識別字庫
識別結果 =TURING.OCR(0, 1) #獲取識別結果,可以設置結果格式,可以顯示相似度,和x,y坐標等等。是一個字符串,以|分割,
result =識別結果.split("|")[0]
#來個彈框來肉眼證明結果的準確性
choices_data = easygui.ccbox(msg='識別結果是'+result, title=' ', choices=('True', 'false'), image="./verify/" + str(names) + ".png")
return choices_data
suc = 0
for i in range(100):
res = identifys(i)
if res:
#統計正確的數量
suc =suc+1
print(suc)
最后總結:
弄完了賊有成就感,這種驗證碼還是有很多地方在用的,PHP框架里面好多項目都用這種驗證碼,最主要還是要了解圖像處理的原理才會融會貫通,要繼續學習繼續努力,驗證碼越來越難了。
這還是一個簡單的測試版本,驗證了100個圖片正確了91個,有的人眼分的不是很清楚,已經很可以了如果還想提高準確度,可以再加一些字庫,或者更換圖片處理方式,或者修改人眼識別庫的錯誤等等。感謝大家的欣賞,有幫助給個免費轉發哦,或者多多關注我,才是我繼續下去的動力,哈哈