pyc

pycapt

python 验证码处理库 pycapt,支持极便捷的验证码预处理和生成,辅助机器学习自动生成训练集。

Showing:

Popularity

Downloads/wk

0

GitHub Stars

81

Maintenance

Last Commit

2yrs ago

Contributors

2

Package

Dependencies

0

License

Categories

Readme

all

什么是 pycapt

GitHub 欢迎提 pr,如果有 bug 或新需求 请反馈 issue

pycapt 是我在处理验证码时编写的一系列图像处理的算法包,你可以使用它来为图像去噪点、干扰线 以及分割验证码,pycapt 封装了一些关于图形矩阵的方法,例如将图片分割为标准化的矩阵、生成您所需要的训练集图片等,有助于您使用深度学习来进行图像识别。

pycapt 包括处理验证码和生成验证码两部分,多谢我的好友 exqlnet ZhouYingSASA 的共同帮助 发布 pycapt 1.0.1

依赖与安装

Pillow
numpy
pip3 install pycapt

目录结构

frcc0

使用 pycapt 进行验证码图像处理

导入

import pycapt
from PIL import Image

图像二值化

two_valve : 二值化方法,必选参数 img 为图片,可选参数 Threshold 是灰度阀值,这里可以选择适合的值,默认值是 100 . 返回新处理过的图片

img = Image.open('./img/frcc0.png')
img = pycapt.two_value(img,Threshold=100)
img.show()

frcc0

frcc1

处理噪点

dele_noise :消除噪点方法,该方法使用的是八领域去噪点法,N 是领域异点个数,Z 是处理次数,处理次数越多 图形越圆滑

img = pycapt.dele_noise(img,N=5,Z=2)
img.show()

frcc2

处理干扰线

dele_line : 去除干扰线,删除连续的 N 个竖直像素。配合 dele_noise 方法使用效果更佳。

img = pycapt.dele_line(img,N=4)
img.show()

配合 dele_noise 方法使用效果更佳。

img = pycapt.dele_line(img,4)
img = pycapt.dele_noise(img,N=4,Z=2)
img = pycapt.dele_line(img,3)
img = pycapt.dele_noise(img,N=4,Z=2)
img = pycapt.dele_line(img,3)
img = pycapt.dele_line(img,2)
img = pycapt.dele_line(img,1)
img.show()

frcc2

想要更好的效果,你还可以先使用转置图片的 tran_90(img) 方法 再次使用去除干扰线的方法,最后再转置回来

img = pycapt.tran_90(img)
img.show()
img = pycapt.dele_line(img,3)
img = pycapt.dele_line(img,2)
img = pycapt.dele_line(img,1)
img = pycapt.tran_90(img)
img.show()

frcc2

斜体矫正

斜体矫正的目的是为了更好的分割与识别。原理是平移,将每一行向左或向右平移不同距离,最后形成矫正的效果。pans 就是矫正列表,正左负右平移。pans 列表的元素个数需要是图片的高度,例子中图片 height 是 40.

rectify_img(img,pans) 返回新的图片。

pan = [18, 18, 18, 18, 17, 17, 17,\
        16, 16, 16, 15, 15, 15, 15, 14,\
        14, 14, 14, 13, 13, 10, 10,\
        10, 9, 9, 8, 7, 6, 5, 5, 4, \
        4, 4, 4, 4, 3, 1, 0, 0, 0]
img = pycapt.rectify_img(img,pans=pan)
img.show()

frcc2

如果你觉得太难看了,可以提前使用矫正再使用 dele_line 和 dele_noise, 当然亡羊补牢也不太坏。

img = pycapt.rectify_img(img,pans=pan)
img = pycapt.dele_line(img,3)
img = pycapt.dele_line(img,2)
img = pycapt.dele_line(img,1)
img.show()

frcc2

图形分割

cut_img_to_img_list 设置单个图片合适长度后切割,返回该长度的切割图片,该长度可以设置的比较大,该方法会在切割图片的两边补白。你可以将这作为一种标准化图片的方法。

img = Image.open('1.png')
img_list = pycapt.cut_img_to_img_list(img,max_width=30,background=255)
for i in img_list:
    i.show()

