美文网首页
Python PIL模块初探 字母验证码识别 及实战项目(爬取图

Python PIL模块初探 字母验证码识别 及实战项目(爬取图

作者: 也然君 | 来源:发表于2018-11-14 01:01 被阅读16625次

    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

    相关文章

      网友评论

          本文标题:Python PIL模块初探 字母验证码识别 及实战项目(爬取图

          本文链接:https://www.haomeiwen.com/subject/oaorfqtx.html