背景
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.验证码
我们一般使用的验证码有两类,一类是区分人和机器的验证码,像你在问题发的那种,一类是验证个人身份的验证码,像手机短信验证码、语音验证码等等。
我们先来说区分人和机器的验证码。就像前面那个兄弟说的,主要是为了防止暴力破解。
可能对于人来说,知道你的一个帐号,一个一个去试你的密码是件很傻的事情。但是对于计算机来说,写一个程序去做这件事情简直太轻松了。计算机最擅长去做重复的事情。但计算机又是这个世界上最严重的脸盲症患者。那么,验证码的诞生就是为了对抗程序而诞生了。这也能解释为什么验证码一个个都扭曲的不行,人有时看起来都会很难识别。这都是为了恶心计算机程序呀。
可能你已经发现现在的验证码越来越难类,连正常人都会输错好几遍。
其实这主要是验证码破解技术也上来了,现在甚至用图像识别,机器学习等技术来识别破解验证码,所谓魔高一尺道高一丈,然后苦的是我们用户啊....
再来说另一类验证码,个人身份验证码。像手机短信验证码,手机语音验证码就是此类。
这类没什么好说的,只要你用的平台是安全稳定并且快捷的,就不会出现大问题。
但这类验证码的出现,还是带来了验证码短信轰炸这种问题。