Python之基础详解(十一):PTL各模块讲解:Image、ImageFilter、ImageChops、ImageColor、ImageEnhance、ImageOps、ImageDraw
希望迪丽热巴看到后不要锤死我~
我是你的小粉丝儿
文章目录
- 一、Image模块
- 1.1准备工作
- 1.2打开和显示已有图片(open and show)
- 1.3创建一张新的简单图片(new)
- 1.4图片模式的转换(convent)
- 1.5图像的放缩
- 1.5.1按尺寸放缩(thumbnail and resize)
- 1.5.2按像素放缩(eval)
- 1.6图像的裁剪、粘贴和复制
- 1.6.1图片的裁剪(crop)
- 1.6.2图片的粘贴(paste)
- 1.6.3图片的复制(copy)
- 1.7图像的融合与复合
- 1.7.1图像的融合(blend)
- 1.7.2图像的复合(composite)
- 1.8图像的分离与合并
- 1.8.1图像的分离(split)
- 1.8.2图像的合并(merge)
- 1.9图像的旋转
- 1.9.1给定角度旋转(rotate)
- 1.9.2给定参数旋转(transpose)
- 1.10其他函数
- 1.10.1Getextrema类
- 1.10.2Getpixel类
- 1.10.3Histogram类
- 1.10.4Palette类
- 1.10.5Info类
- 二、ImageFilter模块
- 2.1平滑效果(plus)(SMOOTH_MORE)
- 2.2锐化图片(SHARPEN)
- 2.3其他效果
- 三、ImageChops模块
- 3.1叠加效果(multiply)
- 3.2反色效果(invert)
- 3.3逻辑运算
- 3.3.1逻辑与(logical_and)
- 3.3.2逻辑或(logical_or)
- 3.3.3逻辑异或(logical_xor)
- 3.4其他效果
- 四、ImageColor模块
- 4.1getrgb(color)方法
- 4.2getcolor(color, mode)方法
- 五、ImageEnhance模块
- 5.1更改色调(Color)
- 5.2其他调整器
- 六、ImageOps模块
- 6.1autocontrast(image, cutoff=0)方法
- 6.2solarize(image,threshold=128)方法
- 6.3colorize(image, black, white)方法
- 6.4其他方法
- 七、ImageDraw模块
- 7.1绘制简单图形
- 1.7.1绘制点
- 7.1.2绘制直线
- 7.1.3绘制圆弧
- 7.1.4绘制矩形
- 7.1.5绘制椭圆
- 7.1.6绘制扇形
- 7.1.7绘制多边形
- 7.1.8绘制弦
- 7.2绘制文本
一、Image模块
1.1准备工作
PIL模块(Python Image Library)是Python中处理图像的标准库,功能强大。
PIL仅支持到Python2.7,并且Python3.x的兼容版本名为Pillow,因此我们需要通过pip手动安装:
pip install Pillow
- 注意:尽管 PIL在Python3.x下改名为Pillow,但在导入模块时仍使用PIL
1.2打开和显示已有图片(open and show)
想要打开已有图片,就可以用Image模块中的open(fp, mode)函数,两个传入参数,fp是图片存储的路径,mode是模式,常见模式如下:
mode | 描述 |
---|---|
1 | 1位像素,黑和白,存成八位像素,每个像素有二进制码表示 |
L | 八位像素,黑和白,灰度图 |
I | 32位整形像素 |
F | 32位浮点型像素 |
P | 8位像素,使用单调色板映射到任何其他形式,索引图 |
RGB | 24位像素,真彩图 |
RBGA | 32位像素,真彩+透明通道 |
CMYK | 32位像素,颜色隔离,印刷模式 |
YCbCr | 24位像素,色彩视频格式 |
里面最常见的就是“RGB”模式,open函数里面的’mode‘传入参数不是必要参数,可不写。代码运行如下:
from PIL import Image
#打开
im = Image.open('迪丽热巴.jpg')
#显示图片
im.show()
在这里我的图片就放在本文件夹里面,嘿嘿,让你们看一下我的大热巴~
啦啦啦,是不是很美!!!!!!接下来让我们看一下图片的基本情况:
print('图像的格式',im.format)
print('图像的大小',im.size)
print('图像的模式',im.mode)
#传入坐标元组----------------------------------⬇
print('获取某个像素点的颜色值',im.getpixel((100,100)))
运行结果如下:(看你的图片的情况,会有差异)
图像的格式 JPEG
图像的大小 (400, 250)
图像的模式 RGB
获取某个像素点的颜色值 (35, 17, 7)
1.3创建一张新的简单图片(new)
Image模块提供创建图片的方法→Image.new(mode, size, color)
其中有三个传入参数:
- mode:图片的模式
- size:图片的大小
- color:图片的颜色
mode模式的选择上文有详细表格,然后用save()函数保存图像,代码如下:
from PIL import Image
#创建一个简单的图像
im = Image.new('RGB',(100,100),'green')
#保存图像,传入参数是文件保存路径
im.save('E:\\abc.png')
这样在我的E盘根目录下生成了一张绿绿的图片
1.4图片模式的转换(convent)
通过convent()函数将当前图像转换为其他模式,并且返回新的图像。
当从一个调色板图像转换时,这个方法通过这个调色板来转换像素。
如果不对变量mode赋值,该方法将会选择一种模式,在没有调色板的情况下,使得图像和调色板中的所有信息都可以被表示出来。
当从一个颜色图像转换为黑白图像时,PIL库使用ITU-R601-2 luma转换公式:
L = R * 299/1000 + G * 587/1000 + B * 114/1000
当转换为2位图像(模式“1”)时,源图像首先被转换为黑白图像。结果数据中大于127的值被设置为白色,其他的设置为黑色;这样图像会出现抖动。如果要使用其他阈值,更改阈值127,可以使用方法point()。为了去掉图像抖动现象,可以使用dither选项。下面举一个例子,运行代码如下:
from PIL import Image
im = Image.open("迪丽热巴.jpg")
new_im = im.convert('P')
print(new_im.mode)
new_im.show()
输出如下:
P
输出的图片如下:
是不是变得更有光泽了,哈哈哈(好吧,我是好不容易才看出来有区别,嘿嘿)
1.5图像的放缩
1.5.1按尺寸放缩(thumbnail and resize)
通过Image对象的thumbnail()函数,使用Image的具体实例im2,通过im2调用thumbnail方法,从而对im2直接进行处理。具体代码如下:
from PIL import Image
# 打开图像
im1 = Image.open('迪丽热巴.jpg')
# 复制图像
im2 = im1.copy()
# 将复制后的图像进行放缩,传入参数为一个元组
im2.thumbnail((100, 100))
# 输出图像大小
print("im1的大小", im1.size)
print('im2的大小', im2.size)
输出如下:
im1的大小 (400, 250)
im2的大小 (100, 63)
输出图片如下:
这里不会对图片进行变形。
或者直接修改为指定尺寸,运行代码如下:
from PIL import Image
# 打开图像
im1 = Image.open('迪丽热巴.jpg')
# 复制图像
im2 = im1.copy()
#resize成128*128像素大小
im2=im2.resize((100,100))
# 输出图像大小
print("im1的大小", im1.size)
print('im2的大小', im2.size)
输出结果如下:
im1的大小 (400, 250)
im2的大小 (100, 100)
这里我就不放图片了,和上一张图片效果差不多,而且你们看热巴看的也够多的了!哈哈哈~
1.5.2按像素放缩(eval)
通过Image.eval(im, fun)方法实现,传入参数im是我们要放缩的Image对象;传入参数fun为一个函数,该函数传入一个参数(像素点)。该函数会对图片中每个像素点进行函数内的操作。运行代码如下:
from PIL import Image
# 打开一张图像
im = Image.open('要恋爱了.jpg')
# 对该图像每个像素点进行*2处理
def func(x):return x*2
Image.eval(im,func).show()
#也可以直接用lambda表达式
#Image.eval(im, lambda x:x*2).show()
运行输出的效果图如下:(大家千万不要一下子恋爱了哦)
哈哈哈,我恋爱了~你们说要是热巴看到这个会不会给我发消息。。。
1.6图像的裁剪、粘贴和复制
1.6.1图片的裁剪(crop)
通过Image对象的crop(box)方法实现图片的裁剪,传入参数box为要裁剪的区域,它有三种形式:
- (x1, y1):将im左上角对齐(x1,y1)点,其余部分裁剪,超出部分抛弃
- (x1,y1,x2,y2):将im裁剪此区域(左上角和右下角作为对角线)
- None:此时im必须与源图像大小一致
运行代码如下:
from PIL import Image
# 打开图像
im1= Image.open('热巴.jpg')
# 剪切图片
im2 =im1.crop((650, 110, 1250, 650))
im2.show()
效果图如下:
试了好多下,终于剪的刚刚好~
1.6.2图片的粘贴(paste)
通过Image对象的paste(im, box, mask)方法实现图片的粘贴,其中传入参数im为Image对象;box为要粘贴到的区域(上面有讲);mask为遮罩。(如果模式不匹配,被粘贴的图像将被转换为当前图像的模式)
- 此图像可以具有模式(mode)“1”、“l”或“rgba”,并且必须与其他两个图像具有相同的大小。
- 变量mask对应的模板图像来填充所对应的区域。可以使用模式为“1”、“L”或者“RGBA”的图像作为模板图像。模板图像的尺寸必须与变量image对应的图像尺寸一致。如果变量mask对应图像的值为255,则模板图像的值直接被拷贝过来;如果变量mask对应图像的值为0,则保持当前图像的原始值。变量mask对应图像的其他值,将对两张图像的值进行透明融合。
注意:如果变量image对应的为“RGBA”图像,即粘贴的图像模式为“RGBA”,则alpha通道被忽略。用户可以使用同样的图像作为原图像和模板图像。 - 传入参数mask是不必要传入参数。
正好,我将上面裁剪的图片粘贴到原图上,直观可见,运行代码如下:
from PIL import Image
# 打开图像
im1= Image.open('热巴.jpg')
# 剪切图片
im2 =im1.crop((650, 110, 1250, 650))
im1.paste(im2,(10,10))#这里传入参数mask一般不写,mask=None
im1.show()
效果图如下:
完美~
1.6.3图片的复制(copy)
通过调用Image的copy()函数 返回一个image对象。想对图像进行操作却又不影响原图像,就可以用该函数。运行代码如下:
from PIL import Image
im = Image.open("迪丽热巴.jpg")
im_copy = im.copy()
im.show()
im_copy.show()
在这里我就不上图了,两张图片完全一样。也让大家缓一缓,免得审美疲劳。嘿嘿~
1.7图像的融合与复合
1.7.1图像的融合(blend)
通过Image的blend(image1,image2, alpha)函数实现图像的融合,使用给定的两张图像及透明度变量alpha,插值出一张新的图像。
合成公式为:out = image1 (1.0 - alpha) + image2 alpha
- 这两张图像必须有一样的尺寸和模式。
- 若变量alpha为0.0,返回第一张图像的拷贝。若变量alpha为1.0,将返回第二张图像的拷贝。
- 对变量alpha的值无限制。
运行代码如下:
from PIL import Image
im1 = Image.open("迪丽热巴.jpg")
im2 = Image.open("热巴.jpg")
print(im1.mode,im1.size)
print(im2.mode,im2.size)
im = Image.blend(im1, im2, 0.2)
im.show()
运行结果:
RGB (1920, 1200)
RGB (1920, 1200)
输出图像对比:
当当当当~
1.7.2图像的复合(composite)
通过Image的composite(image1,image2, mask)方法,复合类使用给定的两张图像及mask图像作为透明度,插值出一张新的图像。变量mask图像的模式可以为“1”,“L”或者“RGBA”。所有图像必须有相同的尺寸。运行代码如下:
from PIL import Image
im1 = Image.open("迪丽热巴.jpg")
im2 = Image.open("热巴.jpg")
#分离出r,g,b
r,g,b = im1.split()
print(b)
print(b.mode)
print(im1.mode,im1.size)
print(im2.mode,im2.size)
im = Image.composite(im1,im2,b)
im.show()
输出内容:
<PIL.Image.Image image mode=L size=1920x1200 at 0x183EC93F908>
L
RGB (1920, 1200)
RGB (1920, 1200)
然后再让我们看一下效果图,哈哈哈,这个函数比blend举的例子处理的图片好看~
怎么样,好看吧~
1.8图像的分离与合并
1.8.1图像的分离(split)
在这里讲一下Split函数,返回当前图像各个通道组成的一个元组。例如,分离一个“RGB”图像将产生三个新的图像,分别对应原始图像的每个通道(红,绿,蓝)。下面让我们来看一下运行代码:
from PIL import Image
im = Image.open("迪丽热巴.jpg")
r,g,b = im.split()
print(r.mode)
print(r.size)
print(im.size)
r.show()
g.show()
b.show()
输出结果如下:
L
(1920, 1200)
(1920, 1200)
让我们看一下效果图:
1.8.2图像的合并(merge)
通过Image的merge(mode,bands)函数返回一个image对象,来实现图像的合并。合并类使用单通道图像,创建一个新的图像。传入参数bands为一个图像的元组或者列表,每个通道的模式由传入参数mode描述,所有的通道必须有相同的尺寸。运行代码如下:
from PIL import Image
im1 = Image.open("要恋爱了.jpg")
im2 = Image.open("迪丽热巴啊.jpg")
r1,g1,b1 = im1.split()
r2,g2,b2 = im2.split()
print(r1.mode,r1.size,g1.mode,g1.size,b1.mode,b1.size)
print(r2.mode,r2.size,g2.mode,g2.size,b2.mode,b2.size)
new_im=[r1,g2,b2]
im_merge = Image.merge("RGB",new_im)
im_merge.show()
输出内容:
L (1920, 1200) L (1920, 1200) L (1920, 1200)
L (1920, 1200) L (1920, 1200) L (1920, 1200)
让我们来看一下效果图:
是不是觉得第一张图怪怪的,哈哈哈,因为两张图片尺寸不一样,我改了一下,就发现热巴的小脸变圆了。
1.9图像的旋转
1.9.1给定角度旋转(rotate)
通过Image的rotate(angle,filter=NEAREST, expand=0)函数 返回一个按照给定角度顺时钟围绕图像中心旋转后的图像拷贝。
- 传入参数filter是NEAREST、BILINEAR或者BICUBIC之一。如果省略该变量,或者图像模式为“1”或者“P”,则默认为NEAREST。
- 传入参数expand,若为true,表示输出图像足够大,可以装载旋转后的图像。若为false或者缺省,则输出的图像与输入图像具有相同尺寸。
运行代码如下:
from PIL import Image
im = Image.open("迪丽热巴.jpg")
im_30 = im.rotate(30)
im_60 = im.rotate(60, Image.NEAREST,True)
print(im_30.size,im_60.size)
im_30 .show()
im_60 .show()
输出:
(1920, 1200) (2000, 2264)
下面是旋转的效果图:
实际大小不是这样,为了让大家看得明白,p的时候设置height一样。
好看不,我们不是来看美女的,我们是来学习的✊
1.9.2给定参数旋转(transpose)
通过Image的transpose(method)函数,返回一个当前图像的翻转或者旋转的image拷贝对象。传入参数method的取值为:FLIP_LEFT_RIGHT,FLIP_TOP_BOTTOM,ROTATE_90,ROTATE_180,或ROTATE_270。对应表格如下:
传入参数method | 作用 |
---|---|
Image.FLIP_LEFT_RIGHT | 左右对换 |
Image.FLIP_TOP_BOTTOM | 上下对换 |
Image.ROTATE_90 | 旋转 90° |
Image.ROTATE_180 | 旋转180° |
Image.ROTATE_270 | 旋转270° |
Image.TRANSPOSE | 颠倒 |
运行代码如下:
from PIL import Image
# 打开图像
im = Image.open('迪丽热巴.jpg')
im.transpose(Image.ROTATE_90).show()
效果图如下:
唉,无论侧着看还是怎么看都一样美!
1.10其他函数
1.10.1Getextrema类
该函数的作用是返回一个2元组,包括该图像中的最小和最大值。运行代码如下:
from PIL import Image
im = Image.open("迪丽热巴.jpg")
print(im.getextrema())
输出:
((0, 255), (0, 255), (0, 255))
1.10.2Getpixel类
该函数作用是返回给定位置的像素值。如果图像为多通道,则返回一个元组。(运行慢)
运行代码如下:
from PIL import Image
im = Image.open("迪丽热巴.jpg")
r,g,b = im.split()
print(im.getpixel((0,0)))
print(im.getpixel((5,5)))
print(b.getpixel((20,18)))
输出:
(231, 237, 237)
(227, 233, 233)
239
1.10.3Histogram类
该函数的作用是返回一个图像的直方图。这个直方图是关于像素数量的list,图像中的每个象素值对应一个成员。如果图像有多个通道,所有通道的直方图会连接起来。二值图像(模式为“1”)当作灰度图像(模式为“L”)处理。运行代码如下:
from PIL import Image
im = Image.open("迪丽热巴.jpg")
imhis = im.histogram()
print(len(imhis))
print(imhis[0])
print(imhis[200])
print(imhis[400])
输出:
768
9397
2278
1028
1.10.4Palette类
该函数的作用是调用颜色调色板表格。如果图像的模式是“P”,则返回ImagePalette类的实例;否则,将为None。如下为对非“P”模式下的图像进行palette信息显示。
运行代码如下:
from PIL import Image
im = Image.open("迪丽热巴.jpg")
print(im.palette)
输出:
None
1.10.5Info类
该函数的作用是存储图像相关数据的字典。运行代码如下:
from PIL import Image
im = Image.open("迪丽热巴.jpg")
print(im.info)
输出一大堆信息,这里就不打出来了。没图片好看,哈哈哈。
二、ImageFilter模块
该模块返回一个使用给定滤波器处理过的图像的拷贝。在该模块中,预先定义了很多增强滤波器,可以通过filter( )函数使用,预定义滤波器见下表:BLUR、CONTOUR、DETAIL、EDGE_ENHANCE、EDGE_ENHANCE_MORE、EMBOSS、FIND_EDGES、SMOOTH、SMOOTH_MORE、SHARPEN。其中BLUR就是均值滤波,CONTOUR找轮廓,FIND_EDGES边缘检测,使用该模块时,需先导入。
滤波器 | 作用 |
---|---|
BLUR | 均值滤波 |
CONTOUR | 显示轮廓 |
DETAIL | 显示细节 |
EDGE_ENHANCE | 边缘增强 |
EDGE_ENHANCE_MORE | 边缘增强(plus) |
FIND_EDGES | 边缘检测 |
SMOOTH | 平滑效果 |
SMOOTH_MORE | 平滑效果(plus) |
SHARPEN | 锐化效果 |
GaussianBlur | 高斯模糊 |
下面来举例子运行一下。
2.1平滑效果(plus)(SMOOTH_MORE)
from PIL import Image, ImageFilter
im1 = Image.open('迪丽热巴.jpg')
img = Image.new('RGB', (im1.width*2, im1.height), 'red')
# 平滑效果处理
im2 = im1.filter(ImageFilter.SMOOTH_MORE)
# 将im1粘贴到img上
img.paste(im1, (0, 0))
img.paste(im2, (im1.width, 0))
img.show()
下面是效果图:
我们可以发现,颜色暗淡了一点。显得憔悴了。。。
2.2锐化图片(SHARPEN)
下面让我们锐化一下热巴,看看效果如何,运行代码如下:
from PIL import Image, ImageFilter
im1 = Image.open('迪丽热巴.jpg')
img = Image.new('RGB', (im1.width*2, im1.height), 'red')
# 锐化效果处理
im2 = im1.filter(ImageFilter.SHARPEN)
# 将im1粘贴到img上
img.paste(im1, (0, 0))
img.paste(im2, (im1.width, 0))
img.show()
效果图:
哇哦,变得美美哒~
2.3其他效果
按照上述代码,只要修改filter()的传入参数就可以实现不同的处理效果,下面把上述处理效果都运行一遍,运行代码如下:
from PIL import Image, ImageFilter
im1 = Image.open('迪丽热巴.jpg')
img = Image.new('RGB', (im1.width*3, im1.height*3), 'red')
# 锐化效果处理
im2 = im1.filter(ImageFilter.BLUR)
im3 = im1.filter(ImageFilter.CONTOUR)
im4 = im1.filter(ImageFilter.DETAIL)
im5 = im1.filter(ImageFilter.EDGE_ENHANCE)
im6 = im1.filter(ImageFilter.EDGE_ENHANCE_MORE)
im7 = im1.filter(ImageFilter.FIND_EDGES)
im8 = im1.filter(ImageFilter.SMOOTH)
im9 = im1.filter(ImageFilter.SHARPEN)
im10 = im1.filter(ImageFilter.GaussianBlur)
效果图如下:
哈哈哈,有的吓人,有的好看~
三、ImageChops模块
给模块提供了许多合成图片的函数,具体见下表:
- 至少一个图像必须具有模式“1”。
函数 | 公式 | 作用 |
---|---|---|
add(image1, image2, scale = 1.0, offset = 0) | out = ((image1 + image2) / scale + offset) | 添加两个图像,按比例划分结果并添加偏移量。如果省略,则缩放scale默认为1.0,偏移offset为0.0 |
add_modulo(image1, image2) | out = ((image1 + image2) % MAX) | 添加两个图像,不剪切结果 |
subtract(image1, image2, scale = 1.0, offset = 0) | out = ((image1 - image2) / scale + offset) | 减去两个图像,按比例划分结果并添加偏移量。如果省略,则缩放scale默认为1.0,偏移offset为0.0 |
subtract_modulo(image1, image2) | out = ((image1 - image2) % MAX) | 减去两个图像,不剪切结果 |
darker(image1, image2) | out= min(image1, image2) | 逐个像素地比较两个图像,并返回包含较暗值的新图像 |
lighter(image1, image2) | out= max(image1, image2) | 逐个像素地比较两个图像,并返回包含较亮值的新图像 |
difference(image1, image2) | out = abs(image1 - image2) | 返回两个图像之间逐像素差异的绝对值 |
invert(image) | out = MAX - image | 反转图像(通道),反色 |
multiply(image1, image2) | out = image1 * image2 / MAX | 将两个图像叠加在一起。如果将图像与纯黑色图像相乘,则结果为黑色。如果乘以纯白图像,则图像不受影。 |
logical_and(image1, image2) | out = ((image1 and image2) % MAX) | 两个图像之间的逻辑AND |
logical_or(image1, image2) | out = ((image1 or image2) % MAX) | 两个图像之间的逻辑或 |
logical_xor(image1, image2) | out = ((bool(image1) != bool(image2)) % MAX) | 两个图像之间的逻辑异或 |
screen(image1, image2) | out = MAX - ((MAX - image1) * (MAX - image2) / MAX) | 将两个倒置的图像叠加在一起,先反色再叠加 |
offset(image, xoffset, yoffset = None) | – | 返回图像的副本,其中数据已被给定距离偏移。数据包裹在边缘。如果省略yoffset,则假定它等于xoffset |
constant(image, value) | – | 填充具有给定灰度级的通道 |
下面我们举几个例子,看一下每一个函数的具体效果.
3.1叠加效果(multiply)
该函数的作用是将两个图像叠加在一起。
- 两张图片的大小最好相同,不然只能处理小的图片的范围
运行代码如下:
from PIL import Image, ImageChops
# 打开图像
im1 = Image.open('热巴1.jpg')
im2 = Image.open('迪丽热巴.jpg')
im1 = im1.resize((1500,900))
im2 = im2.resize((1500,900))
# 叠加效果
im = ImageChops.multiply(im1, im2)
im.show()
效果图:
效果不错的嘛,性感~
3.2反色效果(invert)
该函数的作用是反转图像(通道)。
运行代码如下:
from PIL import Image,ImageChops
im = Image.open('热巴1.jpg')
#反色效果
im = ImageChops.invert(im)
im.show()
效果图:
额,我怕不是要被打死,溜了溜了~
3.3逻辑运算
-注意: 若未将两张图片convert(‘1’),会报错!!!
3.3.1逻辑与(logical_and)
该函数的作用是,将两张图片进行逻辑与运算。
运行代码如下:
from PIL import Image, ImageChops
# 打开图像
im1 = Image.open('热巴1.jpg').convert('1') # 若未将两张图片convert('1'),logical_and会报错
im2 = Image.open('迪丽热巴.jpg').convert('1') # 若未将两张图片convert('1'),logical_and会报错
im1 = im1.resize((1500,900))
im2 = im2.resize((1500,900))
im = ImageChops.logical_and(im1, im2)
im.show()
效果图:
哇哦~
3.3.2逻辑或(logical_or)
运行代码如下:
from PIL import Image, ImageChops
# 打开图像
im1 = Image.open('热巴1.jpg').convert('1') # 若未将两张图片convert('1'),logical_or会报错
im2 = Image.open('迪丽热巴.jpg').convert('1') # 若未将两张图片convert('1'),logical_or会报错
im1 = im1.resize((1500,900))
im2 = im2.resize((1500,900))
im = ImageChops.logical_or(im1, im2)
im.show()
效果图:
3.3.3逻辑异或(logical_xor)
运行代码如下:
from PIL import Image, ImageChops
# 打开图像
im1 = Image.open('热巴1.jpg').convert('1') # 若未将两张图片convert('1'),logical_xor会报错
im2 = Image.open('迪丽热巴.jpg').convert('1') # 若未将两张图片convert('1'),logical_xor会报错
im1 = im1.resize((1500,900))
im2 = im2.resize((1500,900))
im = ImageChops.logical_xor(im1, im2)
im.show()
效果图:
3.4其他效果
把上述效果都运行一边,哈哈哈,会是什么样的呢,期待。
运行代码如下:
from PIL import Image, ImageChops
# 打开图像
im1 = Image.open('热巴1.jpg')
im2 = Image.open('迪丽热巴.jpg')
im1 = im1.resize((1500,900))
im2 = im2.resize((1500,900))
img = Image.new('RGB', (im1.width*3, im1.height*3), 'red')im3 = ImageChops.add(im1, im2)
im4 = ImageChops.subtract(im1, im2)
im5 = ImageChops.add_modulo(im1, im2)
im6 = ImageChops.subtract_modulo(im1, im2)
im7 = ImageChops.darker(im1, im2)
im8 = ImageChops.difference(im1, im2)
im9 = ImageChops.lighter(im1, im2)
im10 = ImageChops.offset(im2, 100,250)
im11 = ImageChops.screen(im1, im2)
效果图:
四、ImageColor模块
该模块主要用于将CSS3颜色值转换成RGB元组。
支持的颜色字符串如下:
- 十六进制
该模块支持标准十六进制颜色值(#rrggbb)和简写(#rgb),例如 "#ff0000"和"f00"都能得到支持 - RGB
RGB即"rgb(red,green,blue)" ,变量的取值为0-255或0-100% - HSL
H:Hue 色相,范围为0-360(red=0,green=120,blue=240)
S:Saturation 饱和度,范围为0-100% (gray=0%,full color=100%)
L:Lightness 亮度,范围为0-100% (black=0%,normal=50%,white=100%) - 通用HTML颜色名称
4.1getrgb(color)方法
传入参数color为上述支持的颜色字符串,最后返回一个rgb元组。
运行代码如下:
from PIL import ImageColor
print(ImageColor.getrgb("AliceBlue"))
print(ImageColor.getrgb("#cfff32"))
print(ImageColor.getrgb("hsl(208, 50%, 97%)"))
输出:
(240, 248, 255)
(207, 255, 50)
(244, 248, 251)
4.2getcolor(color, mode)方法
传入参数color为上述支持的颜色字符串,传入参数mode上文有解释,有表格。返回RGB元组或数字。
运行代码如下:
from PIL import ImageColor
print(ImageColor.getcolor("green","RGBA"))
print(ImageColor.getcolor("green","P"))
print(ImageColor.getcolor("green","1"))
print(ImageColor.getcolor("green","L"))
输出:
(0, 128, 0, 255)
(0, 128, 0)
75
75
五、ImageEnhance模块
ImageEnhance模块提供了一些用于图像增强的类,用于调整图像的色彩、对比度、亮度、清晰度等。
所有的增强类都实现了一个通用的接口。
包括一个方法:
enhancer.enhance(factor) ⇒ image
该方法返回一个增强过的图像。变传入参数factor是一个浮点数,控制图像的增强程度。变量factor为1将返回原始图像的拷贝;factor值越小,颜色越少(亮度,对比度等)。
各个获取色彩调整器的函数如下表:
函数 | 作用 |
---|---|
Color(image) | 获取色度调整器 |
Brightness(image) | 获取亮度调整器 |
Contrast(image) | 获取对比度调整器 |
Sharpness(image) | 获取锐度调整器 |
下面让我们运行一下
5.1更改色调(Color)
运行代码如下:
from PIL import Image, ImageEnhance
im1 = Image.open("迪丽热巴.jpg")
# 获取色度调整器
enhance_im1 = ImageEnhance.Color(im1)
# 减弱颜色
im2 = enhance_im1.enhance(0.5)
# 增强颜色
im3 = enhance_im1.enhance(1.5)
#存储图片
a,b = im1.size
img = Image.new("RGB", (a*3, b))
# 将减弱的图片放在最左边
img.paste(im2, (0, 0))
# 将原图放在中间
img.paste(im1, (a, 0))
# 将增强后的图片放在最右边
img.paste(im3, (a*2, 0))
img.show()
效果图:
5.2其他调整器
运行代码如下:
from PIL import Image, ImageEnhance
# 打开im1
im1 = Image.open("迪丽热巴.jpg")# 获取其他调整器
enhance_im1 = ImageEnhance.Contrast(im1)#对比度
enhance_im2 = ImageEnhance.Brightness(im1)#亮度
enhance_im3 = ImageEnhance.Sharpness(im1)#锐度
# 减弱属性
im1_1 = enhance_im1.enhance(0.5)
im2_1 = enhance_im2.enhance(0.5)
im3_1 = enhance_im3.enhance(0.5)
# 增强属性
im1_2= enhance_im1.enhance(1.5)
im2_1 = enhance_im2.enhance(1.5)
im3_1 = enhance_im3.enhance(1.5)
效果图:
哇哦~~~~嘿嘿
六、ImageOps模块
该模块包含了一些“ready-made”的图像处理操作,大多数操作只工作在L和RGB图像上。
下面我们列表看一下其主要函数:
函数 | 作用 |
---|---|
autocontrast(image, cutoff=0) | 最大图像对比度 |
colorize(image, black, white) | 使得灰色图像变成彩色图像 |
flip(image) | 输出图像为输入图像在垂直方向的镜像 |
grayscale(image) | 将输入图像转换为灰色图像 |
mirror(image) | 输出图像为输入图像水平方向的镜像 |
posterize(image,bits) | 将每个颜色通道上变量bits对应的低(8-bits)个bit置0,变量bits的取值范围为[0,8] |
solarize(image,threshold=128) | 在指定的阈值范围内,反转所有的像素点 |
下面我们举几个例子运行一下
6.1autocontrast(image, cutoff=0)方法
该函数计算一个输入图像的直方图,从这个直方图中去除最亮和最暗的百分之cutoff,然后重新映射图像,以便保留的最暗像素变为黑色(即0),最亮的变为白色(即255)。
运行代码如下:
from PIL import Image, ImageOps
im = Image.open("迪丽热巴.jpg")
im = ImageOps.autocontrast(im, 20)
im.show()
效果图:
我是想了又想才决定拿出来的,希望大家在半夜看的时候。。。刺激(异域风情,摇摆至上~)
6.2solarize(image,threshold=128)方法
该函数的作用是在指定的阈值范围内,反转所有的像素点。
运行代码如下:
from PIL import Image, ImageOps
im = Image.open("迪丽热巴.jpg")
im= ImageOps.solarize(im, 100)
im.show()
效果图:
我怕不是要被我的热巴打死~
6.3colorize(image, black, white)方法
该函数的作用是使得灰色图像变成彩色图像。变量black和white应该是RGB元组或者颜色名称。这个函数会计算出一个颜色值,使得源图像中的所有黑色变成第一种颜色,所有白色变成第二种颜色。
- 变量image的模式必须为“L”。
运行代码如下:
from PIL import Image, ImageOps
im = Image.open("迪丽热巴.jpg")
r,g,b = im.split()
im_r = ImageOps.colorize(r, "green", "blue")
im_b = ImageOps.colorize(b, (255, 0, 0), (0, 255, 0))
im_g = ImageOps.colorize(g, (255, 0, 0), "blue")
效果图:
再不放这张图了~
6.4其他方法
我就不写了,都是直接调用就行,不敢再用这个模块处理热巴了,害怕她来找我~
七、ImageDraw模块
该模块提供了图像对象的简单2D绘制。我们可以使用这个模块创建新的图像,或者注释或润饰已存在图像,为web应用实时产生各种图形。
7.1绘制简单图形
- 注意:首先要获取ImageDraw.Draw对象
drawer = ImageDraw.Draw(im)
1.7.1绘制点
point(xy, fill)
其中:
- xy:点的坐标
- fill:填充色。如"red"等
运行代码入下:
from PIL import Image, ImageDraw
# 创建一个300*300的白色图片
im = Image.new("RGB", (300, 300), "black")
# 获取ImageDraw.Draw对象
drawer = ImageDraw.Draw(im)
#绘制点
drawer.point((100, 100), fill='white')
im.show()
效果图:
好难发现啊
7.1.2绘制直线
line(xy, fill, width, joint)
其中:
- xy:起点坐标和终点坐标(x1, y1, x2, y2)
- fill:填充色
- width:轮廓粗细
- joint:连接方式,可以是曲线
运行代码如下:
from PIL import Image, ImageDraw
# 创建一个300*300的白色图片
im = Image.new("RGB", (300, 300), "white")
# 获取ImageDraw.Draw对象
drawer = ImageDraw.Draw(im)
# 绘制直线
drawer.line((50, 50, 150, 150), fill='red',width=2)
im.show()
效果图:
7.1.3绘制圆弧
arc(xy, start, end, fill, width)
其中
- xy:包含圆弧所在圆的矩形的左上角坐标和右下角坐标(x1, y1, x2, y2)
- start:起始角度
- end:终止角度
- fill:填充色
- width:轮廓粗细
运行代码如下:
from PIL import Image, ImageDraw
im = Image.new("RGB", (300, 300), "white")
drawer = ImageDraw.Draw(im)
# 绘制圆弧
drawer.arc((50, 50, 200, 200), start=0, end=90, fill='red', width=4)
im.show()
效果图:
7.1.4绘制矩形
rectangle(xy, fill, outline, width)
其中:
- xy:左上角坐标和右下角坐标(x1, y1, x2, y2)
- fill:填充色
- outline:轮廓色。同上
- width:轮廓粗细
运行代码如下:
from PIL import Image, ImageDraw
im = Image.new("RGB", (300, 300), "white")
drawer = ImageDraw.Draw(im)
# 绘制矩形
drawer.rectangle((50, 50, 200, 200), fill='white', outline='red', width=3)
im.show()
效果图:
7.1.5绘制椭圆
ellipse(xy, fill, outline, width)
其中:
- xy:包含椭圆(或圆)的矩形的左上角坐标和右下角坐标(x1, y1, x2, y2)
- fill:填充色
- outline:轮廓颜色
- width:轮廓粗细
运行代码如下:
from PIL import Image, ImageDraw
im = Image.new("RGB", (300, 300), "white")
drawer = ImageDraw.Draw(im)
# 绘制椭圆
drawer.ellipse((50,50,200,300),fill='white', outline='red', width=3)
im.show()
效果图:
- 注意:外切矩形为正方形时椭圆即为圆
7.1.6绘制扇形
pieslice(xy, start, end, fill, outline, width)
其中:
- xy:扇形所在椭圆的矩形的左上角坐标和右下角坐标(x1, y1, x2, y2)
- start:开始角度
- end:终点角度
- fill:填充色
- outline:轮廓颜色
- width:轮廓粗细
运行代码如下:
from PIL import Image, ImageDraw
im = Image.new("RGB", (300, 300), "white")
drawer = ImageDraw.Draw(im)
# 绘制扇形
drawer.pieslice((50, 50, 150, 150), 0, 90, 'pink', 'red',1)
im.show()
效果图:
7.1.7绘制多边形
pieslice(xy, fill, outline)
其中:
- xy:多边形各个点坐标的元组/列表(x1, y1, x2, y2)
- fill:填充色
- outline:轮廓颜色
运行代码如下:
from PIL import Image, ImageDraw
im = Image.new("RGB", (300, 300), "white")
drawer = ImageDraw.Draw(im)
# 绘制多边形
drawer.polygon((50, 50, 150, 150, 150, 200, 200, 250, 50, 50), 'pink','red')
im.show()
效果图:
7.1.8绘制弦
chord(xy, start, end, fill, outline, width)
其中:
- xy:弦所在椭圆的矩形的左上角坐标和右下角坐标(x1, y1, x2, y2)
- start:开始角度
- end:终点角度
- fill:填充色
- outline:轮廓颜色
- width:轮廓粗细
from PIL import Image, ImageDraw
im = Image.new("RGB", (300, 300), "white")
drawer = ImageDraw.Draw(im)
#绘制弦
drawer.chord((50, 50, 150, 150),start=0, end=90, fill='yellow', outline='red', width=3)
im.show()
效果图:
7.2绘制文本
- 注意:运行该函数绘制中文时,我们先得给他设定一个支持中文的字体。(在C:/Windows/Fonts目录下找到字体文件)可参考下表:
字体 | 文件名 | 字体 | 文件名 |
---|---|---|---|
宋体 | SIMSUN.TTF/simsunb.ttf | 黑体 | simhei.ttf |
仿宋 | simfang.ttf | 楷体 | simkai.tt |
方正舒体 | FZSTK.TTF | 方正姚体 | FZYTK.TTF |
隶书 | SIMLI.TTF | 华文彩云 | STCAIYUN.TTF |
华文细黑 | STXIHEI.TTF | 华文行楷 | STXINGKAI.TTF |
华文新魏 | STXINWEI.TTF | 华文中宋 | STZHONGS.TTF |
幼圆 | SIMYOU.TTF | 华文琥珀 | STHUPO.TTF |
华文楷体 | STKAITI.TTF | 华文隶书 | STLITI.TTF |
华文宋体 | STSONG.TTF | 新宋体 | NSIMSUN.TTF |
text(xy, text,font, fill)
其中:
- xy:起点坐标
- text:绘制的文本
- fill:填充色
- font:字体
- 等等其它参数
运行代码如下:
from PIL import Image, ImageDraw, ImageFont
im = Image.new("RGB", (300, 300), "white")
drawer = ImageDraw.Draw(im)
# 获取字体对象
imFont = ImageFont.truetype('simfang.ttf', 24)
# 绘制文本
drawer.text((50, 100),text="是迪丽热巴啊!",font=imFont,fill="pink")
im.show()
效果图;
终于完事了,花了好长时间,脖子特酸爽,整理不易,希望能帮助到大家!
Python之基础详解(十一):PTL各模块讲解:Image、ImageFilter、ImageChops、ImageColor、ImageEnhance、ImageOps、ImageDraw相关推荐
- python发邮件详解 -- smtplib和email模块
文章目录 python发邮件详解,-->smtplib和email模块 1.python发邮件所需要的基础包 2.smtplib的用法 3.email模块的详细理解和使用 A.MIMEText对 ...
- Python之基础详解(八):必备,以制作交易收盘价走趋图为例,来可视化处理json格式的文件
在这里,我们将会用json模块来处理json格式文件.Pygal提供了一个适合初学者使用的绘图工具,我们在这里将使用它来对收盘价数据进行可视化,以帮助我们掌握基础技能.(本文所需要的文件都在资源中,记 ...
- Python零基础详解--商品详情、关键词搜索api
为了进行此平台API的调用,首先我们需要做下面几件事情. 1. 获取一个KEY. 2. 参考API文档里的接入方式和示例. 3.查看测试工具是否有需要的接口,响应实例的返回字段是否符合参数要求. 4. ...
- Python之基础详解(十二):进阶,用pyecharts绘制世界地图、玫瑰图、雷达图
我之前发过一篇博文基本讲解了基本绘制地图的方法. 我这里打算直接调用api来创建实时动态地图,并且分析数据绘制了玫瑰图,雷达图. 步骤 配套资源下载: 第一步:配置环境 第二步:爬取数据 第三步:创建 ...
- Python之基础详解(十):用python的pyecharts模块绘制世界地图(疫情)
pyecharts可视化疫情确诊人数世界地图 首先,我们需要进行环境的配置:python版本需要3.6.x ,pyecharts版本1.x 使用pip自动安装最新版本(这里的版本是1.7.1) 记得下 ...
- python装饰器详解-如何更通俗地讲解Python的装饰器?
我从以下几点,由浅入深详细讲解一下Python装饰器:什么是装饰器? 为什么用装饰器? 在哪里用装饰器? 然后以示例+讲解相结合的方式阐述,同时会讲解一些在很多教程和书籍中不会涉及到的内容. 什么是P ...
- python语言编程基础-Python语言入门详解!快速学成Python!
原标题:Python语言入门详解!快速学成Python! 很多技能是被职场所需要的,但很可惜... 这些技能在大学中并学习不到. 大学和职场现实存在的横沟对大部分同学来说难以跨越或碰得头破血流... ...
- Python学习二:词典基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...
- Python字符编码详解
Python字符编码详解 转自http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html Python字符编码详解 本文简单介绍了各种常用的 ...
最新文章
- 乱码 转ios_王者荣耀:无法转区怎么办?3分钟教你解决检测异常,iOS也有艾琳了!...
- 浏览器地址栏运行HTML代码(谷歌)
- Oracle 11G R2 RAC中的scan ip 的用途和基本原理【转】
- 自考计算机原理知识点,09年自考计算机网络实用技术知识点:ATM原理
- Java中获取当前函数名
- 【ES9(2018)】String 扩展 标签模板里字符串转义
- 网页设计图片向上浮动_果冻公开课第六课:5分钟理解浮动布局
- 基于JAVA+SpringMVC+Mybatis+MYSQL的个人记账管理系统
- Linux Bash Shell字符串抽取、按列合并和格式化输出
- NSLocale中常用的语言代码对照表
- openwrt使用tayga/totd实现NAT64/DNS64
- 湿敏电阻CM-R / HR202应用 原理图 IO输出交流 AD采样
- hdu 4699 模拟栈
- Bloodsucker ZOJ - 3551
- Django web开发(一) - 前端
- e.pageX、e.clientX、e.screenX、e.offsetX的区别以及元素的一些CSS属性
- 基于JSP的班级聚会网站
- unity GetComponent使用
- Linux性能优化:性能优化工具
- Alpha 测试与 Beta 测试:有什么区别?