圖片處理和驗證碼識別

背景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

咱們先來講區分人和機器的驗證碼。就像前面那個兄弟說的,主要是爲了防止暴力破解。

可能對於人來講,知道你的一個賬號,一個一個去試你的密碼是件很傻的事情。可是對於計算機來講,寫一個程序去作這件事情簡直過輕鬆了。計算機最擅長去作重複的事情。但計算機又是這個世界上最嚴重的臉盲症患者。那麼,驗證碼的誕生就是爲了對抗程序而誕生了。這也能解釋爲何驗證碼一個個都扭曲的不行,人有時看起來都會很難識別。這都是爲了噁心計算機程序呀。

可能你已經發現如今的驗證碼愈來愈難類,連正常人都會輸錯好幾遍。

其實這主要是驗證碼破解技術也上來了,如今甚至用圖像識別,機器學習等技術來識別破解驗證碼,所謂魔高一尺道高一丈,而後苦的是咱們用戶啊....

再來講另外一類驗證碼,我的身份驗證碼。像手機短信驗證碼,手機語音驗證碼就是此類。

這類沒什麼好說的,只要你用的平臺是安全穩定而且快捷的,就不會出現大問題。

但這類驗證碼的出現,仍是帶來了驗證碼短信轟炸這種問題。

相關文章
相關標籤/搜索