Pillow模块讲解
Image模块
打开图片和显示图片
对图片的处理最基础的操作就是打开这张图片,我们可以使用Image模块中的open(fp, mode)方法,来打开图片。open方法接收两个参数,第一个是文件路径,第二个是模式。主要的模式如下:
mode(模式) | bands(通道) | 说明 |
---|---|---|
“1” | 1 | 数字1,表示黑白二值图片,每个像素用0或1共1位二进制码表示 |
“L” | 1 | 灰度图 |
“P” | 1 | 索引图 |
“RGB” | 3 | 24位真彩图 |
“RGBA” | 4 | “RGB”+透明通道 |
“CMYK” | 4 | 印刷模式图像 |
from PIL import Image
# 打开图片
im = Image.open('1.jpg')
# 显示图片
im.show()
#相关信息
print('图像的格式:', im.format)
print('图像的大小:', im.size)
print('图像的宽度:', im.width)
print('图像的高度:', im.height)
# 传入坐标的元组
print('获取某个像素点的颜色值:', im.getpixel((100,100)))
自创图片
from PIL import Image
# 创建一个简单的图像
im = Image.new('RGB', (100, 100), 'red')
# 保存这个图像
im.save('red.png')
图像混合
(1)透明度混合
透明度混合主要是使用Image中的blend(im1, im2, alpha)方法,对该方法的解释如下:
im1:Image对象,在混合的过程中,透明度设置为(1-apha) im2:Image对象,在混合的过程中,透明度设置为(apha) alpha:透明度,取值是0-1。当透明度为0是,显示im1对象;当透明度为1时,显示im2对象
注意:im1和im2的大小必须一样,且mode都为RGB
from PIL import Image
# 打开im1
im1 = Image.open('pic.jpg').convert(mode='RGB')
# 创建一个和im1大小一样的图像
im2 = Image.new('RGB', im1.size, 'red')
# 混合图片,并显示
Image.blend(im1, im2, 0.5).show()
(2)遮罩混合
我们可以通过Image.composite(im1, im2, mask)方法实现遮罩混合。三个参数都是Image对象,该方法的作用就是使用mask来混合im1和im2。
from PIL import Image
# 打开图像1
im1 = Image.open('pic1.jpg')
# 打开图像2
im2 = Image.open('pic2.jpg')
# 重新设置im2的大小
im2.resize(im1.size)
# 将图像2的三个色道分离,其中r、g、b都为Image对象
r, g, b = im2.split()
# 遮罩混合
Image.composite(im1, im2, b).show()
图像缩放
(1)按像素缩放
按像素缩放通过Image.eval(im1, fun)方法实现,其中im1为我们老生常谈的Image对象了;第二个为一个方法(函数),该函数传入一个参数,即像素点。该函数会对图片中每个像素点进行函数内的操作。下面我们对来简单使用一下这个方法:
from PIL import Image
# 打开一张图像
im = Image.open('抠鼻屎.jpg')
# 对该图像每个像素点进行*2处理
Image.eval(im, lambda x:x*2).show()
(2)按尺寸缩放
按尺寸缩放是通过Image对象的thumbnail()方法实现的,这里不同于前面直接通过Image调用方法,而是使用Image的具体实例im2调用thumbnail方法,从而对im2直接进行处理。具体代码如下:
from PIL import Image
# 打开图像
im1 = Image.open('xx.jpg')
# 复制图像
im2 = im1.copy()
# 将复制后的图像进行缩放,传入一个元组
im2.thumbnail((100, 100))
# 输出图像大小
print("im1的大小", im1.size)
print('im2的大小', im2.size)
注意:缩放不是变形,即图片的显示效果还是一样的
图像的剪切与粘贴
(1)图像粘贴
粘贴的实现主要是通过Image对象的paste(im, box, mask)方法,其中im为Image对象;box为要粘贴到的区域;mask为遮罩(我也不知道啥是遮罩)。其中box的参数有三种形式:
(x1, y1):将im左上角对齐(x1,y1)点,其余部分粘贴,超出部分抛弃 (x1, x2, y1, y2):将im粘贴至此区域 None:此时im必须与源图像大小一致
(2)裁剪图像
裁剪主要通过Image对象的crop(box)方法实现,box同粘贴中一致。
以下代码实现裁剪图像到某一区域:
from PIL import Image
# 打开图像
im = Image.open('nnz.jpg')
# 复制两份
im1 = im.copy()
im2 = im.copy()
# 剪切图片
im_crop = im1.crop((200, 200, 400, 400))
# 粘贴图片
im2.paste(im_crop, (30, 30))
im2.show()
图像旋转和格式转换
(1)图像旋转
图像旋转就非常简单了,简单的一句代码,通过Image对象调用rotate()正顺负逆,该方法返回被旋转图像的一个副本:
from PIL import Image
im = Image.open('nnz.jpg')
# 旋转90度然后显示
im.rotate(90).show()
(2)格式转换
convert:转换图像的模式
transpose:转换图像的格式
convert之前已经使用过了,这里就简单演示一下transpose的作用,transpose主要传入一些Image中的常量:
from PIL import Image
# 打开图像
im = Image.open('nnz.jpg')
# 这里我也不知道注释啥了,总之效果和rotate(90)效果一样
im.transpose(Image.ROTATE_90).show()
transpose常用参数:
常量 | 作用 |
---|---|
Image.FILP_TOP_BOTTOM | 上下翻转 |
Image.FILP_LEFT_RIGHT | 左右翻转 |
Image.ROTATE_90 | 翻转90° |
Image.ROTATE_180 | 翻转180° |
Image.TRANSPOSE | 颠倒 |
分离和合并
(1)分离
这个是之前使用过的,通过Image对象的split()方法,将图像的RGB三个通道分离,并返回三个Image对象
from PIL import Image
# 打开图像
im = Image.open('nnz.jpg')
# 分离通道,返回3个Image对象
r, g, b = im.split()
(2)合并
合并是通过Image.merge(mode, bands)方法实现的,其中mode为模式,bands为通道列表,传入一个列表类型数据。下面我实现以下小新多年来的愿望:
from PIL import Image
# 打开小新.jpg和娜娜子.jpg
im1 = Image.open('娜娜子.jpg')
im2 = Image.open('小新.jpg')
# 让im2大小和im1一样
im2.resize(im1.size)
# 将两个图像分别分离
r1, g1, b1 = im1.split()
r2, g2, b2 = im2.split()
# 合并图像
im3 = Image.merge('RGB', [r1, g2, b1])
im3.show()
Comments NOTHING