frcc2

当你使用深度学习时,还可以使用 cut_img_to_mode_list(image,max_width) 来获得标准化的数组。

图片裁剪

当你的图片 height 可以压缩时,可以使用 small_img(img,box) 来裁剪图片,这样可以减少之后学习的计算量。

例如

使用 pycapt 生成验证码训练集

do_captcha 生成验证码训练集

width 验证码图片长度,height 验证码高度,num_of_str 验证码上字符数量 默认 4,font 字体大小 默认 30,gray_value 灰度值 默认 255,font_family 字体文件,在这里可以选择你需要的粗细,样式等,但前提是你电脑上有这种字体。

如果你不知道自己电脑有哪些字体,请点击 这里

name,img = pycapt.do_captcha(
        my_str_list=['A','B','C','D','1','2','3'],
        width=160,
        height=40,
        num_of_str=4,
        font=30,
        gray_value=255,
        font_family='ヒラギノ角ゴシック W8.ttc')

print(name)
img.show()

# output: ['C', 'D', '2', 'A']

frcc2

增加噪点

more_noise :N 是加噪率,0 < N < 1,Z 为处理次数

img = pycapt.more_noise(img,N=0.5,Z=2)

frcc2

偏移

img = pycapt.img_pan(img,10,3)

frcc2

倾斜

还是和之前一样 使用 rectify_img

pan = [18, 18, 18, 18, 17, 17, 17,\
        16, 16, 16, 15, 15, 15, 15, 14,\
        14, 14, 14, 13, 13, 10, 10,\
        10, 9, 9, 8, 7, 6, 5, 5, 4, \
        4, 4, 4, 4, 3, 1, 0, 0, 0]
img = pycapt.rectify_img(img,pans=pan)

frcc2

加去噪点 变平滑

clear_train_img 相当于 dele_line(line,N) 分别对 line 消除了 N=4,3,2,1 的 4 次噪点,也就相当于纵向变平滑了

img = pycapt.show_noise_img(img,0.1,1)
img = pycapt.dele_noise(img,5,2)
img = pycapt.clear_train_img(img)

frcc2

这里 你完全可以使用 pycapt 生成深度学习验证码的训练集了。

那如果想要更方便点呢? 请看这里。

直接生成训练集的方法

train_img 返回训练集图片,my_str_list,你的字符集列表,width height 长度高度,num_of_str 显示在验证码图片上的字符串个数,会从你的 my_str_list 中随机挑选,font 显示的字体大小,xpan ypan 左右与上下随机偏移尺寸,rotate 字符随机旋转尺度,noise_N 加噪率(0 < N < 1),noise_Z 加噪次数,gray_value 背景灰度,默认白色,font_family 字体样式,如果你不知道自己电脑有哪些字体,请点击 这里

filename,img = pycapt.train_img(
    my_str_list=['A','B','C','D','E'],
    width=30,
    height=32,
    num_of_str=1,
    font=30,
    xpan=3,
    ypan=2,
    rotate=15,
    noise_N=0.3,
    noise_Z=2,
    gray_value=255,
    font_family='ヒラギノ角ゴシック W8.ttc')

只要你再写一个循环,img.save('train_img/{}.png'.format(file_name)) 就可以生成成千上万张训练集图片 获取标签只需要 name = file_name[0] 就可以惹。

frcc2

Last

理论上只要你使用 pycapt 处理图片,调用各方法,并使用 train_img 方法 ,理论上可以解决 90%验证码处理和模拟生成问题,欢迎 star pr 和提 issue,如果你想更了解其中的原理,点击这里,期望听见你的想法或 pr。

小额捐赠

如果有所帮助 请我喝一碗茶~

Rate & Review

Great Documentation0
Easy to Use0
Performant0
Highly Customizable0
Bleeding Edge0
Responsive Maintainers0
Poor Documentation0
Hard to Use0
Slow0
Buggy0
Abandoned0
Unwelcoming Community0
100
No reviews found
Be the first to rate

Alternatives

No alternatives found

Tutorials

No tutorials found
Add a tutorial