Python PIL模块初探 字母验证码识别 及实战项目(爬取图
PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,但API却非常简单易用。
Python 2 安装: pip3 install PIL
Python 3 安装: pip3 install Pillow
前言:PyCharm下安装Pillow,python版本3.6
File---->Settings…选中项目下的Project Interpreter,右边的加号,搜索需要安装的模块后,进行安装
image.png
image.png
1、image 模块
Image模块是在Python PIL图像处理中常见的模块,主要是用于对这个图像的基本处理,它配合open、save、conver、show…等功能使用。
from PIL import Image
#打开文件代表打开pycharm中的文件
im = Image.open('11.png')
#展示图片
im.show()
image.png
2、 save 方法
from PIL import Image
im = Image.open('11.png')
#打印图片原来的size
width,height = im.size
#缩放到50%
im.thumbnail((width//2,height//2))
#保存一个新的图片
im.save('aa.png')
image.png
image.png
image.png
3、 new 类
Image.new(mode,size) ⇒ image
Image.new(mode, size,color) ⇒ image
使用给定的变量mode和size生成新的图像。Size是给定的宽/高二元组,这是按照像素数来计算的。对于单通道图像,变量color只给定一个值;对于多通道图像,变量color给定一个元组(每个通道对应一个值)
from PIL import Image
im = Image.open("11.png")
n_im= Image.new(im.mode, (400, 300), "white")
n_im.show()
image.png
生成一个白色的图像
4、Crop类
拷贝这个图像。如果用户想粘贴一些数据到这张图,可以使用这个方法,但是原始图像不会受到影响。
im.crop(box) ⇒ image
从当前的图像中返回一个矩形区域的拷贝。变量box是一个四元组,定义了左、上、右和下的像素坐标。用来表示在原始图像中截取的位置坐标,如box(100,100,200,200)就表示在原始图像中以左上角为坐标原点,截取一个100*100(像素为单位)的图像。
from PIL import Image
im = Image.open("11.png")
##确定拷贝区域大小
box = (384, 384, 484, 484)
##将im表示的图片对象拷贝到region中,大小为box
region = im.crop(box)
region.show()
image.png
image.png
5、Paste类
im.paste(image,box)
将一张图粘贴到另一张图像上。变量box或者是一个给定左上角的2元组,或者是定义了左,上,右和下像素坐标的4元组,或者为空(与(0,0)一样)。
from PIL import Image
im = Image.open("11.png")
box=[0,0,100,100]
im_crop = im.crop(box)
print(im_crop.size,im_crop.mode) #输出结果(100, 100) RGBA
im.paste(im_crop, (100,100))
im.paste(im_crop, (400,400,500,500))
im.show()
image.png
6、利用PIL模块,识别验证码(字母 数字类的)
配置模块pytesseract和tesseract
安装tesseract-orc,安装路径C:\Program Files (x86)\Tesseract-OCR
下载地址:https://github.com/UB-Mannheim/tesseract/wiki 点击“tesseract-ocr-w64-setup-v4.0.0.20181030.exe”下载安装。
更改环境变量模块pytesseract中的文件pytesseract.py :
tesseract_cmd = 'tesseract'
修改为:tesseract_cmd = 'C:/Program Files (x86)/Tesseract-OCR/tesseract.exe'
image.png
from PIL import Image
import pytesseract
img = Image.open('4.png')
img = img.convert('L')
result = pytesseract.image_to_string(img)
print(result)
image.png
7、实战项目
目标:利用urllib分析爬取静态网站图片,并对图片处理以及拼接成一个九宫格图像,让图片数据更加直观化展示。
分析:
7.1、 爬取网站图片,urllib
7.2、 将图片保存到一个目录image(没有自行创建)
7.3、 利用pIL 拼接
- 规定图片的大小
- 个数
- 生成新的画布
- 画布上黏贴图片
- 保存图片
from urllib import request
from lxml import etree
#访问url
req = request.Request('https://www.woyaogexing.com/tupian/weimei/')
content = request.urlopen(req).read()
#变成xpath对象
xpath_content = etree.HTML(content)
#得到匹配
img_list = xpath_content.xpath('//*[@id="main"]/div/div/div/div/a/img/@src')
for i in range(len(img_list)):
img_test = 'http:'+img_list[i]
req = request.urlopen(img_test).read()
filename = './image/'+str(i)+'.png'
# print(filename)
with open(filename,'wb') as f:
f.write(req)
import os
from PIL import Image
import re
# 规定图片大小
width_i=380
height_i=240
# 每行每列的图片数量
line_max=3
row_max=3
# 定义一个空列表
all_path=[]
num=0
# 打开文件 放置图片
for root, dirs, files in os.walk('./image/'):
for file in files:
if 'png' in file:
all_path.append(os.path.join(root, file))
# 利用正则 排序
all_path=sorted(all_path, key=lambda i: int(re.search(r'(\d+)', i).group()))
# 得到最大的图片数量 9个
pic_max=line_max * row_max
# 生成一个新的画布
toImage=Image.new('RGBA', (width_i * line_max, height_i * row_max))
# 图片处理,这是拼接
for j in range(0, line_max):
for i in range(0, row_max):
pic_file_head=Image.open(all_path[num])
width, height=pic_file_head.size
# 重新设置大小
tmppic=pic_file_head.resize((width_i, height_i))
# 规定box
loc=(int(i % line_max * width_i), int(j % line_max * height_i))
# 黏贴
toImage.paste(tmppic, loc)
num=num + 1
#
# if num > len(all_path):
# break
if num > pic_max:
break
# 报存
toImage.save('九宫格.png')
在image中生成图片
image.png
生成九宫格图片
image.png
把一个图片分割成九宫格
主要是逻辑,直接上代码
#!/usr/bin/python
# -*- coding: utf-8 -*-
from PIL import Image
#打开图片文件
im = Image.open("./image/17.png")
#获取图片的大小
imsize = im.size
#新建一张图片,原图片增加长宽都加20,即分割后的留白
n_im= Image.new(im.mode, (imsize[0]+10, imsize[1]+10), "white")
#定义分割单元格
length = imsize[0]//3
broad = imsize[1]//3
#循环粘贴图片,确定粘贴图片坐标和粘贴的图片坐标
for i in range(4):
for j in range(4):
#定义需要粘贴的九宫格图片
box = (length * i, broad * j, length * (i+1), broad * (j+1))
im_crop = im.crop(box)
#粘贴到图片的坐标
box1 = ((length+5) * i, (broad+5) * j)
n_im.paste(im_crop, box1)
n_im.show()
n_im.save('1to9.png')
效果图:
1to9.png