zoukankan      html  css  js  c++  java
  • python-pillow图像处理

    安装 pip3 install pillow   

    PIL中所涉及的基本概念有如下几个:通道(bands)、模式(mode)、尺寸(size)、坐标系统(coordinate system)、调色板(palette)、信息(info)和滤波器(filters)

    1、  通道

    以RGB图像为例,每张图片都是由三个数据通道构成,分别为R、G和B通道。而对于灰度图像,则只有一个通道

    2、  模式

    图像的模式定义了图像的类型和像素的位宽。当前支持如下模式:

    1:1位像素,表示黑和白,但是存储的时候每个像素存储为8bit。
    L:8位像素,表示黑和白。
    P:8位像素,使用调色板映射到其他模式。
    RGB:3x8位像素,为真彩色。
    RGBA:4x8位像素,有透明通道的真彩色。
    CMYK:4x8位像素,颜色分离。
    YCbCr:3x8位像素,彩色视频格式。
    I:32位整型像素。
    F:32位浮点型像素。
    PIL也支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)

    3、  尺寸 

    通过size属性可以获取图片的尺寸。这是一个二元组,包含水平和垂直方向上的像素数 

    4、  坐标系统 

    PIL使用笛卡尔像素坐标系统,坐标(0,0)位于左上角。注意:坐标值表示像素的角;位于坐标(0,0)处的像素的中心实际上位于(0.5,0.5)。

    坐标经常用于二元组(x,y)。长方形则表示为四元组,前面是左上角坐标。例如,一个覆盖800x600的像素图像的长方形表示为(0,0,800,600)

    5、  调色板

    调色板模式 ("P")使用一个颜色调色板为每个像素定义具体的颜色值

    6、  信息

    使用info属性可以为一张图片添加一些辅助信息。这个是字典对象。加载和保存图像文件时,多少信息需要处理取决于文件格式

    7、  滤波器

    对于将多个输入像素映射为一个输出像素的几何操作,PIL提供了4个不同的采样滤波器:

    NEAREST:最近滤波。从输入图像中选取最近的像素作为输出像素。它忽略了所有其他的像素。
    BILINEAR:双线性滤波。在输入图像的2x2矩阵上进行线性插值。注意:PIL的当前版本,做下采样时该滤波器使用了固定输入模板。
    BICUBIC:双立方滤波。在输入图像的4x4矩阵上进行立方插值。注意:PIL的当前版本,做下采样时该滤波器使用了固定输入模板。
    ANTIALIAS:平滑滤波。这是PIL 1.1.3版本中新的滤波器。对所有可以影响输出像素的输入像素进行高质量的重采样滤波,以计算输出像素值。在当前的PIL版本中,这个滤波器只用于改变尺寸和缩略图方法。
    注意:在当前的PIL版本中,ANTIALIAS滤波器是下采样(例如,将一个大的图像转换为小图)时唯一正确的滤波器。BILIEAR和BICUBIC滤波器使用固定的输入模板,用于固定比例的几何变换和上采样是最好的
    from PIL import Image
    im=Image.open(r'./大象.jpg')  #打开图像
    #im.show()  #显示图像
    #打开的图像可以是jpg、bmp、png、GIF等
    print(im.format)  #返回图像的格式
    #PNG
    print(im.size)  #返回图像的大小
    #(499, 334)
    im1 = im.resize((256,256))  #图像的缩放
    #返回的是新图像,不是在原来的图像上缩放
    print(im.getbands())  #返回通道的名称
    #('R', 'G', 'B')
    print(im.mode)  #返回图像的模式
    #RGB
    print(print(im.info))  #返回图片信息
    #{'dpi': (96, 96)}
    #None
    print(im.palette)  #颜色调色板表格
    #如果图像的模式是“P”,则返回ImagePalette类的实例;否则,将为None
    print(im.getpixel((100, 50)))  #返回指定坐标的颜色值
    #(191, 191, 191)
    #im.putpixel((100,50),(255,0,0))  #给指定坐标值赋值颜色
    #im.save('pp.bmp')  #保存图像---只要是支持的格式就行
    im2=im.rotate(90)  #支持任意角度的旋转--单位度--正数逆时针
    #transpose支持部分特殊角度的旋转,如90、180、270、水平和垂直翻转
    im3=im.transpose(Image.ROTATE_270)  #逆时针旋转270度
    #Image.ROTATE_90   逆时针旋转90度
    #im4=im.transpose(Image.FLIP_LEFT_RIGHT)
    #Image.ROTATE_270
    im4=im.transpose(Image.FLIP_LEFT_RIGHT)  #左右翻转
    im5=im.transpose(Image.FLIP_TOP_BOTTOM)  #上下翻转
    
    box=(120,194,220,294)  #区域
    im6=im.crop(box)  #裁剪
    im6=im6.transpose(Image.ROTATE_180)
    #im.paste(im6,box)  #把图像im6粘贴到图像im上
    from PIL import ImageFilter,Image
    im=Image.open(r'./彩色.jpg')
    
    im5=im.filter(ImageFilter.DETAIL)  #图像增强
    im6=im.filter(ImageFilter.BLUR)  #图像模糊
    im7=im.filter(ImageFilter.FIND_EDGES)  #图像边缘提取
    im8=im.point(lambda i:i*1.3)  #修改亮度
    #使每个点的亮度增强1.3倍
    
    #图像增强方式二
    from PIL import ImageEnhance
    enh=ImageEnhance.Brightness(im)
    im9=enh.enhance(1.3)
    
    enh1=ImageEnhance.Contrast(im)
    #需要  from PIL import ImageEnhance
    im10=enh1.enhance(1.3) #对比度增强1.3倍
    
    #红绿蓝分别处理
    r,g,b=im.split()  #把图像分割成红绿蓝三个子图
    r=r.point(lambda i:i*1.3)
    g=g.point(lambda i:i*0.9)
    b=r.point(lambda i:0)
    im11=Image.merge(im.mode,(r,g,b))  #把三个子图合并成一个图像
    im11.show()
    from PIL import ImageFilter,Image
    im=Image.open(r'./彩色.jpg')
    
    im5=im.filter(ImageFilter.DETAIL)  #图像增强
    im6=im.filter(ImageFilter.BLUR)  #图像模糊
    im7=im.filter(ImageFilter.FIND_EDGES)  #图像边缘提取
    im8=im.point(lambda i:i*1.3)  #修改亮度
    #使每个点的亮度增强1.3倍
    
    #图像增强方式二
    from PIL import ImageEnhance
    enh=ImageEnhance.Brightness(im)
    im9=enh.enhance(1.3)
    
    enh1=ImageEnhance.Contrast(im)
    #需要  from PIL import ImageEnhance
    im10=enh1.enhance(1.3) #对比度增强1.3倍
    
    #红绿蓝分别处理
    r,g,b=im.split()  #把图像分割成红绿蓝三个子图
    r=r.point(lambda i:i*1.3)
    g=g.point(lambda i:i*0.9)
    b=r.point(lambda i:0)
    im11=Image.merge(im.mode,(r,g,b))  #把三个子图合并成一个图像
    im11.show()

    截屏

    from PIL import Image
    from PIL import ImageGrab
    
    size = (300, 300, 400, 400)
    img = ImageGrab.grab()  #截取全屏
    img = ImageGrab.grab(size)  #截取区域
    #size 前两个是左上角坐标,后两个是右下角坐标
    img.save("cut.jpg") img=ImageGrab.grabclipboard() #获取剪切板内的图片

    实例下载:https://pan.baidu.com/s/1cSFJEcLn9onnfacuWIhfQg   

     实例源码:

    from PIL import Image
    
    filename = r'aa.png'
    img = Image.open(filename)
    size = img.size
    print(size)
    # 准备将图片切割成8x12=96张小图片
    weight = int(size[0] // 12)  #每张图片的宽,横向分成12张图片
    height = int(size[1] // 8)  #每张图片的高,纵向分成8张图片
    print(weight, height)  # 切割后的小图的宽度和高度
    for j in range(8):  #纵向循环
        for i in range(12):  #横向循环
            box = (weight * i, height * j, weight * (i + 1), height * (j + 1))
            #参数1和参数2  图片的左上角坐标
            #参数3和参数4  图片的右上角坐标
            region = img.crop(box)  #截取图片,不改变原图
            region.save('{}-{}.png'.format(i, j))

    实例图片:

    import cv2
    from PIL import ImageGrab
    import numpy as np
    
    img_rgb = ImageGrab.grab()
    img_bgr=cv2.cvtColor(np.array(img_rgb), cv2.COLOR_RGB2BGR)   #转为opencv的BGR格式

  • 相关阅读:
    利用python数据分析与挖掘相关资料总结
    pandas库学习笔记(一)Series入门学习
    mysql error:You can't specify target table for update in FROM clause
    查询及删除重复记录的SQL语句
    PHP tripos()函数使用需要注意的问题
    如何用git上传代码到github详细步骤
    这是我的第一篇博客
    html link js
    BOM与DOM
    创建简单的表单
  • 原文地址:https://www.cnblogs.com/liming19680104/p/11333923.html
Copyright © 2011-2022 走看看