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 拼接

  1. 规定图片的大小
  2. 个数
  3. 生成新的画布
  4. 画布上黏贴图片
  5. 保存图片
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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容