背景python
1.灰度化安全
將圖片的RGB三通道的值變成單通道,用計算公式變成一個值,也就是單通道app
2.二值化機器學習
將灰度化後的圖片進一步處理,將圖片全部的像素點的通道變成兩種類型的值,好比設定一個閾值,灰度化以後的像素點的值小於這個閾值設爲0,大於這個閾值255,通常做爲特徵向量設爲0,1,顯示就設爲0,255,也能夠是其餘0-255之間的值,其中一個值爲0學習
ps:通常識別輪廓不注重色彩能夠進行灰度化和二值化,識別帶色彩的圖片不進行灰度化和二值化spa
3.示例代碼code
import tesserocr
from PIL import Image
image = Image.open("./0.jpg")
# 灰度化
image = image.convert("L")
image.show()
# 默認閾值二值化
# image = image.convert("1")
# image.show()
# 設定閾值二值化
threshold = 155
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
image = image.point(table,'1')
image.show()
result = tesserocr.image_to_text(image)
print(result)
複製代碼
示例代碼2圖片
import cv2
import os
import numpy as np
import copy
from PIL import Image
from PIL import ImageEnhance
from PIL import ImageFilter
image = Image.open('3.jpg')
pixdata = image.load()
out = image.convert('L')
# 灰度化
threshold = 45
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
out = out.point(table, '1')
out.show()
# 去除邊框
widths = 1
w, h = out.size
pixdata2 = out.load()
for x in range(widths):
for y in range(0, h):
pixdata2[x, y] = 255
for x in range(w - widths, w):
for y in range(0, h):
pixdata2[x, y] = 255
for x in range(0, w):
for y in range(0,widths):
pixdata2[x, y] = 255
for x in range(0, w):
for y in range(h-widths, h):
pixdata2[x, y] = 255
# 去除噪聲
def del_noise(img, number):
# height = img.shape[0]
# width = img.shape[1]
height, width = img.size
# print(height,width)
img_new = copy.deepcopy(img)
# print(img_new)
for i in range(1, height - 1):
for j in range(1, width - 1):
point = [[], [], []]
count = 0
point[0].append(img.getpixel((i - 1,j - 1)))
point[0].append(img.getpixel((i - 1,j)))
point[0].append(img.getpixel((i - 1,j + 1)))
point[1].append(img.getpixel((i,j - 1)))
point[1].append(img.getpixel((i,j)))
point[1].append(img.getpixel((i,j + 1)))
point[2].append(img.getpixel((i + 1,j - 1)))
point[2].append(img.getpixel((i + 1,j)))
point[2].append(img.getpixel((i + 1,j + 1)))
for k in range(3):
for z in range(3):
if point[k][z] == 0:
count += 1
print(count)
if count <= number:
img_new.putpixel((i, j), 255)
# img_new[i, j] = 1
img_new.show()
return img_new
out = del_noise(out, 6)
# out.show()
複製代碼
4.驗證碼get
咱們通常使用的驗證碼有兩類,一類是區分人和機器的驗證碼,像你在問題發的那種,一類是驗證我的身份的驗證碼,像手機短信驗證碼、語音驗證碼等等。string
咱們先來講區分人和機器的驗證碼。就像前面那個兄弟說的,主要是爲了防止暴力破解。
可能對於人來講,知道你的一個賬號,一個一個去試你的密碼是件很傻的事情。可是對於計算機來講,寫一個程序去作這件事情簡直過輕鬆了。計算機最擅長去作重複的事情。但計算機又是這個世界上最嚴重的臉盲症患者。那麼,驗證碼的誕生就是爲了對抗程序而誕生了。這也能解釋爲何驗證碼一個個都扭曲的不行,人有時看起來都會很難識別。這都是爲了噁心計算機程序呀。
可能你已經發現如今的驗證碼愈來愈難類,連正常人都會輸錯好幾遍。
其實這主要是驗證碼破解技術也上來了,如今甚至用圖像識別,機器學習等技術來識別破解驗證碼,所謂魔高一尺道高一丈,而後苦的是咱們用戶啊....
再來講另外一類驗證碼,我的身份驗證碼。像手機短信驗證碼,手機語音驗證碼就是此類。
這類沒什麼好說的,只要你用的平臺是安全穩定而且快捷的,就不會出現大問題。
但這類驗證碼的出現,仍是帶來了驗證碼短信轟炸這種問題。