赞
踩
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
用该方法可以创建一个简单的图像,之后我们可以通过save方法将图像保存:
from PIL import Image
# 创建一个简单的图像
im = Image.new('RGB', (100, 100), 'red')
# 保存这个图像
im.save('red.png')
生成图片如下:
透明度混合主要是使用**Image中的blend(im1, im2, alpha)**方法,对该方法的解释如下:
注意: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()
下面为原图和混合图的对比:
不得不说,我家艾斯真滴帅。
接下来就是很迷的时刻了,我们可以通过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()
注意:im1、im2和mask的大小必须一样
im1、im2和遮罩混合效果对比如下:
依旧是我帅气的艾斯。
按像素缩放通过Image.eval(im1, fun)方法实现,其中im1为我们老生常谈的Image对象了;第二个为一个方法(函数),该函数传入一个参数,即像素点。该函数会对图片中每个像素点进行函数内的操作。下面我们对来简单使用一下这个方法:
from PIL import Image
# 打开一张图像
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)
效果图如下:
细心的读者应该可以发现,这个抠鼻屎的图片和笔者头像并不完全一样。在血色方面,笔者的头像确实要差几分。
注意:笔者在日常生活中可不是天天在大街上抠鼻屎的那种。
按尺寸缩放是通过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)
这里缩放图像并不会对图像进行变形,即显示效果是一样的。这里就不放效果图了,输入结果如下:
im1的大小 (960, 960)
im2的大小 (100, 100)
粘贴的实现主要是通过Image对象的paste(im, box, mask)方法,其中im为Image对象;box为要粘贴到的区域;mask为遮罩(我也不知道啥是遮罩)。其中box的参数有三种形式:
裁剪主要通过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()
原图和效果图对比如下:
貌美如花的娜娜子。
图像旋转就非常简单了,简单的一句代码,通过Image对象调用rotate(),该方法返回被旋转图像的一个副本:
from PIL import Image
im = Image.open('nnz.jpg')
# 旋转90度然后显示
im.rotate(90).show()
顺时针逆时针就不要问我了。
convert之前已经使用过了,这里就简单演示一下transpose的作用,transpose主要传入一些Image中的常量:
from PIL import Image
# 打开图像
im = Image.open('nnz.jpg')
# 这里我也不知道注释啥了,总之效果和rotate(90)效果一样
im.transpose(Image.ROTATE_90).show()
效果图我也就不放了,给大家列出一些可以传入的常量和该常量的作用:
常量 | 作用 |
---|---|
Image.FILP_TOP_BOTTOM | 上下翻转 |
Image.FILP_LEFT_RIGHT | 左右翻转 |
Image.ROTATE_90 | 翻转90° |
Image.ROTATE_180 | 翻转180° |
Image.TRANSPOSE | 颠倒 |
我也不知道这是哪门子的格式转换。
这个是之前使用过的,通过Image对象的split()方法,将图像的RGB三个通道分离,并返回三个Image对象:
from PIL import Image
# 打开图像
im = Image.open('nnz.jpg')
# 分离通道,返回3个Image对象
r, g, b = im.split()
三个通道的效果图如下:
合并是通过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()
效果图如下,看到这么美的图片,小新一定会感谢我的:
到这里,我们就把Image模块的大致内容讲解完了,接下来我们来了解PIL中更丰富的功能。
ImageFilter中提供了很多常用的滤镜功能,
高斯模糊也叫高斯平滑,是啥我也不知道,反正听名字就是模糊。我们结合上面的内容完成一个小案例:
from PIL import Image, ImageFilter
# 打开图像
im1 = Image.open('iron\_man.jpg')
# 创建一个im1两倍宽的图像
img = Image.new('RGB', (im1.width\*2, im1.height), 'red')
# 高斯模糊处理
im2 = im1.filter(ImageFilter.GaussianBlur)
# 将im1粘贴到img上
img.paste(im1, (0, 0))
# 将im2(高斯模糊后的图像)粘贴到img上
img.paste(im2, (im1.width, 0))
img.show()
为了考虑小新的感受,下面不再用娜娜子作为素材。我选取了一张钢铁侠的图片,运行结果如下:
希望各位读者不要误会,他俩真没说你帅,他俩只说笔者一个人帅。
除了高斯模糊,ImageFilter中还提供了许多其它滤镜:
滤镜值 | 滤镜名词 |
---|---|
BLUR | 模糊效果 |
CONTOUR | 轮廓 |
DETAIL | 细节 |
EDGE_ENHANCE | 边缘增强 |
EDGE_ENHANCE_MORE | 边缘增强plus |
EMBOSS | 浮雕效果 |
FIND_EDGES | 寻找边缘 |
SMOOTH | 平滑 |
笔者用一张美女图片,测试了上面几个滤镜的效果,发现9张图是看起来是完全一样的。虽然完全一样,但是笔者还是打算将这次测试的结果作为我慈善事业的一部分,分享给各位读者。
其中1为高斯模糊,2-9分别为表格中的8个滤镜。
ImageChops模块中,提供了很多图像合成的方法。这些方法是通过计算通道中像素值来实现的,不同的方法有不同的计算方式。
加法运算通过**ImageChops.add(image1, image2, scale=1.0, offset=0)**方法实现,合成公式如下:
out = (im1 + im2)/scale + offset
我也看不懂,其中scale和offset是有默认值的。所以使用时我们可以省略参数,具体实现如下:
from PIL import Image, ImageChops
# 打开图像
im1 = Image.open('im1.jpg')
im2 = Image.open('im2.jpg')
# 合成图像并显示
im3 = ImageChops.add(im1, im2)
im3.show()
实验结果产不忍赌,效果图如下:
加法运算通过**ImageChops.subtract(image1, image2, scale=1.0, offset=0)**方法实现,合成公式如下:
out = (im1 - im2)/scale + offset
其使用和add方法是一致的,代码如下:
from PIL import Image, ImageChops
# 打开图像
im1 = Image.open('xscn.jpg')
im2 = Image.open('xscn2.jpg')
# 合成图像并显示
im3 = ImageChops.subtract(im1, im2)
im3.show()
原本是不想放效果图的,但是运行后,发现效果图比较美,所以想和大家分享一下:
希望大家读到这篇博客的时候是独自一人的深夜。
因为大多数函数的使用都比较简单,所以后续的函数也不单独拿出来讲了,具体功效可以看下列表:
函数名 | 参数 | 作用 | 计算公式 |
---|---|---|---|
darker(变暗) | (image1, image2) | 对比两种图片的像素,取两种图片中对应像素的较小值。(去亮留暗) | min(im1, im2) |
lighter(变亮) | 同上 | 对比两种图片的像素,取两种图片中对应像素的较大值。(去暗留亮) | max(im1, im2) |
invert(反色) | (image) | 将max(255)减去每个像素的值 | max-image |
multiply(叠加) | (image1, image2) | 两种图片互相叠加。如果和黑色叠加,将获得一张很色图片 | im1*im2/max |
screen(屏幕) | 同上 | 先反色后叠加 | max-((max-im1)*(max-im2)/max) |
difference(比较) | 同上 | 各个像素做减法,取绝对值。如果像素相同结果为黑色 | abs(im1-im2) |
演示代码如下:
from PIL import Image, ImageChops # 打开图像 im1 = Image.open("im1.jpg") im2 = Image.open("im2.jpg") # 对图像进行各种操作 im3 = ImageChops.darker(im1, im2) im3.save('darker.jpg') im3 = ImageChops.lighter(im1, im2) im3.save('lighter.jpg') im3 = ImageChops.invert(im1) im3.save('invert.jpg') im3 = ImageChops.multiply(im1, im2) im3.save('multiply.jpg') im3 = ImageChops.screen(im1, im2) im3.save('screen.jpg') im3 = ImageChops.difference(im1, im2) im3.save('difference.jpg')
其中,我选取的素材im1和im2都是上面使用到的那两张,效果图如下:
这样,我的女神就被我毁的体无完肤了。
ImageEnhance提供了许多函数,用于调整图像的色彩、对比度、亮度、清晰度等。调整图像的步骤如下:
注意:所有调整器都实现同一个接口,该接口中包含一个方法enhance
其中enhance方法接收一个参数factor,factor是一个大于0的数。当factor为1时,返回原图,当factor小于1返回减弱图,大于1返回增强图。
各个获取色彩调整器的方法如下:
方法名称 | 方法作用 |
---|---|
ImageEnhance.Color() | 获取颜色调整器 |
ImageEnhance.Contrast() | 获取对比度调整器 |
ImageEnhance.Brightness() | 获取亮度调整器 |
ImageEnhance.Sharpness() | 获取清晰度调整器 |
虽然是很想偷懒,不去做实验,但是想想还是做了如下实验,代码如下:
from PIL import Image, ImageEnhance # 打开im1 im1 = Image.open("gtx.jpg") # 获取颜色(各种)调整器 enhance_im1 = ImageEnhance.Color(im1) #enhance\_im1 = ImageEnhance.Contrast(im1) #enhance\_im1 = ImageEnhance.Brightness(im1) #enhance\_im1 = ImageEnhance.Sharpness(im1) # 减弱颜色(以及其它属性) im2 = enhance_im1.enhance(0.5) # 增强颜色(以及其它属性) im3 = enhance_im1.enhance(1.5) # 获取原图大小 w, h = im1.size # 创建一个原图大小3倍的图片 img = Image.new("RGB", (w\*3, h)) # 将减弱的图片放在最左边 img.paste(im2, (0, 0)) # 将原图放在中间 img.paste(im1, (w, 0)) # 将增强后的图片放在最右边 img.paste(im3, (w\*2, 0)) # 显示图片 img.show()
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
s(im1)
im2 = enhance_im1.enhance(0.5)
im3 = enhance_im1.enhance(1.5)
w, h = im1.size
img = Image.new(“RGB”, (w*3, h))
img.paste(im2, (0, 0))
img.paste(im1, (w, 0))
img.paste(im3, (w*2, 0))
img.show()
[外链图片转存中...(img-4yAZ9eBz-1715674305478)]
[外链图片转存中...(img-zM99F8t4-1715674305479)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。