安装 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-pillow图像处理的更多相关文章

  1. python PIL 图像处理库简介(一)

    1. Introduction     PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处 ...

  2. python PIL 图像处理

    python PIL 图像处理 This blog is from: https://www.jianshu.com/p/e8d058767dfa Image读出来的是PIL的类型,而skimage. ...

  3. python skimage图像处理(一)

    python skimage图像处理(一) This blog is from: https://www.jianshu.com/p/f2e88197e81d 基于python脚本语言开发的数字图片处 ...

  4. python PIL图像处理库

    1. Introduction PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了. ...

  5. python数字图像处理(17):边缘与轮廓

    在前面的python数字图像处理(10):图像简单滤波 中,我们已经讲解了很多算子用来检测边缘,其中用得最多的canny算子边缘检测. 本篇我们讲解一些其它方法来检测轮廓. 1.查找轮廓(find_c ...

  6. Python+OpenCV图像处理(一)

    Python+OpenCV图像处理(一): 读取,写入和展示图片 调用摄像头拍照 调用摄像头录制视频 1. 读取.写入和展示图片 图像读入:cv2.imread() 使用函数cv2.imread() ...

  7. python PIL 图像处理操作

    python PIL 图像处理 # 导入Image库 import Image # 读取图片 im = Image.open("1234.jpg") # 显示图片 im.show( ...

  8. Python+OpenCV图像处理(一)——读取显示一张图片

    先在此处先声明,后面学习python+opencv图像处理时均参考这位博主的博文https://blog.csdn.net/u011321546/article/category/7495016/2? ...

  9. 「转」python数字图像处理(18):高级形态学处理

    python数字图像处理(18):高级形态学处理   形态学处理,除了最基本的膨胀.腐蚀.开/闭运算.黑/白帽处理外,还有一些更高级的运用,如凸包,连通区域标记,删除小块区域等. 1.凸包 凸包是指一 ...

  10. 用Python做图像处理

    转自:http://blog.csdn.net/gzlaiyonghao/article/details/1852726  最近在做一件比较 evil 的事情——验证码识别,以此来学习一些新的技能.因 ...

随机推荐

  1. python基础--面向对象初始

    # 类与对象,类是类别.种类,是面向对象设计中最重要的概念, # 对象是特征与技能的结合体, # 类是一系列对象相似特征与技能的结合体 # 例如:人是一个类,而我本人是一个对象,手,脚,是我的特征, ...

  2. ocelot集成consul服务发现

    首先下载consul 点击这里下载 转到解压文件夹目录输入cmd命令  consul agent -dev (有时候会卡住按一下方向键上) 在浏览器中输入http://localhost:8500/u ...

  3. 关于Tomcat配置问题

    一,部署并启动Tomcat服务器 Tomcat: 开源的 Servlet 容器. 解压 apache-tomcat-6.0.16.zip 到一个非中文目录下 配置一个环境变量. java_home(指 ...

  4. 如何实现Java线程的 阻塞/唤醒(和暂停/继续 类似)

    以下为线程 阻塞/唤醒  主要代码 public class MyThread extends Thread { //无意义 private final Object lock = new Objec ...

  5. Radio Button误区

    在同一个父容器下,Radio Button控件默认只能选择一个,所以无需多余代码管控 如果将Radio Button的多个子对象存入NSArray列表,发现长度为0(巨坑),因此通过列表对其初始化不可 ...

  6. Kali安装在U盘+使用aircrack-ng套件

    因为: Kali Linux 自带aircrack-ng 虚拟机VMware不能用笔记本内置网卡,需要另外买一个无线网卡,然而并不想买 不想给笔记本重装Kali Linux系统 有闲置的32GU盘 所 ...

  7. chrome://inspect 白屏BUG解决方案

    chrome://inspect 是前端常用的调试工具但是有时候会碰到PC端dev-tools白屏的问题 1.首先我们要处于[科][学]的网络环境 2.在 chrome 中输入chrome://app ...

  8. The Preliminary Contest for ICPC Asia Shanghai 2019 A. Lightning Routing I

    传送门 因为某些原因,所以我就去学了 $LCT$ 维护直径, $LCT$ 维护直径我上一个博客讲得很详细了:传送门 这里维护虚儿子用的是 $multiset$ ,没写可删堆 #include<i ...

  9. RabbitMQ入门教程(九):首部交换机Headers

    原文:RabbitMQ入门教程(九):首部交换机Headers 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog ...

  10. python 3 :list

    2 List List中支持混合类型 number_list=[1,2,3,4,5] str_list = ["a","b","c",&qu ...