zoukankan      html  css  js  c++  java
  • 爬虫(十三):PIL模块

    1. PIL模块

    爬虫(十二):图形验证码的识别、滑动验证码的识别(B站滑动验证码)中我留下了一个悬念,为什么安装的是pillow模块,而不是PIL模块。这是因为PIL是python2的产物,它并没有跟随python的发展而发展。所以有大佬为此特意写了一个针对python3的pillow模块。所以,如果需要安装python3对应的PIL,应该选择安装pillow。

    1.1 导入Image模块

    我们一般只使用PIL模块中的Image模块,所以我这就只讲解Image模块了。

    安装PIL模块:

    pip install pillow -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

    导入模块:

    from PIL import Image

    1.2 Image模块常用方法

    (1) 读取图片

    open(url):读取一张图片,参数是图片名。

    (2) 显示图片

    show():显示一张图片。

    案例:

    from PIL import Image
    
    img = Image.open('xhh.jpg')
    img.show()

    结果:

    (3) 保存图片

    save(image,type):将图像保存为名称为“image”、格式为type格式的图片。

    (4) 创建新图片

    new(mode,size):创建一张模式为mode、大小为size的图片。

    new(mode,size,color):创建一张模式为mode、大小为size、颜色为color的图片。

    案例:

    from PIL import Image
    
    newImg = Image.new("RGBA",(640,480),(255,0,0))
    newImg.save("newImg.png","PNG")

    结果:

    (5) 两张图片相加

    blend(img1,img2,alpha):将img1和img2,这里alpha表示img1和img2的比例参数 

    (6) 改变图像大小

    resize(size):将图像修改为size大小

    案例1:

    from PIL import Image
    
    img1 = Image.open("xhh.jpg")
    img2 = Image.open("xhh2.jpg")
    #img = img1×0.8+img2×0.2
    img = Image.blend(img1,img2,0.2)
    img.show()

    结果:

    为什么会报错呢?因为他们的大小不一样,而这个报错在官方是没有解释的。

    案例2:

    from PIL import Image
    
    img1 = Image.open("xhh.jpg")
    img1 = img1.resize((256,256))
    img2 = Image.open("xhh2.jpg")
    img2 = img2.resize((256,256))
    #img = img1×0.7+img2×0.3
    img = Image.blend(img1,img2,0.3)
    img.show()

    结果:

    (7) 点操作 

    point(function):这个function接受一个参数,且对图片中的每一个点执行这个函数。

    案例:

    from PIL import Image
    
    img = Image.open("xhh.jpg")
    img.show()
    out=img.point(lambda i:i*1.5)#对每个点进行50%的加强
    out.show()

    这前后对比明显吧。 

    (8) 查看图像信息

    from PIL import Image
    
    img = Image.open("xhh.jpg")
    print(img.format)
    print(img.size)
    print(img.mode)

    结果:

    (9) 图片裁剪

    crop(box):设置要裁剪的区域范围box。

    案例:

    from PIL import Image
    
    img = Image.open("xhh.jpg")
    box=(100,100,500,500)
    #设置要裁剪的区域
    region=img.crop(box) #此时,region是一个新的图像对象。
    region.show()

    结果:

    (10) 图像黏贴(合并)

    paste(region,box):黏贴box大小的region图像到原来的图片对象中。

    案例:

    from PIL import Image
    
    img1 = Image.open("xhh.jpg")
    img2 = Image.open("xhh2.jpg")
    img1.paste(img2,(0,0))
    img1.show()

    结果:

    (11) 通道分离

    split():分割成三个通道,此时r,g,b分别为三个图像对象。

    (12) 通道合并

    merge("RGB",(b,g,r)):将b,r两个通道进行翻转。

    案例:

    from PIL import Image
    
    img1 = Image.open("xhh.jpg")
    img1.show()
    r, g, b = img1.split()
    img2 = Image.merge("RGB", (b, g, r))
    img2.show()

    结果:

    (13) 旋转图像

    rotate(angle):逆时针旋转angle度。 

    (14) 图像转换

    案例:

    from PIL import Image
    
    img = Image.open("xhh.jpg")
    #左右对换
    out1 = img.transpose(Image.FLIP_LEFT_RIGHT)
    out1.show()
    #上下对换
    out2 = img.transpose(Image.FLIP_TOP_BOTTOM)
    out2.show()

    结果:

    (15) 图像类型转换

    convert(mode):将图像转换成mode类型。

    PIL的九种不同模式:1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。

    常用的两种:

    1.模式”1”
    为二值图像,非黑即白。但是它每个像素用8个bit表示,0表示黑,255表示白。下面我们将lena图像转换为“1”图像。
    from PIL importImage
    img = Image.open(“E:imagemyimg.jpg”)
    img_1=img.convert(“1”)
    2.模式“L”
    为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:
    L = R * 299/1000 + G * 587/1000+ B * 114/1000

    (16) 获取某个像素位置的值

    getpixel(coordinate):coordinate为(x,y)形式的值。

    (17) 修改某个像素位置的值

    putpixel(coordinate,color):修改像素位置coordinate的颜色color的值。

    案例:

    from PIL import Image
    
    img = Image.open("xhh.jpg")
    
    print(img.size)
    print(img.getpixel((4, 4)))
    
    width = img.size[0]  # 长度
    height = img.size[1]  # 宽度
    
    for w in range(0, width):
        for h in range(0, height):
            data = img.getpixel((w, h))  # 得到像素值
            if (data[0] <= 170 and data[1] <= 170 and data[2] <= 170):
                img.putpixel((w, h), (0, 0, 255))  # 则这些像素点的颜色改成大红色
    
    img.show()

    结果:

  • 相关阅读:
    stenciljs 学习四 组件装饰器
    stenciljs 学习三 组件生命周期
    stenciljs 学习二 pwa 简单应用开发
    stenciljs ionic 团队开发的方便web 组件框架
    stenciljs 学习一 web 组件开发
    使用npm init快速创建web 应用
    adnanh webhook 框架 hook rule
    adnanh webhook 框架 hook 定义
    adnanh webhook 框架request values 说明
    adnanh webhook 框架execute-command 以及参数传递处理
  • 原文地址:https://www.cnblogs.com/liuhui0308/p/12099467.html
Copyright © 2011-2022 走看看