zoukankan      html  css  js  c++  java
  • python中用Pillow库进行图片处理

     一.Python中 PIL 图像处理库简介

          PIL可以做很多和图像处理相关的事情:

    • 图像归档(Image Archives)。PIL非常适合于图像归档以及图像的批处理任务。你可以使用PIL创建缩略图,转换图像格式,打印图像等等。
    • 图像展示(Image Display)。PIL较新的版本支持包括Tk PhotoImage,BitmapImage还有Windows DIB等接口。PIL支持众多的GUI框架接口,可以用于图像展示。
    • 图像处理(Image Processing)。PIL包括了基础的图像处理函数,包括对点的处理,使用众多的卷积核(convolution kernels)做过滤(filter),还有颜色空间的转换。PIL库同样支持图像的大小转换,图像旋转,以及任意的仿射变换。PIL还有一些直方图的方法,允许你展示图像的一些统计特性。这个可以用来实现图像的自动对比度增强,还有全局的统计分析等。
    • How to use PIL?

          Image类是PIL中的核心类,你有很多种方式来对它进行初始化,比如从文件中加载一张图像,处理其他形式的图像,或者是从头创造一张图像等。下面是PIL Image类中常用的方法:

    • open(filename,mode)(打开一张图像)。下面的代码演示了如何从文件打开一张图像:
    • 复制代码
      >>> from PIL import Image
      >>> Image.open("dog.jpg","r")
      <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=296x299 at 0x7F62BDB5B0F0
      >
      >>> im = Image.open("dog.jpg","r")
      >>> print(im.size,im.format,im.mode)
      (296, 299) JPEG RGB
      复制代码

      Image.open返回一个Image对象,该对象有size,format,mode等属性,其中size表示图像的宽度和高度(像素表示);format表示图像的格式,常见的包括JPEG,PNG等格式;mode表示图像的模式,定义了像素类型还有图像深度等,常见的有RGB,HSV等。一般来说'L'(luminance)表示灰度图像,'RGB'表示真彩图像,'CMYK'表示预先压缩的图像。一旦你得到了打开的Image对象之后,就可以使用其众多的方法对图像进行处理了,比如使用im.show()可以展示上面得到的图像。

    • save(filename,format)(保存指定格式的图像)

      >>> im.save("dog.png",'png')

      上面的代码将图像重新保存成png格式。

    • thumbnail(size,resample)(创建缩略图)

      >>> im.thumbnail((50,50),resample=Image.BICUBIC)
      >>> im.show()

      上面的代码可以创建一个指定大小(size)的缩略图,需要注意的是,thumbnail方法是原地操作,返回值是None。第一个参数是指定的缩略图的大小,第二个是采样的,有Image.BICUBICPIL.Image.LANCZOSPIL.Image.BILINEARPIL.Image.NEAREST这四种采样方法。默认是Image.BICUBIC

    • crop(box)(裁剪矩形区域)

      >>> im = Image.open("dog.jpg","r")
      >>> box = (100,100,200,200)
      >>> region = im.crop(box)
      >>> region.show()
      im.crop()

      上面的代码在im图像上裁剪了一个box矩形区域,然后显示出来。box是一个有四个数字的元组(upper_left_x,upper_left_y,lower_right_x,lower_right_y),分别表示裁剪矩形区域的左上角x,y坐标,右下角的x,y坐标,规定图像的最左上角的坐标为原点(0,0),宽度的方向为x轴,高度的方向为y轴,每一个像素代表一个坐标单位。crop()返回的仍然是一个Image对象。

    • transpose(method)(图像翻转或者旋转)

      >>> im_rotate_180 = im.transpose(Image.ROTATE_180)
      >>> im_rotate_180.show()

      上面的代码将im逆时针旋转180°,然后显示出来,method是transpose的参数,表示选择什么样的翻转或者旋转方式,可以选择的值有:
          - Image.FLIP_LEFT_RIGHT,表示将图像左右翻转
          - Image.FLIP_TOP_BOTTOM,表示将图像上下翻转
          - Image.ROTATE_90,表示将图像逆时针旋转90°
          - Image.ROTATE_180,表示将图像逆时针旋转180°
          - Image.ROTATE_270,表示将图像逆时针旋转270°
          - Image.TRANSPOSE,表示将图像进行转置(相当于顺时针旋转90°)
          - Image.TRANSVERSE,表示将图像进行转置,再水平翻转

    • paste(region,box,mask)(将一个图像粘贴到另一个图像)

      >>> im.paste(region,(100,100),None)
      >>> im.show()

      上面的代码将region图像粘贴到左上角为(100,100)的位置。region是要粘贴的Image对象,box是要粘贴的位置,可以是一个两个元素的元组,表示粘贴区域的左上角坐标,也可以是一个四个元素的元组,表示左上角和右下角的坐标。如果是四个元素元组的话,box的size必须要和region的size保持一致,否则将会被convert成和region一样的size。

    • split()(颜色通道分离)

      >>> r,g,b = im.split()
      >>> r.show()
      >>> g.show()
      >>> b.show()

      split()方法可以原来图像的各个通道分离,比如对于RGB图像,可以将其R,G,B三个颜色通道分离。

    • merge(mode,channels)(颜色通道合并)

      >>> im_merge = Image.merge("RGB",[b,r,g])
      >>> im_merge.show()

      merge方法和split方法是相对的,其将多个单一通道的序列合并起来,组成一个多通道的图像,mode是合并之后图像的模式,比如"RGB",channels是多个单一通道组成的序列。

    • resize(size,resample,box)

      >>> im_resize = im.resize((200,200))
      >>> im_resize
      <PIL.Image.Image image mode=RGB size=200x200 at 0x7F62B9E23470>
      >>> im_resize.show()
      >>> im_resize_box = im.resize((100,100),box = (0,0,50,50))
      >>> im_resize_box.show()

      resize方法可以将原始的图像转换大小,size是转换之后的大小,resample是重新采样使用的方法,仍然有Image.BICUBICPIL.Image.LANCZOSPIL.Image.BILINEARPIL.Image.NEAREST这四种采样方法,默认是PIL.Image.NEAREST,box是指定的要resize的图像区域,是一个用四个元组指定的区域(含义和上面所述box一致)。

    • convert(mode,matrix,dither,palette,colors)(mode转换)

      >>> im_L = im.convert("L")
      >>> im_L.show()
      >>> im_rgb = im_L.convert("RGB")
      >>> im_rgb.show()
      >>> im_L.mode
      'L'
      >>> im_rgb.mode
      'RGB'

      convert方法可以改变图像的mode,一般是在'RGB'(真彩图)、'L'(灰度图)、'CMYK'(压缩图)之间转换。上面的代码就是首先将图像转化为灰度图,再从灰度图转化为真彩图。值得注意的是,从灰度图转换为真彩图,虽然理论上确实转换成功了,但是实际上是很难恢复成原来的真彩模式的(不唯一)。

    二.用pillow库对图片生成缩略图

    1.代码如下

    复制代码
    import os
    import glob
    from PIL import Image
    
    def thumbnail_pic(path):
        a=glob.glob(r'./*.jpg')#此处输入图片地址
        for x in a:
                name=os.path.join(path,x)
            im=Image.open(name)
            im.thumbnail((80,80))
            print(im.format,im.size,im.mode)
            im.save(name,'JPEG')
        print('Done!')
    
    if __name__=='__main__':
        path='.'
        thumbnail_pic(path)
    复制代码

    原图1

    缩略图1

    原图2

    缩略图2

    由此可以看出Pillow库的强大以及实用性

    三.图像灰度处理对比(颜色)

    1.首先安装python中的OpenCV库

    pip install opencv-python

    2.处理代码如下

    复制代码
    import cv2
    #读取彩色原图
    img0=cv2.imread('E:/python_cv/01.jpg',1)
    #读取灰度图
    img1=cv2.imread('E:/python_cv/01.jpg',0)
    print(img0.shape)
    print(img1.shape)
    cv2.imshow('gary',img1)
    cv2.waitKey(0)
    复制代码

    3.效果如下

     

    四.图像浮雕处理对比

    1.处理代码如下

    复制代码
    import cv2
    import numpy as np
    gray=cv2.imread('C:/Users/moyulin/Desktop/test2.jpg',0)
    imgInfo=gray.shape
    height=imgInfo[0]
    weight=imgInfo[1]
    #浮雕效果
    dst=np.zeros((height,weight,1),np.uint8)
    for i in range(0,height):
        for j in range(0,weight-1):
            gray0=gray[i,j]
            gray1=gray[i,j+1]
            newp=gray0-gray1+150
            if newp>255:
                newp=255
            else:
                newp=0
            dst[i,j]=newp
    cv2.imshow('dst',dst)
    cv2.waitKey(0)
    复制代码

    2.效果对比如下

     

    五.图像轮廓处理对比

    1.Sobel 算法处理图像

          obel算子是像素图像边缘检测中最重要的算子之一,在机器学习、数字媒体、计算机视觉等信息科技领域起着举足轻重的作用。在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子,将会产生该点对应的梯度矢量或是其法矢量。

    代码如下

    复制代码
    import cv2.cv as cv
     
    im=cv.LoadImage('img/building.png', cv.CV_LOAD_IMAGE_GRAYSCALE)
     
    sobx = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_16S, 1)
    cv.Sobel(im, sobx, 1, 0, 3) #Sobel with x-order=1
     
    soby = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_16S, 1)
    cv.Sobel(im, soby, 0, 1, 3) #Sobel withy-oder=1
     
    cv.Abs(sobx, sobx)
    cv.Abs(soby, soby)
     
    result = cv.CloneImage(im)
    cv.Add(sobx, soby, result) #Add the two results together.
     
    cv.Threshold(result, result, 100, 255, cv.CV_THRESH_BINARY_INV)
     
    cv.ShowImage('Image', im)
    cv.ShowImage('Result', result)
     
    cv.WaitKey(0)
    复制代码

    2.效果如下

     

    六.图像的增强(对比度)

    1.本步采用pillow中的imageEnhance处理,代码如下

    复制代码
    from PIL import Image,ImageEnhance
    
    # 打开图片
    
    im = Image.open('C:/Users/moyulin/Desktop/捕获.PNG','r')
    
    # 对比度增强
    
    enh_con = ImageEnhance.Contrast(im)
    
    contrast = 10
    
    image_contrasted = enh_con.enhance(contrast)
    
    image_contrasted.show()
    复制代码

    2.对比效果如下

    七.好玩的gif图片

    1.动态gif逆序播放

    原图如下

    代码如下

    复制代码
    #   _*_ coding:utf-8 _*_
    
     
    
    from PIL import Image, ImageSequence
    
     
    
    __author__ = 'moyulin'
    
     
    
    im = Image.open(r'C:UsersmoyulinDesktopmemeda.gif')
    
    #   初始化列表
    
    sequence = []
    
    for f in ImageSequence.Iterator(im):
    
        #   获取图像序列病存储
    
        sequence.append(f.copy())
    
    #   将图像序列逆转
    
    sequence.reverse()
    
    sequence[0].save(r'C:UsersmoyulinDesktopout.gif', save_all=True, append_images=sequence[1:])
    复制代码

    效果如下

     若是此时我们打乱图像序列,这时候会发生什么呢?

    代码如下

    复制代码
    #   _*_ coding:utf-8 _*_
    
     
    import random
    from PIL import Image, ImageSequence
    
     
    
    __author__ = 'moyulin'
    
     
    
    im = Image.open(r'C:UsersmoyulinDesktopmemeda.gif')
    
    #   初始化列表
    
    sequence = []
    
    for f in ImageSequence.Iterator(im):
    
        #   获取图像序列病存储
    
        sequence.append(f.copy())
    #随机打乱图像序列
    random.shuffle(sequence)
    
    #   将图像序列逆转
    
    #sequence.reverse()
    
    sequence[0].save(r'C:UsersmoyulinDesktopout2.gif', save_all=True, append_images=sequence[1:])
    复制代码

    效果如下

     

  • 相关阅读:
    集合
    3/11
    字典
    3/10
    字符串之不常用方法
    字符串的索引和切片
    数据类型的转化
    Markdown在线编辑器
    3/9
    Django:RestFramework之-------渲染器
  • 原文地址:https://www.cnblogs.com/0609hlz/p/10687062.html
Copyright © 2011-2022 走看看