图片处理和验证码识别

背景

1.灰度化

将图片的RGB三通道的值变成单通道,用计算公式变成一个值,也就是单通道

2.二值化

将灰度化后的图片进一步处理,将图片所有的像素点的通道变成两种类型的值,比如设定一个阈值,灰度化之后的像素点的值小于这个阈值设为0,大于这个阈值255,一般作为特征向量设为0,1,显示就设为0,255,也可以是其他0-255之间的值,其中一个值为0

ps:一般识别轮廓不注重色彩可以进行灰度化和二值化,识别带色彩的图片不进行灰度化和二值化

3.示例代码

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.验证码

我们一般使用的验证码有两类,一类是区分人和机器的验证码,像你在问题发的那种,一类是验证个人身份的验证码,像手机短信验证码、语音验证码等等。

我们先来说区分人和机器的验证码。就像前面那个兄弟说的,主要是为了防止暴力破解。

可能对于人来说,知道你的一个帐号,一个一个去试你的密码是件很傻的事情。但是对于计算机来说,写一个程序去做这件事情简直太轻松了。计算机最擅长去做重复的事情。但计算机又是这个世界上最严重的脸盲症患者。那么,验证码的诞生就是为了对抗程序而诞生了。这也能解释为什么验证码一个个都扭曲的不行,人有时看起来都会很难识别。这都是为了恶心计算机程序呀。

可能你已经发现现在的验证码越来越难类,连正常人都会输错好几遍。

其实这主要是验证码破解技术也上来了,现在甚至用图像识别,机器学习等技术来识别破解验证码,所谓魔高一尺道高一丈,然后苦的是我们用户啊....

再来说另一类验证码,个人身份验证码。像手机短信验证码,手机语音验证码就是此类。

这类没什么好说的,只要你用的平台是安全稳定并且快捷的,就不会出现大问题。

但这类验证码的出现,还是带来了验证码短信轰炸这种问题。

你可能感兴趣的:(图片处理和验证码识别)