python 识别数字模块_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

image.png

安装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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值