• python中PIL模块


    Image模块

    Image模块是在Python PIL图像处理中常见的模块,对图像进行基础操作的功能基本都包含于此模块内。如open、save、conver、show…等功能。

    open类

    Image.open(file) ⇒ image 
    Image.open(file, mode) ⇒ image
    

    要从文件加载图像,使用 open() 函数, 在 Image 模块:

    from PIL import Image             ##调用库
    im = Image.open("E:mywife.jpg")  ##文件存在的路径
    im.show()                         
    

    Save类

    im.save(outfile,options…) 
    im.save(outfile, format, options…)
    

    若要保存文件,则使用 Image 类的 save() 方法,此时保存文件的文件名就变得十分重要了,除非指定格式,否则这个库将会以文件名的扩展名作为格式保存。使用给定的文件名保存图像。如果变量format缺省,如果可能的话,则从文件名称的扩展名判断文件的格式。该方法返回为空。关键字options为文件编写器提供一些额外的指令。如果编写器不能识别某个选项,它将忽略它。用户可以使用文件对象代替文件名称。在这种情况下,用户必须指定文件格式。文件对象必须实现了seek()、tell()和write()方法,且其以二进制模式打开。如果方法save()因为某些原因失败,这个方法将产生一个异常(通常为IOError异常)。如果发生了异常,该方法也有可能已经创建了文件,并向文件写入了一些数据。如果需要的话,用户的应用程序可以删除这个不完整的文件。

    from PIL import Image
    
    im = Image.open("D:mywife.jpg")
    print(im)
    im.save("D:mywife.png")   # 将"E:mywife.jpg"保存为"D:mywife.png"
    im = Image.open("D:mywife.png")  ##打开新的png图片
    print(im.format, im.size, im.mode)
    

    format类

    这个属性标识了图像来源,如果图像不是从文件读取它的值就是None。

    from PIL import Image
    im = Image.open("E:mywife.jpg")
    print(im.format) ## 打印出格式信息
    im.show()
    

    Mode类

    图像的模式,常见的mode 有 “L” (luminance) 表示灰度图像,“RGB”表示真彩色图像,和 “CMYK” 表示出版图像,表明图像所使用像素格式。如下表为常见的nodes描述:

    modes 描述
    1 1位像素,黑和白,存成8位的像素
    L 8位像素,黑白
    P 8位像素,使用调色板映射到任何其他模式
    RGB 3× 8位像素,真彩
    RGBA 4×8位像素,真彩+透明通道
    CMYK 4×8位像素,颜色隔离
    YCbCr 3×8位像素,彩色视频格式
    I 32位整型像素
    F 32位浮点型像素

    from PIL import Image
    im = Image.open("E:mywife.jpg")
    print(im.mode)   ## 打印出模式信息
    im.show()
    

    convert类

    将当前图像转换为其他模式,并且返回新的图像。当从一个调色板图像转换时,这个方法通过这个调色板来转换像素。如果不对变量mode赋值,该方法将会选择一种模式,在没有调色板的情况下,使得图像和调色板中的所有信息都可以被表示出来。当从一个颜色图像转换为黑白图像时,PIL库使用ITU-R601-2 luma转换公式:

    L = R * 299/1000 + G * 587/1000 + B * 114/1000
    当转换为2位图像(模式“1”)时,源图像首先被转换为黑白图像。结果数据中大于127的值被设置为白色,其他的设置为黑色;这样图像会出现抖动。如果要使用其他阈值,更改阈值127,可以使用方法point()。为了去掉图像抖动现象,可以使用dither选项。

    from PIL import Image
    im = Image.open("E:mywife.jpg")
    new_im = im.convert('P')
    print(new_im.mode)
    new_im.show()
    

    im.convert(“P”,**options) ⇒ image
    这个与第一个方法定义一样,但是当“RGB”图像转换为8位调色板图像时能更好的处理。可供选择的选项为:

    Dither=. 控制颜色抖动。默认是FLOYDSTEINBERG,与邻近的像素一起承担错误。不使能该功能,则赋值为NONE。

    Palette=. 控制调色板的产生。默认是WEB,这是标准的216色的“web palette”。要使用优化的调色板,则赋值为ADAPTIVE。

    Colors=. 当选项palette为ADAPTIVE时,控制用于调色板的颜色数目。默认是最大值,即256种颜色
    im.convert(mode,matrix) ⇒ image
    使用转换矩阵将一个“RGB”图像转换为“L”或者“RGB”图像。变量matrix为4或者16元组。

    
    from PIL import Image
    im = Image.open("E:mywife.jpg")
    print(im.mode)
    rgb2xyz = (0.412453,0.357580, 0.180423, 0,
               0.212671,0.715160, 0.072169, 0,
               0.019334,0.119193, 0.950227, 0 )
    new_im = im.convert("L", rgb2xyz)
    print(new_im.mode)
    new_im.show()
    

    Size类

    im.size ⇒ (width, height)
    图像的尺寸,按照像素数计算,它的返回值为宽度和高度的二元组(width, height)。

    from PIL import Image
    im = Image.open("E:mywife.jpg")
    print(im.size) ## 打印出尺寸信息
    im.show()
    

    Palette类

    颜色调色板表格。如果图像的模式是“P”,则返回ImagePalette类的实例;否则,将为None。
    如下为对非“P”模式下的图像进行palette信息显示。

    from PIL import Image
    im = Image.open("E:mywife.jpg")
    print(im.palette)
    

    对图像进行convert操作,转换成“P”模式

    from PIL import Image
    im = Image.open("E:mywife.jpg")
    new_im = im.convert('P')
    print(new_im.mode)
    print(new_im.palette)
    

    Info类

    存储图像相关数据的字典。文件句柄使用该字典传递从文件中读取的各种非图像信息。大多数方法在返回新的图像时都会忽略这个字典;因为字典中的键并非标准化的,对于一个方法,它不能知道自己的操作如何影响这个字典。如果用户需要这些信息,需要在方法open()返回时保存这个字典。

    from PIL import Image
    im = Image.open("E:mywife.jpg")
    print(im.info)
    

    new类

    Image.new(mode,size) ⇒ image 
    Image.new(mode, size,color) ⇒ image
    

    使用给定的变量mode和size生成新的图像。Size是给定的宽/高二元组,这是按照像素数来计算的。对于单通道图像,变量color只给定一个值;对于多通道图像,变量color给定一个元组(每个通道对应一个值)。在版本1.1.4及其之后,用户也可以用颜色的名称,比如给变量color赋值为“red”。如果没有对变量color赋值,图像内容将会被全部赋值为0(为黑色)。如果变量color是空,图像将不会被初始化,即图像的内容全为0。这对向该图像复制或绘制某些内容是有用的。

    如下为将图像设置为128x128大小的红色图像。

    from PIL import Image
    im = Image.open("E:mywife.jpg")
    n_im= Image.new("RGB", (128, 128), "#FF0000")
    n_im.show()
    

    如下图像为128x128大小的黑色图像,因为变量color不赋值的话,图像内容被设置为0,即黑色。

    from PIL import Image
    im = Image.open("E:mywife.jpg")
    n_im= Image.new("RGB", (128, 128))
    n_im.show()
    

    Copy类

    拷贝这个图像。如果用户想粘贴一些数据到这张图,可以使用这个方法,但是原始图像不会受到影响。

    
    from PIL import Image
    im = Image.open("E:mywife.jpg")
    im_copy = im.copy()
    

    Crop类

    im.crop(box) ⇒ image
    从当前的图像中返回一个矩形区域的拷贝。变量box是一个四元组,定义了左、上、右和下的像素坐标。用来表示在原始图像中截取的位置坐标,如box(100,100,200,200)就表示在原始图像中以左上角为坐标原点,截取一个100*100(像素为单位)的图像,为方便理解,如下为示意图box(b1,a1,b2,a2)。作图软件为Visio2016。这是一个懒操作。对源图像的改变可能或者可能不体现在裁减下来的图像中。为了获取一个分离的拷贝,对裁剪的拷贝调用方法load()。

    @zhangziju
    from PIL import Image
    im = Image.open("E:mywife.jpg")
    box = (300, 100, 700, 700)              ##确定拷贝区域大小
    region = im.crop(box)                   ##将im表示的图片对象拷贝到region中,大小为box
    region.show()
    

    Paste类

    im.paste(image,box)
    将一张图粘贴到另一张图像上。变量box或者是一个给定左上角的2元组,或者是定义了左,上,右和下像素坐标的4元组,或者为空(与(0,0)一样)。如果给定4元组,被粘贴的图像的尺寸必须与区域尺寸一样。如果模式不匹配,被粘贴的图像将被转换为当前图像的模式。

    from PIL import Image
    im = Image.open("E:mywife.jpg")
    box=[0,0,100,100]
    im_crop = im.crop(box)
    print(im_crop.size,im_crop.mode)
    im.paste(im_crop, (100,100))             ##(100,100,0,0)
    im.paste(im_crop, (400,400,500,500))
    im.show()
    

    Filter类

    im.filter(filter) ⇒ image

    返回一个使用给定滤波器处理过的图像的拷贝。具体参考图像滤波在ImageFilter 模块的应用,在该模块中,预先定义了很多增强滤波器,可以通过filter( )函数使用,预定义滤波器包括:BLUR、CONTOUR、DETAIL、EDGE_ENHANCE、EDGE_ENHANCE_MORE、EMBOSS、FIND_EDGES、SMOOTH、SMOOTH_MORE、SHARPEN。其中BLUR就是均值滤波,CONTOUR找轮廓,FIND_EDGES边缘检测,使用该模块时,需先导入。

    from PIL import Image
    from PIL import ImageFilter                         ## 调取ImageFilter
    imgF = Image.open("E:mywife.jpg")
    bluF = imgF.filter(ImageFilter.BLUR)                ##均值滤波
    conF = imgF.filter(ImageFilter.CONTOUR)             ##找轮廓
    edgeF = imgF.filter(ImageFilter.FIND_EDGES)         ##边缘检测
    imgF.show()
    bluF.show()
    conF.show()
    edgeF.show()
    

    point类

    定义1:
    im.point(table)⇒ image
    im.point(function) ⇒ image
    含义1:
    返回给定查找表对应的图像像素值的拷贝。变量table为图像的每个通道设置256个值。如果使用变量function,其对应函数应该有一个参数。这个函数将对每个像素值使用一次,结果表格将应用于图像的所有通道。

    如果图像的模式为“I(整数)”或者“F(浮点)”,用户必须使用function方式,function必须按照下面的格式:
    argument * scale+ offset
    例如:
    out = im.point(lambda i: i * 1.2 + 10)
    用户可以省略变量scale和offset。

    例子1:

    from PIL import Image
    im = Image.open("jing.png")
    im_point = im.point(lambda x:x*1.3+5)
    im_point.save("he.png")
    

    注:图像im_point_fun比原图im01亮度增加了很多;因为lambda表达式中对原图的每个像素点的值都做了增加操作。

    定义2:
    im.point(table,mode) ⇒ image
    im.point(function, mode) ⇒ image
    含义2:与定义1一样,但是它会为输出图像指定一个新的模式。这个方法可以一步将模式为“L”和“P”的图像转换为模式为“1”的图像。

    例子2:

    from PIL import Image
    im = Image.open("jing.png")
    r,g,b = im.split()
    im_point1 = r.point(lambda x:x*1.3+5,"1")
    print(im_point1.getpixel((0,0)))
    im_point1.save("he1.png")
    im_point2 = r.point(lambda  x:0,"1")
    im_point2.save("he2.png")
    print(im_point2.getpixel((10,10)))
    

    输出为:
    0
    图像im_point1为全白图
    图像im_point2为全黑图

    split类

    定义:im.split() ⇒ sequence
    含义:返回当前图像各个通道组成的一个元组。例如,分离一个“RGB”图像将产生三个新的图像,分别对应原始图像的每个通道(红,绿,蓝)。

    例子:

    from PIL import Image
    im = Image.open("jing.png")
    r,g,b = im.split()
    b.save("he.png")
    print(b.getpixel((1,3)))
    

    参考链接
    参考

  • 相关阅读:
    Python遇上嵌入式:几款主流的Python开发板一览!
    shell入门(二):()、(())、[]、[[]]、{}
    Shell入门(一)
    Android Studio打开项目,停在gradle的解决方案
    安装vim中文帮助vimcdoc
    多选框(全选反选)-html
    select框右移-html
    记时器带暂停-html
    浮窗广告html
    js中的dom
  • 原文地址:https://www.cnblogs.com/tomyyyyy/p/11122814.html
Copyright © 2020-2023  润新知