不包括神經網路,識別效果只有20%左右,不過我的需求是自動登陸,能夠滿足
最近想寫乙個自動登陸網頁的指令碼,但是發現目標網頁有驗證碼,所以就需要寫乙個東西去識別驗證碼
一開始使用的是pytesseract,可是這個pytesseract對於簡單的驗證碼識別還可以,但是對於這種帶干擾線的驗證碼就無能為力了。
(ps. 簡單的驗證碼就是字元跟字元之間沒有粘在一起,然後角度都是正的,分割出來,一句話說就是想列印的字型)
上圖其實是tesseract,不過pytessract也是python對tesseract的api封裝而已
在使用tesseract的時候,發現一些引數是十分重要的,比如 --psm
tesseract your_picture.png your_output_file_name --psm 10
# 10 表示識別單一字元,對於只有乙個字元的時候很有效
還有像config目錄下面可以自定義自己想要輸出的字元,比如你想識別身份證,可以限制輸出的字元是0123456789x,這樣也能提高準確率。反正就是多看文件!多看文件!多看文件!文件裡啥都有,不要用了發現沒識別出來,就說人家的軟體不行,實在不行,我們還能進行一些預處理
後面就用ipl進行了預處理,包括降噪、灰度化、二值化、切割等:
# 展示驗證碼
def show_captcha(file_path):
img = image.open(file_path)
img.show()
# 灰度化
def to_gray(img):
img_gray = img.convert('l')
return img_gray
# 二值化
def to_binary(img, threshold=200):
table =
for i in range(256):
if i < threshold:
else:
img_binary = img.point(table, '1')
return img_binary
# 降噪
def reduce_noise(img):
img_data = np.array(img, dtype=np.uint8)
row, col = img_data.shape
for i in range(row):
for j in range(col):
count = 0
if img_data[i, j] != 255: # 255 white
# up search
up_i = i - 1
while up_i - 1 >= 0 and img_data[up_i, j] != 255:
count += 1
up_i -= 1
# down search
down_i = i + 1
while down_i + 1 <= row - 1 and img_data[down_i, j] != 255:
count += 1
down_i += 1
# clean
if count <= 3:
for tmp_i in range(up_i, down_i):
img_data[tmp_i, j] = 255
img_reduce_noise = image.fromarray(img_data.astype('uint8'))
return img_reduce_noise
# 修復
def fix(img):
img_data = np.array(img, dtype=np.uint8)
row, col = img_data.shape
for i in range(row):
for j in range(col):
if img_data[i, j] == 255:
up_j = j - 1
down_j = j + 1
if up_j >= 0 and down_j <= col - 1 and img_data[i, up_j] != 255 and img_data[i, down_j] != 255:
# fix
img_data[i, j] = 0
img_fix = image.fromarray(img_data.astype('uint8'))
return img_fix
def crop(img):
img_data = np.array(img, dtype=np.uint8)
row, col = img_data.shape
visited = {}
for j in range(col):
for i in range(row):
if img_data[i, j] == 0:
dfs(img_data, i, j, visited)
break
else:
continue
break
fx, fy = list(visited.keys())[0]
print(fx, fy)
up, down, left, right = fx, fx, fy, fy
for x, y in visited:
if y > right:
right = y
if y < left:
left = y
if x < up:
up = x
if x > down:
down = x
print(left, up, right, down)
img_crop = img.crop((left, up, right, down))
return img_crop
"""img_data 二維陣列
visited {}
"""def dfs(img_data, i, j, visited):
# find first point
row, col = img_data.shape
visited[(i, j)] = 1
if j - 1 >= 0 and img_data[i, j-1] == 0 and (i, j-1) not in visited:
dfs(img_data, i, j-1, visited)
if j + 1 <= col - 1 and img_data[i, j+1] == 0 and (i, j+1) not in visited:
dfs(img_data, i, j+1, visited)
if i - 1 >= 0 and img_data[i-1, j] == 0 and (i-1, j) not in visited:
dfs(img_data, i-1, j, visited)
if i + 1 <= row - 1 and img_data[i+1, j] == 0 and (i+1, j) not in visited:
dfs(img_data, i+1, j, visited)
再識今目標
認真的檢視了我的今目標使用情況,看到了我們一路走來的點點滴滴。發現我們已經使用今目標2年多了 2012.06.24開始 很驚訝!為什麼會這樣?乙個使用了2年多的工具 學習小助手應該更貼切些 到現在我還沒有將它融合到我們的生活中。或者說,沒有真正認識到它在我的學習歷程中地位。2年的成長,誰在為我們見證...
DeepFace Facebook的人臉識別
連續看了deepid和facenet後,看了更早期的一篇 即fb的deepface。這篇 早於deepid和facenet,但其所使用的方法在後面的 中都有體現,可謂是早期的奠基之作。因而特寫博文以記之。人臉識別的基本流程是 detect align represent classify分為如下幾步...
重識物件導向
最近的學習進行到了uml階段。上來的第一節課就是講的物件導向。很早以前公尺老師上課的時候就給我們講過了,雖然只是簡單的講解,但現在看起來還是讓我覺得受益匪淺。現在來談談我自己的理解 物件導向是一種軟體開發方法,是一種對現實世界理解和抽象的方法。既然是物件導向。那這個物件是什麼呢?物件其實就是我們要進...