python图像处理之Image

酥酥 发布于 2021-09-18 102 次阅读


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()