关于Python对于图像处理详解
⽬录
Pillow模块讲解
⼀、Image模块
1.1 、打开图⽚和显⽰图⽚
对图⽚的处理最基础的操作就是打开这张图⽚,我们可以使⽤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    印刷模式图像
更多的模式也就不说了,关于模式的模式的详细介绍我也不知道。这个open⽅法返回⼀个Image对象,mode也不是必须参数。打开图⽚代码如下:
from PIL import Image
# 打开图⽚
im = Image.open('test.jpg')
# 显⽰图⽚
im.show()
当然显⽰图⽚不是我们的重点,我们获取Image对象之后,就可以获取它的⼀些信息了。
print('图像的格式:', im.format)
print('图像的⼤⼩:', im.size)
print('图像的宽度:', im.width)
print('图像的⾼度:', im.height)
# 传⼊坐标的元组
print('获取某个像素点的颜⾊值:', im.getpixel(100, 100))
在我的环境中运⾏结果如下:
图像的格式: JPEG
图像的⼤⼩: (3968, 2976)
图像的宽度: 3968
图像的⾼度: 2976
获取某个像素点的颜⾊值: (198, 180, 132)
1.2、创建⼀个简单的图像
在Image模块中,提供了创建图像的⽅法。主要是通过**w(mode, size, color)**实现,该⽅法传⼊三个参数:
mode:图像的创建模式
size:图像的⼤⼩
color:图像的颜⾊
⽤该⽅法可以创建⼀个简单的图像,之后我们可以通过save⽅法将图像保存:
from PIL import Image
# 创建⼀个简单的图像
im = w('RGB', (100, 100), 'red')
# 保存这个图像
im.save('red.png')
1.3、图像混合
(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 = w('RGB', im1.size, 'red')
# 混合图⽚,并显⽰
Image.blend(im1, im2, 0.5).show()
(2)遮罩混合
接下来就是很迷的时刻了,我们可以通过Imageposite(im1, im2, mask)⽅法实现遮罩混合。三个参数都是Image对象,该⽅法的作⽤就是使⽤mask来混合im1和im2。我是听不懂,你们能听懂最好给我讲⼀下。具体实现如下:
# 这句代码写了好多遍,我真不想写了
from PIL import Image
# 打开图像1
im1 = Image.open('pic1.jpg')
# 打开图像2
im2 = Image.open('pic2.jpg')
# 重新设置im2的⼤⼩
# 将图像2的三个⾊道分离,其中r、g、b都为Image对象
r, g, b = im2.split()
# 遮罩混合
Imageposite(im1, im2, b).show()
注意:im1、im2和mask的⼤⼩必须⼀样
1.4、图像缩放
(1)按像素缩放
按像素缩放通过Image.eval(im1, fun)⽅法实现,其中im1为我们⽼⽣常谈的Image对象了;第⼆个为⼀
个⽅法(函数),该函数传⼊⼀个参数,即像素点。该函数会对图⽚中每个像素点进⾏函数内的操作。下⾯我们对来简单使⽤⼀下这个⽅法:
from PIL import Image
# 打开⼀张图像
eval是做什么的im = Image.open('抠⿐屎.jpg')
# 对该图像每个像素点进⾏*2处理
Image.eval(im, lambda x:x*2).show()
这⾥我使⽤的lambda表达式,当然⼀般也都是⽤lambda表达式,不过你也可以像下⾯这样写:
# 定义⼀个⽅法
def func(x):
return x*2
# 对图像im每个像素点进⾏func中的操作,其中func不能加()
Image.eval(im, func)
细⼼的读者应该可以发现,这个抠⿐屎的图⽚和笔者头像并不完全⼀样。在⾎⾊⽅⾯,笔者的头像确实要差⼏分。
注意:笔者在⽇常⽣活中可不是天天在⼤街上抠⿐屎的那种。
(2)按尺⼨缩放
按尺⼨缩放是通过Image对象的thumbnail()⽅法实现的,这⾥不同于前⾯直接通过Image调⽤⽅法,⽽是使⽤Image的具体实例im2调⽤thumbnail⽅法,从⽽对im2直接进⾏处理。具体代码如下:
from PIL import Image
# 打开图像
im1 = Image.open('xx.jpg')
# 复制图像
im2 = py()
# 将复制后的图像进⾏缩放,传⼊⼀个元组
im2.thumbnail((100, 100))
# 输出图像⼤⼩
print("im1的⼤⼩", im1.size)
print('im2的⼤⼩', im2.size)
这⾥缩放图像并不会对图像进⾏变形,即显⽰效果是⼀样的。这⾥就不放效果图了,输⼊结果如下:
im1的⼤⼩ (960, 960)
im2的⼤⼩ (100, 100)
1.5、图像的剪切与粘贴
(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 = p((200, 200, 400, 400))
# 粘贴图⽚
im2.paste(im_crop, (30, 30))
im2.show()
1.4、图像旋转和格式转换
(1)图像旋转
图像旋转就⾮常简单了,简单的⼀句代码,通过Image对象调⽤rotate(),该⽅法返回被旋转图像的⼀个副本:
from PIL import Image
im = Image.open('nnz.jpg')
# 旋转90度然后显⽰
顺时针逆时针就不要问我了。
(2)格式转换
convert:转换图像的模式
transpose:转换图像的格式
convert之前已经使⽤过了,这⾥就简单演⽰⼀下transpose的作⽤,transpose主要传⼊⼀些Image中的常量:
from PIL import Image
# 打开图像
im = Image.open('nnz.jpg')
# 这⾥我也不知道注释啥了,总之效果和rotate(90)效果⼀样
效果图我也就不放了,给⼤家列出⼀些可以传⼊的常量和该常量的作⽤:
常量作⽤
Image.FILP_TOP_BOTTOM    上下翻转
Image.FILP_LEFT_RIGHT    左右翻转
Image.ROTATE_90    翻转90°
Image.ROTATE_180    翻转180°
Image.TRANSPOSE    颠倒
我也不知道这是哪门⼦的格式转换。
1.5、分离和合并
(1)分离
这个是之前使⽤过的,通过Image对象的split()⽅法,将图像的RGB三个通道分离,并返回三个Image对象:
from PIL import Image
# 打开图像
im = Image.open('nnz.jpg')
# 分离通道,返回3个Image对象
r, g, b = im.split()
(2)合并
合并是通过(mode, bands)⽅法实现的,其中mode为模式,bands为通道列表,传⼊⼀个列表类型数据。下⾯我实现以下⼩新多年来的愿望:
from PIL import Image
# 打开⼩新.jpg和娜娜⼦.jpg
im1 = Image.open('娜娜⼦.jpg')
im2 = Image.open('⼩新.jpg')
# 让im2⼤⼩和im1⼀样
# 将两个图像分别分离
r1, g1, b1 = im1.split()
r2, g2, b2 = im2.split()
# 合并图像
im3 = ('RGB', [r1, g2, b1])
im3.show()
到这⾥,我们就把Image模块的⼤致内容讲解完了,接下来我们来了解PIL中更丰富的功能。
⼆、ImageFilter
ImageFilter中提供了很多常⽤的滤镜功能,
2.1、⾼斯模糊
⾼斯模糊也叫⾼斯平滑,是啥我也不知道,反正听名字就是模糊。我们结合上⾯的内容完成⼀个⼩案例:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。