zoukankan      html  css  js  c++  java
  • PIL库自我学习总结及应用(美白,磨皮,搞笑图片处理)

    Hello!今天我们来学习一下这个神奇的图片处理的第三方函数库——PIL库

    (本blog部分图片及代码来自网络)

    这是一个支持图像存储、显示和处理的函数库,它能够处理几乎所有图像格式,可以完成对图像的缩放、裁剪、叠加以及图像添加条纹,文字等信息等的操作。

    首先是利用pip下载一个:

    它有许多子库,例如:Image、ImageChops、ImageDraw等等,他们各有神通,发挥着自己的作用,

    首先我们当然学习的是经典的Image子库;

    方法 描述
    Image.open(filename) 根据参数加载图像文件
    Image.new(mode,size,color) 根据给定参数创建一个新的图像
    Image.open(StringIO.StringIO(buffer)) 从字符串中获取图像
    Image.frombytes(mode,size,data) 根据像素点data创建图像
    Image.verify() 对图像文件完整性进行检查,返回异常

    参考:http://pillow-cn.readthedocs.io/zh_CN/latest/reference/index.html 

     首先对于使用的工具:基于WIN10,Python3.7.2,Pillow5.4.1

    对于Image模块

    首先我认识到一个简单的例子:读取下载好的图片并将它可视化(代码如下):

    from PIL import Image
    im = Image.open('test1.jpg') # 读取图片
    im.show() # 可视化
    

     这里的“test.jpg”是我刚刚下载好的来自网络的图片放置在桌面上;

    然后运行!

    通过使用相关的图片查看器,我们就可以打开自己桌面上图片进行可视化了,我们甚至还可以用其他代码对图片进行调整:

    from PIL import Image
    im = Image.open('test1.jpg') # 读取图片
    im.rotate(45).show() # 将图片旋转,并用系统自带的图片工具显示图片
    

    诺!对比上图,我们的图片被旋转了45度,这些只是比较基本的操作,我们依然可以对图片进行更加多的改变!

    图像灰度化处理

    这是一张彩色的建筑图,我觉得太鲜艳了,又比较喜欢一种黑白色调显得低调深沉就像我一样,那么我可以使用下面的代码:

    from PIL import Image
    img = Image.open("test3.jpg")
    # 灰度化:将RGB/RGBA -> L
    img = img.convert("L")
    img.show()
    

    效果如下:

    不得不说,很耐斯!

    还有很多效果滴:

    在Image.filter(filter)中:

    # BLUR - 模糊处理
    # CONTOUR - 轮廓处理
    # DETAIL - 增强
    # EDGE_ENHANCE - 将图像的边缘描绘得更清楚
    # EDGE_ENHANCE_NORE - 程度比EDGE_ENHANCE更强
    # EMBOSS - 产生浮雕效果
    # SMOOTH - 效果与EDGE_ENHANCE相反,将轮廓柔和
    # SMOOTH_MORE - 更柔和
    # SHARPEN - 效果有点像DETAIL
    再对“test3.jpg”进行处理:

    from PIL import Image
    from PIL import ImageFilter
    testimg = Image.open("test3.jpg")
    testimg.show()
    filterimg = testimg.filter(ImageFilter.EMBOSS)
    filterimg.show()
    

    (浮雕效果)

     

    (轮廓效果)

     …………还有很多…………

    and各种处理方案:

    Image.getbands()

    Image.geebbox()

    Image.getcolors(maxcolor=256)

    Image.getdata(band=None)(一般和list()结合使用)

    Image.getextrema()

    Image.getpixel((x,y))

    Image.histogram(mask=None,extrema=None)
    接下来是缩略图的学习,我们有时候为了节约储存空间,会将原来的图片进行压缩,通过等比例压缩之后会变成缩略图,那么如何用Image库来实现呢??

    话不多说,先上代码!

    from PIL import Image
    im = Image.open('test3.jpg')
    size = im.size
    if size[0] > size[1]:
        rate = float(200) / float(size[0])
    else:
        rate = float(128) / float(size[1])
    new_size = (int(size[0] * rate), int(size[1] * rate))
    new = im.resize(new_size, Image.BILINEAR)
    new.save('n.jpg')
    im.show('n.jpg')
    

    想知道这是什么神仙代码吗?

    看得出我还是使用了“test3.jpg”这张图,我想要将它压缩并另存为一个压缩后的图片存到桌面上,然后打开看看效果如何;

    很明显桌面上多了一个新图片,这就是另存的压缩图了;

     查看效果如上,这个图片显然比原图小了很多,拉近了看还是十分模糊的呢,这就是等比例缩小后的缩略图“n.jpg”啦~ 

     接下来就是自制“美颜相机”啦~

    我们的生活现在离不开手机,手机又刚好有自拍功能,这满足了我们没事“卡擦卡擦”拍照看看自己的盛世美颜的需求,但是也不是每一次拍照都能很好地满足我们的虚荣心和好胜的心理,毕竟……我们对自己可是很严格的!!!特别是颜值!!!

    所以才会催生出各种P图软件,那么我们自己可不可以做呢??

    当然~

    代码呢?来人!上代码!!

    from PIL import Image
    from PIL import ImageEnhance
    import cv2
    import numpy as np
    
    
    # image = Image.open('test4.jpg')
    #image.show()
    def BrightnessEnhancement(brightness):
        image = Image.open('test4.jpg')
        enh_bri = ImageEnhance.Brightness(image)
    #    brightness =1.5
        image_brightened = enh_bri.enhance(brightness)
        image_brightened.show()
    
    def ContrastEnhancement(contrast):
        image = Image.open('test4.jpg')
        enh_con = ImageEnhance.Contrast(image)
    #    contrast =1.5
        image_contrasted = enh_con.enhance(contrast)
        image_contrasted.show()
    
    def ColorEnhancement(color): 
        image = Image.open('test4.jpg')
        enh_col = ImageEnhance.Color(image)
    #    color =0.8
        image_colored = enh_col.enhance(color)
        image_colored.show()
    
    def SharpnessEnhancement(sharpness):
        image = Image.open('test4.jpg')
        enh_sha = ImageEnhance.Sharpness(image)
    #    sharpness = 2
        image_sharped = enh_sha.enhance(sharpness)
        image_sharped.show()
    
    def Filter(image):
        image =cv2.imread('test4.jpg')
        Remove=cv2.bilateralFilter(image,0,0,10)
        cv2.imshow('filter',Remove)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    #    res = np.uint8(np.clip((1.2 * image + 10), 0, 255))
    #    tmp = np.hstack((dst, res)) 
    #    cv2.imshow('bai',res)
    
    
    def WhiteBeauty(image,whi):
        image =cv2.imread('test4.jpg')
        white = np.uint8(np.clip((whi * image + 50), 0, 255))
        cv2.imshow('bai',white)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
    
    if __name__ =="__main__":
        filepath = 'test4.jpg'
        #原始图像
        brightness = 1.5
        contrast = 0.2
        color=1.9
        sharpness=0.1
        BrightnessEnhancement(brightness)
        ContrastEnhancement(contrast)
        ColorEnhancement(color)
        SharpnessEnhancement(sharpness)
        whi = 1.2
        image =cv2.imread('test4.jpg')
        Filter(image)
        WhiteBeauty(image,whi)
    

    这是原图:

     

    这是美白后的:

     

     灰度处理:

    以及等等……(受限于篇幅不一一列举)

     对一个GIF每一帧进行提取:

    from PIL import Image
    im = Image.open('gif2.gif')      # 读入一个GIF文件
    try:
        im.save('aa{:02d}.png'.format(im.tell()))
        while True:
            im.seek(im.tell()+1)
            im.save('new{:02d}.png'.format(im.tell()))
    except:
        print("处理结束")
    

     结果:

     接下来就是激动人心的时刻了!我们要做动图!!

    首先要下载一个第三方库——imageio

    然后就可以上代码了:

    import imageio
     
    def create_gif(image_list, gif_name):
     
        frames = []
        for image_name in image_list:
            frames.append(imageio.imread(image_name))
        # Save them as frames into a gif 
        imageio.mimsave(gif_name, frames, 'GIF', duration = 1)
     
        return
     
    def main():
        image_list = ['t1.png','t2.png','t3.png','t4.png']
        gif_name = 'finallgif.gif'
        create_gif(image_list, gif_name)
     
    if __name__ == "__main__":
        main()
    

    效果:

    由于有些分辨率的不统一所以会有黄边,不要在意呀~

  • 相关阅读:
    我们工作为了什么
    为什么去国企(HP中华区总裁孙振耀退休感言)
    android中的所有activity间动画跳转
    [转]Eclipse进行可视化的GUI开发3大GUI插件
    用Monkey测试android程序
    大学之后拉开差距的原因
    dataset 和 datareader 区别
    曾经运行该线程的应用程序域已卸载。
    guid.tostring() 格式化指南
    vs 使用技巧
  • 原文地址:https://www.cnblogs.com/iconangle/p/10683223.html
Copyright © 2011-2022 走看看