文章一览
- 前言
- 一、PIL图像处理库简介
- 二、基本概念
- 2.1颜色模型
- 2.1.1 RGB 颜色模型
- 2.1.2 CMY色彩空间
- 2.2 通道
- 2.3 图像数据
- 2.4 模式
- 三、用PIL做图像处理
- 3.1 图像缩放、翻转等处理
- 3.1.1 图像缩放处理
- 3.1.2 图像旋转处理
- (1)PIL 提供的函数:
- (2)利用numpy数组处理
- 3.2 调整亮度
- 3.3 图像高度裁剪
- 3.4 图像过滤
- 3.5图像增强
前言
在这个视觉至上的时代,图像已成为我们日常生活中不可或缺的一部分。无论是社交媒体上的分享,还是专业领域的图像分析,图像处理技术都扮演着至关重要的角色。但你是否曾想过,如何将这些静态的图像转化为动态的故事,或者从海量的图像数据中提取出有价值的信息?这正是Python图像处理库——PIL(Python Imaging Library)的神奇之处。
欢迎进入PIL的世界,这里是创意与技术的交汇点。
PIL库不仅仅是一个工具集,它是一个强大的盟友,帮助你解锁图像处理的无限可能。从基本的图像编辑到复杂的图像分析,PIL库以其简洁的API和强大的功能,让图像处理变得轻松而高效。无论是调整图片大小、应用滤镜效果,还是进行图像识别和机器学习,PIL库都能助你一臂之力。
随着我们深入探索PIL库的奥秘,你将发现,它不仅能够增强你的图像处理能力,还能够激发你的创造力,让你在图像的世界里自由翱翔。让我们一起揭开PIL库的神秘面纱,开启一段图像处理的奇妙旅程吧!
一、PIL图像处理库简介
Python 中有关图像处理的库有很多,常见的有 PIL、cv2 等。在进行深度学习图像任务的时候,常常会使用 PIL 这个库来读取和处理图片
PIL(Python Imaging Library)库是一个具有强大图像处理能力的第三方库,包含了丰富的像素、色彩等操作功能。
PIL 库支持图像存储、显示和处理,它能够处理几乎所有图片格式,可以完成对图像的缩放、裁剪、旋转、滤镜、叠加以及向图像添加线条、图像和文字等操作。
安装:
在命令行模式下:pip install pillow
pip 如果版本低,可升级更新:python -m pip install --upgrade pip
根据功能不同,PIL 库共包括 21 个与图片相关的类,这些类可以被看作是子库或 PIL 库中的模块
Image、ImageChops、ImageColor、ImageCrackCode、Image Enhance、ImageDraw ImageFile、ImageFileIO、ImageFilter、Image Font、ImageGL、ImageGrab、Imagemath、ImageOps、ImagePalette、ImagePath、ImageQt、ImageSequence、ImageStat、ImageTk、ImageWin
Image 是 PIL 中最重要的模块
from PIL import Image
二、基本概念
PIL 中所涉及的基本概念有如下几个:颜色模型、通道、模式、尺寸 等
2.1颜色模型
2.1.1 RGB 颜色模型
组成:红®、绿(G)、蓝(B),每个点三个分量(R,G,B)
通常可以将 r、g、b 分别规整化为【0,1】,当使用 8 bit进行存储时,r、g、b通常取值为 [0,255] 内的整数
2.1.2 CMY色彩空间
CMY 是不同于 RGB 的另外一组基本色彩:Cyan(青)、Magenta(品红)、Yellow(黄),分别是 R、G、B 的补色
比如:青 = 1 - 红色,品红 = 1- 绿色。CMY 称为“减色系统”,而 RGB 称为“加色系统”
RGB ——(0,0,0)为黑,(1,1,1)为白;值越大,颜色越亮
CMY ——(0,0,0)为白,(1,1,1)为黑,值越大,颜色越暗
2.2 通道
一幅彩色图像包括三个通道:Red 通道,Green 通道和 Blue 通道
在图像空间显示出来就是三张图片叠加起来,每张图片对应一个通道。而对于黑白图像,则只有 1 个通道
这张彩色图像是如何存储的?
在图像空间显示出来就是三张图片叠加起来,每张图片对应一个通道
2.3 图像数据
#导入相应的模块
import numpy as np
import matplotlib.pyplot as plt
# 随机生成 300x400 的多维数组
img = np.random.random([300,400])
plt.imshow(img)
plt.show()
图像的像素值可以用矩阵来表示,是一个由像素组成的二维矩阵,每个元素是一个 RGB 值
图像数据可以转换成 NumPy 中的数组元素
imshow() 功能:将数据显示为图像
- X:numpy 数组或 PIL 图像
- cmap:此参数是颜色图实例或注册的颜色图名称
2.4 模式
图像的 模式 定义了图像的类型和像素的位宽。当前支持如下模式:
(1)1:1 位像素,表示黑和白,但是存储的时候每个像素存储为 8 bit
(2)L:8 位像素,表示黑和白
(3)P:8 位像素,使用调色板映射到其他模式
(4)RGB:3x8位像素,为真彩色
(5)RGBA:4x8 位像素,有透明通道的真彩色
(6)CMYK:4x8 位像素,颜色分离(出版图像)
三、用PIL做图像处理
图像是一个由像素组成的二维矩阵,每个元素是一个 RGB 值:
- Image.open ():打开图像
- image.show():显示图像
- image.save(<文件名>):保存图像
- np.array():将图像转化为数组
- plt. imshow() :将数组显示为图像
注意: plt. imshow() 和 plt.show() 同时出现才能显示图像
import numpy as np
from PIL import Image
image = Image.open('cat.png')
image.show()
im = np.array (image)
print ('shape:',im.shape)
208 × 338 × 3: 3 代表通道信息
图像数据是多维数组,前两维表示了图像的 高(行)、宽(列),第三维表示图像通道的个数。如果是黑白图像,默认1个通道
import numpy as np
from PIL import Image
image = Image.open('cat.png')
image = np.array (image)
print (image)
print ('shape:',image.shape)
print ('dtype:',image.dtype)
结果:
shape: (460, 724, 4)
dtype: uint8
查看数据形状,其形状是 [H, W, 3]
uint8,无符号整型。表示范围是 [0, 255] 的整数,像素范围是 [0,255],也可以归一化到 [0,1]
用 PIL 获取图片 RGB 数值
# 用 PIL 获取图片 RGB 数值
from PIL import Image
im = Image.open('cat.png')
width = im.size[0]
height = im.size[1]
array = []
for x in range(5):for y in range(5):r, g, b = im.getpixel((x,y))rgb = (r, g, b)array.append(rgb)
print(array)
黑白图像
import numpy as np
from PIL import Image
image = Image.open('cat1.png')
image.show()
im = np.array (image)
print ('shape:',im.shape)
结果:shape(208, 338)
如果是黑白图像,默认1个通道
3.1 图像缩放、翻转等处理
from PIL import Image
im = Image.open ('cat.png')
im.show ()
图像可以进行缩放、翻转等操作
3.1.1 图像缩放处理
两种方法:
- 1、PIL 提供的函数;
- 2、因为图像数据本质上就是 numpy 数组,因此可以通过对数组数据进行处理(比如切片操作)就可以实现对图像的处理
from PIL import Image
img = Image.open('cat.png')
img = img.resize((104,169))
img.show()
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
img = Image.open('cat.png')
img = np.array(img)
img = img[0:120,100:250]
plt.imshow(img)
plt.show()
3.1.2 图像旋转处理
对图像做旋转处理有两种方法:
(1)PIL 提供的函数:
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
img = Image.open('cat.png')
img = img.rotate(45)
img.show()
(2)利用numpy数组处理
因为图像数据本质上就是 numpy 数组,因此可以通过对数组数据进行处理(比如切片操作)就可以实现对图像的处理
上下翻转
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
img = Image.open('cat.png')
image = np.array (img)
image = image[::-1, :, :]
plt.imshow(image)
plt.show()
左右翻转
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
image = Image.open('体育馆.png')
plt.imshow(image)
plt.show()
image = Image.open('体育馆.png')
image1 = np.array (image)
image2 = image1[:, ::-1, :]
plt.imshow(image2)
plt.show()
3.2 调整亮度
image = Image.open('cat.png')
image = np.array (image)
image1 = image * 0.5
image1 = np.clip(image1,a_min=20, a_max=200.)
plt.imshow(image1.astype('uint8'))
plt.show()
np.clip(a, a_min, a_max):这个函数将数组中的元素限制在 a_min, a_max 之间,大于 a_max 的就使得它等于 a_max,小于 a_min,的就使得它等于 a_min
3.3 图像高度裁剪
image = Image.open('cat.png')
image = np.array (image)
H,W = image.shape[0],image.shape[1]
H1 = H // 2
H2 = H
image = image[H1:H2, ::]
plt.imshow(image)
plt.show()
Image 的坐标好像是从左上开始的,0在左上
/ 是除法,例如:2/3 = 0.6666。而 // 是表示向下取整的除法,如 3 // 2 = 1,6.0 // 4 = 1
像素只能是整数,所以采用 // 除法
PIL库的 ImageEnhance 和 ImageFilter 模块提供了过滤图像和增强图像的方法
3.4 图像过滤
ImageFilter 类的预定义过滤方法
方法表示 | 描述 |
---|---|
ImageFilter.BLUR | 图像的模糊效果 |
ImageFilter.CONTOUR | 图像的轮廓效果 |
ImageFilter.EDGE_ENHANCE | 图像的边界加强效果 |
ImageFilter.DETAIL | 图像的细节效果 |
ImageFilter.EMBOSS | 图像的浮雕效果 |
ImageFilter.SMOOTH | 图像的平滑效果 |
ImageFilter.SHARPEN | 图像的锐化效果 |
图像模糊效果
import matplotlib.pyplot as plt
from PIL import Image, ImageFilter
im = Image.open('qe.png')
im = im.filter(ImageFilter.BLUR)
im.show()
图像轮廓效果
import matplotlib.pyplot as plt
from PIL import Image, ImageFilter
im = Image.open('qe.png')
conF = im.filter(ImageFilter.CONTOUR)
conF.show()
3.5图像增强
ImageEnhance 类提供了更高级的图像增强功能,如调整色彩度、亮度、对比度、锐化等
方法表示 | 描述 |
---|---|
ImageEnhance.enhance(factor) | 对选择属性的数值增强factor倍 |
ImageEnhance.Color(im) | 调整图像的颜色平衡 |
ImageEnhance.Contrast(im) | 调整图像的对比度 |
ImageEnhance.Brightness(im) | 调整图像的亮度 |
ImageEnhance.Sharpness(im) | 调整图像的锐度 |