Python3 实现验证码图片自动切割与处理详解
本文介绍使用Python3结合PIL库实现验证码图片的自动切割方法。通过定义行列数,将原始大图分割为多个小图,便于后续OCR识别或人工校验。文中提供了完整的splitimage函数代码,包含路径处理、尺寸计算及文件保存逻辑,适用于Python爬虫及图像识别场景。
切割前图片

切割后四个图片

以下是实现该功能的核心代码。程序首先导入必要的库,包括用于图像处理的PIL(Image, ImageDraw, ImageFile)、用于数值计算的numpy、用于OCR识别的pytesseract、用于计算机视觉处理的cv2、用于图像哈希计算的imagehash以及用于数据结构的collections。核心类pictureIdenti中定义了splitimage方法,该方法接收切割行数(rownum)、列数(colnum)、目标路径(dstpath)及源图片文件名(img_name)作为参数。默认情况下,rownum为1,colnum为4,dstpath指向D:\work\python36_crawl\Veriycode,img_name指向该目录下的mode_5246.png。代码首先打开指定图片,获取其宽度和高度。若行列数未超过图片尺寸,则打印原始图片信息(宽高、格式、模式),并开始处理切割。接着解析文件路径,确定基础文件名和扩展名。通过双重循环遍历每一行和每一列,计算每个小图的宽高(rowheight = h // rownum, colwidth = w // colnum)。在循环内部,利用img.crop方法根据坐标框(box)截取图像区域,生成新文件名(格式为basename_序号.ext),保存至目标路径,并将文件路径加入列表file_list以便后续打印。最后输出所有生成的图片路径及总数量。
#coding:utf8
import os
from PIL import Image,ImageDraw,ImageFile
import numpy
import pytesseract
import cv2
import imagehash
import collections
class pictureIdenti:
#rownum:切割行数;colnum:切割列数;dstpath:图片文件路径;img_name:要切割的图片文件
def splitimage(self, rownum=1, colnum=4, dstpath="D:\work\python36_crawl\Veriycode",
img_name="D:\work\python36_crawl\Veriycode\mode_5246.png",):
img = Image.open(img_name)
w, h = img.size
if rownum <= h and colnum <= w:
print('Original image info: %sx%s, %s, %s' % (w, h, img.format, img.mode))
print('开始处理图片切割, 请稍候...')
s = os.path.split(img_name)
if dstpath == '':
dstpath = s[0]
fn = s[1].split('.')
basename = fn[0]
ext = fn[-1]
num = 1
rowheight = h // rownum
colwidth = w // colnum
file_list = []
for r in range(rownum):
index = 0
for c in range(colnum):
# (left, upper, right, lower)
# box = (c * colwidth, r * rowheight, (c + 1) * colwidth, (r + 1) * rowheight)
if index<1:
colwid = colwidth+6
elif index<2:
colwid = colwidth + 1
elif index < 3:
colwid = colwidth
box = (c * colwid, r * rowheight, (c + 1) * colwid, (r + 1) * rowheight)
newfile = os.path.join(dstpath, basename + '_' + str(num) + '.' + ext)
file_list.append(newfile)
img.crop(box).save(os.path.join(dstpath, basename + '_' + str(num) + '.' + ext), ext)
num = num + 1
index+=1
for f in file_list:
print(f)
print('图片切割完毕,共生成 %s 张小图片。' % num)
以上这篇python3 实现验证码图片切割的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













