一.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:\Users\moyulin\Desktop\memeda.gif')

#   初始化列表

sequence = []

for f in ImageSequence.Iterator(im):

    #   获取图像序列病存储

    sequence.append(f.copy())

#   将图像序列逆转

sequence.reverse()

sequence[0].save(r'C:\Users\moyulin\Desktop\out.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:\Users\moyulin\Desktop\memeda.gif') # 初始化列表 sequence = [] for f in ImageSequence.Iterator(im): # 获取图像序列病存储 sequence.append(f.copy())
#随机打乱图像序列
random.shuffle(sequence) # 将图像序列逆转 #sequence.reverse() sequence[0].save(r'C:\Users\moyulin\Desktop\out2.gif', save_all=True, append_images=sequence[1:])

效果如下

是不是觉得也很可爱呢,嘻嘻,快来尝试玩PIllow库把,很有趣的emmmm

python中用Pillow库进行图片处理的更多相关文章

  1. python使用zlib库压缩图片,使用ffmpeg压缩视频

    python压缩图片.视频 图片压缩使用zlib库 视频压缩使用工具ffmpeg # ffmpeg -i 1.mp4 -r 10 -pix_fmt yuv420p -vcodec libx264 -p ...

  2. python利用PIL库使图片高斯模糊

    一.安装PIL PIL是Python Imaging Library简称,用于处理图片.PIL中已经有图片高斯模糊处理类,但有个bug(目前最新的1.1.7bug还存在),就是模糊半径写死的是2,不能 ...

  3. Python 处理图片 -- pillow库

    pip install pillow 基本使用 from PIL import Image # new 创建一张图片 im1 = Image.new('RGB', (500, 300), (50, 1 ...

  4. 在Python中用Request库模拟登录(三):Discuz论坛(未加密,有验证码,有隐藏验证)

    以Discuz的官方站为例.直接点击网页右上角的登录按钮,会弹出一个带验证码的登录窗口.输入验证码之后,会检查验证码是否正确.然后登录.首先,通过抓包分析,这些过程浏览器和服务器交换了哪些数据. 抓包 ...

  5. 在Python中用Request库模拟登录(一):字幕库(无加密,无验证码)

    字幕库的登录表单如下所示,其中省去了无关紧要的内容: <form class="login-form" action="/User/login.html" ...

  6. python基于pillow库的简单图像处理

    from PIL import Image from PIL import ImageFilter from PIL import ImageEnhance import matplotlib.pyp ...

  7. 在Python中用Request库模拟登录(四):哔哩哔哩(有加密,有验证码)

    !已失效! 抓包分析 获取验证码 获取加密公钥 其中hash是变化的,公钥key不变 登录 其中用户名没有被加密,密码被加密. 因为在获取公钥的时候同时返回了一个hash值,推测此hash值与密码加密 ...

  8. 尝试用python开发一款图片压缩工具1:尝试 pillow库

    开发目的 我经常使用图片.公众号文章发文也好,还是生活中要使用素材.图片是一种比文字更加直观的载体.但是图片更加占用带宽,很多软件都对图片有大小限制.图片太大也会影响加载速度.我试过几款图片压缩工具, ...

  9. 安装python的第三方Pillow库

    方法/步骤 找到easy_install.exe工具.在windows下安装Python后,在其安装路径下的scripts文件中默认安装好了easy_install工具.完整路径如下例:D:\Pyth ...

随机推荐

  1. leetcode summary-section II

    151 Reverse Words in a String class Solution { public: void reverseWords(string &s) { string res ...

  2. linux 下crontab相关定时触发的配置规则

    linux 下crontab相关定时触发的配置规则: 1.基本格式 :* * * * * command(分 时 日 月 周 命令)2.取值范围:分钟1-59 每分钟用*或者 */1表示小时1-23( ...

  3. codeforces 963A Alternating Sum

    codeforces 963A Alternating Sum 题解 计算前 \(k\) 项的和,每 \(k\) 项的和是一个长度为 \((n+1)/k\) ,公比为 \((a^{-1}b)^k\) ...

  4. Java.lang 包 (包装类、String类、Math类、Class类、Object类)

    Java 的核心 API(Application Programming Interface)是非常庞大的,这给开发者带来了很大的方便. java.lang 包是 Java 的核心类库,它包含了运行 ...

  5. Mininet自定义网络拓扑

    在Mininet上的网络拓扑有两种方式 第一种 用mininet自带的miniedit可视化工具,在mininet/mininet/examples/的目录下的一个miniedit.py,运行这个文件 ...

  6. angularJs的指令系统和双向数据绑定

    一.langularJs的指令系统 <!DOCTYPE HTML> <html ng-app><!--这种以ng开头的就是指令系统,初始化的一个指令,不仅可以加在html ...

  7. Input and Output-The input is all the sources of action for your app

    Programs take input and produce output. The output is the result of doing something with the input. ...

  8. 2018-2019-2 网络对抗技术 20165322 Exp5 MSF基础应用

    2018-2019-2 网络对抗技术 20165322 Exp5 MSF基础应用 目录 实验内容与步骤 一个主动攻击实践 MS08-067(失败) ms17_010_psexec(成功且唯一) 一个针 ...

  9. P3177 [HAOI2015]树上染色

    题目描述 有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所有点染色后,你会获得黑点两两之 ...

  10. ethereumjs/browser-builds

    https://github.com/ethereumjs/browser-builds ethereumjs - Browser Builds This repository contains br ...