Python图像处理库PIL的Image模块介绍
(Image模块方法16-25)
16、 Paste
定义1:im.paste(image,box)
含义1:将一张图粘贴到另一张图像上。变量box或者是一个给定左上角的2元组,或者是定义了左,上,右和下像素坐标的4元组,或者为空(与(0,0)一样)。如果给定4元组,被粘贴的图像的尺寸必须与区域尺寸一样。
如果模式不匹配,被粘贴的图像将被转换为当前图像的模式。
例子1:
>>>from PIL import Image
>>> im01= Image.open(“D:\\Code\\Python\\test\\img\\test01.jpg”)
>>>box=[0,0,100,100]
>>>im_crop = im01.crop(box)
>>>im_crop.size
(100, 100)
>>>im_crop.mode
‘RGB’
>>>im01.paste(im_crop, (200,200))
>>>im01.paste(im_crop, (500,500,600,600))
>>>im01.show()
我们先从图像im01中裁剪出一个100x100的图像,它的模式与im01一样都是“RGB”。然后通过2元组和4元组的方式,将裁剪出来的图像粘贴到图像im01上。在图像im01的(200,200)和(500,500)两个位置分别出现了裁剪出来的100x100的图像。其结果如下图所示:
定义2:im.paste(colour,box)
含义2:它与定义1一样,但是它使用同一种颜色填充变量box对应的区域。对于单通道图像,变量colour为单个颜色值;对于多通道,则为一个元组。
例子2:
>>> im01= Image.open(“D:\\Code\\Python\\test\\img\\test01.jpg”)
>>> im01.paste((0,256,0),(0,0,100,100))
图像im01的(0,0)位置将出现一个100x100的绿色方块。
>>> im01.paste(255,(0,0,100,100))
图像im01的(0,0)位置将出现一个100x100的红色方块。对于多通道的图像,如果变量colour只给定一个数值,将只会应用于图像的第一个通道。如果是“RGB”模式的图像,将应用于红色通道。
定义3:im.paste(image,box, mask)
含义3:与定义1一样,但是它使用变量mask对应的模板图像来填充所对应的区域。可以使用模式为“1”、“L”或者“RGBA”的图像作为模板图像。模板图像的尺寸必须与变量image对应的图像尺寸一致。如果变量mask对应图像的值为255,则模板图像的值直接被拷贝过来;如果变量mask对应图像的值为0,则保持当前图像的原始值。变量mask对应图像的其他值,将对两张图像的值进行透明融合。
注意:如果变量image对应的为“RGBA”图像,即粘贴的图像模式为“RGBA”,则alpha通道被忽略。用户可以使用同样的图像作为原图像和模板图像。
例子3:
>>> im01 =Image.open(“D:\\Code\\Python\\test\\img\\test01.jpg”)
>>> box =[500,500,600,600]
>>> im_crop =im01.crop(box)
>>> r,g,b =im_crop.split()
>>>im01.paste(im_crop, (0,0,100,100), r)
>>> im01.show()
在图像im01的(0,0)位置将出现一个半透明的100x100的方块。
定义4:im.paste(colour,box, mask)
含义4:与定义3一样,只是使用变量colour对应的单色来填充区域。
例子4:
>>> im01 =Image.open(“D:\\Code\\Python\\test\\img\\test01.jpg”)
>>> box= [500,500,600,600]
>>>im_crop = im01.crop(box)
>>>r,g,b = im_crop.split()
>>>im01.paste((0,256,0), (0,0,100,100), r)
>>>im01.show()
在图像im01的(0,0)位置将出现一个100x100的绿色方块。
17、 Point
定义1:im.point(table)⇒ image
im.point(function) ⇒ image
含义1:返回给定查找表对应的图像像素值的拷贝。变量table为图像的每个通道设置256个值。如果使用变量function,其对应函数应该有一个参数。这个函数将对每个像素值使用一次,结果表格将应用于图像的所有通道。
如果图像的模式为“I(整数)”或者“F(浮点)”,用户必须使用function方式,function必须按照下面的格式:
argument * scale+ offset
例如:
out = im.point(lambda i: i * 1.2 + 10)
用户可以省略变量scale和offset。
例子1:
>>> im01 = Image.open(“D:\\Code\\Python\\test\\img\\test01.jpg”)
>>>im_point_fun = im01.point(lambda i:i*1.2+10)
>>>im_point_fun.show()
图像im_point_fun比原图im01亮度增加了很多;因为lambda表达式中对原图的每个像素点的值都做了增加操作。
Lambda表达式是python中可以替代简单函数的一种方式,它只能封装有限的逻辑,但是对于某些情况,使用起来还是很方便的。
定义lambda函数的形式如下:labmda参数:表达式lambda函数默认返回表达式的值。你也可以将其赋值给一个变量。lambda函数可以接受任意个参数,包括可选参数,但是表达式只有一个。
Lambda表达式的例子:
>>>range(10)
[0, 1, 2, 3, 4,5, 6, 7, 8, 9]
如果我们要对这10个数字,逐个做加一操作,可以使用如下表达式:
>>>map(lambda x:x+1, [y for y in range(10)])
[1, 2, 3, 4, 5,6, 7, 8, 9, 10]
函数map()是python的内置函数,其格式如下:
map( func,seq1[, seq2…]
Python函数式编程中的map()函数是将func作用于seq中的每一个元素,并用一个列表给出返回值。如果func为None,作用同zip()。
当seq只有一个时,将func函数作用于这个seq的每个元素上,得到一个新的seq。
例如:
>>>map(lambda x:x+10, range(10))
[10, 11, 12, 13,14, 15, 16, 17, 18, 19]
当seq多于一个时,map可以并行地对每个seq执行。每个seq的同一位置的元素在执行过一个多元的func函数之后,得到一个返回值,这些返回值放在一个结果列表中。需要注意的是,不同长度的多个seq是无法执行map函数的,会出现类型错误。
例如:
>>>map(lambda x,y:x+y, [1,2,3],[4,5,6])
[5, 7, 9]
func是None的情况,它的目的是将多个列表相同位置的元素归并到一个元组,在现在已经有了专用的函数zip()了。
例如:
>>>map(None, [1,2,3],[4,5,6])
[(1, 4), (2, 5),(3, 6)]
>>>zip([1,2,3],[4,5,6])
[(1, 4), (2, 5),(3, 6)]
zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。利用*号操作符,可以将list unzip(解压)。
例如:
>>> a =[1,2,3]
>>> b =[2,3,4]
>>> b =[4,5,6]
>>> c =[4,5,6,7,8]
>>>zipped = zip(a,b)
>>>zipped
[(1, 4), (2, 5),(3, 6)]
>>>zip(a,c)
[(1, 4), (2, 5),(3, 6)]
>>>zip(*zipped)
[(1, 2, 3), (4,5, 6)]
定义2:im.point(table,mode) ⇒ image
im.point(function, mode) ⇒ image
含义2:与定义1一样,但是它会为输出图像指定一个新的模式。这个方法可以一步将模式为“L”和“P”的图像转换为模式为“1”的图像。
(New in 1.1.5)这个方法也可以将“L”图像转换为“I”和“F”模式,或者将16 位的“I”模式图像转换为“L”模式,此时必须使用65536项的查找表。
例子2:
>>> im01 =Image.open(“D:\\Code\\Python\\test\\img\\test01.jpg”)
>>>r,g,b = im01.split()
>>>r.mode
‘L’
>>> im= r.point(lambda x:x*1.3+5, “1”)
>>>im.show()
>>>im.getpixel((0,0))
19
图像im为全白图;
>>> im= r.point(lambda x:1, “1”)
>>>im.show()
>>>im.getpixel((0,0))
1
图像im为全白图;
>>> im= r.point(lambda x:x*0, “1”)
>>>im.show()
>>> im.getpixel((0,0))
0
图像im为全黑图;
18、 Putalpha
定义:im.putalpha(band)
含义:将给定的通道拷贝到图像的alpha层。此处的图像模式必须为“RGBA”,变量band必须为“L”或者“1”。
(New in PIL 1.1.5)方法putalpha()也可以用于其他模式;图像原地转换为有alpha通道的模式(通常转换为“LA”或者“RGBA”)。变量band要么为图像,要么为颜色值(一个整数)。
例子:
>>> im01 =Image.open(“D:\\Code\\Python\\test\\img\\test01.jpg”)
>>>im01.mode
‘RGB’
>>>im01.putalpha(100)
‘RGBA’
>>>im01.getpixel((0,0))
(11, 113, 198,100)
19、 Putdata
定义:im.putdata(data)
im.putdata(data, scale, offset)
含义:从sequence对象中拷贝数据到当前图像,从图像的左上角(0,0)位置开始。变量scale和offset用来调整sequence中的值:
pixel = value *scale + offset
如果变量scale忽略,则默认为1.0。如果变量offset忽略,则默认为0.0。
例子:
>>> im01 =Image.open(“D:\\Code\\Python\\test\\img\\test01.jpg”)
>>> r,g,b =im01.split()
>>>r.getpixel((0,0))
11
>>>r.getpixel((1,0))
10
>>>r.getpixel((2,0))
9
>>>r.getpixel((3,0))
6
>>>r.putdata([1,2,3,4])
>>>r.getpixel((0,0))
1
>>>r.getpixel((1,0))
2
>>>r.getpixel((2,0))
3
>>>r.getpixel((3,0))
4
20、 Putpalette
定义:im.putpalette(sequence)
含义:为“P”或者“L”图像增加一个调色板。对于“L”图像,它的模式将变化为“P”。调色板序列需要包含768项整数,每组三个值表示对应像素的红,绿和蓝。用户可以使用768个byte的字符串代替这个整数序列。
例子:
>>> im01 =Image.open(“D:\\Code\\Python\\test\\img\\test01.jpg”)
>>>r,g,b = im01.split()
>>>r.mode
‘L’
>>>r.putpalette([1,2,3])
>>> r.mode
‘P’
21、 Putpixel
定义:im.putpixel(xy,colour)
含义:修改指定位置上的像素值。对于单通道图像,变量colour为一个数值;对于多通道图像,变量colour为一个元组。
注意:这个方法执行比较慢。如果是1.1.6版本,像素访问对象(参考load方法)提供了一个更快的方法修改图像。如果用户要生成整幅图像,可以使用更有效的方法产生一个python list,然后使用方法putdata()将它拷贝到图像上去。对于更大的改变,使用方法paste或者ImageDraw模块。
例子:
>>> im01 =Image.open(“D:\\Code\\Python\\test\\img\\test01.jpg”)
>>>im01.getpixel((0,0))
(11, 113, 198)
>>>im01.putpixel((0,0),(1,2,3))
>>>im01.getpixel((0,0))
(1, 2, 3)
22、 Quantize
定义:im.quantize(colors,**options) ⇒ image
含义:(不赞成)使用给定的颜色将“L”或者“RGB”图像转换为“P”图像,返回新的图像。
新的代码中,使用有自适应的调色板的convert方法来代替:
out =im.convert(“P”, palette=Image.ADAPTIVE,colors=256)
例子:
23、 Resize
定义:im.resize(size) ⇒ image
im.resize(size, filter) ⇒ image
含义:返回改变尺寸的图像的拷贝。变量size是所要求的尺寸,是一个二元组:(width, height)。
变量filter为NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果忽略,或者图像模式为“1”或者“P”,该变量设置为NEAREST。
注意:在当前的版本中bilinear和bicubic滤波器不能很好地适应大比例的下采样(例如生成缩略图)。用户需要使用ANTIALIAS,除非速度比质量更重要。
例子:
>>> im01 =Image.open(“D:\\Code\\Python\\test\\img\\test01.jpg”)
>>>im01.size
(1024, 768)
>>> im= im01.resize((512, 384))
>>>im.size
(512, 384)
24、 Rotate
定义:im.rotate(angle) ⇒ image
im.rotate(angle,filter=NEAREST, expand=0) ⇒ image
含义:返回一个按照给定角度顺时钟围绕图像中心旋转后的图像拷贝。
变量filter应该是NEAREST、BILINEAR或者BICUBIC之一。如果省略该变量,或者图像模式为“1”或者“P”,则默认为NEAREST。
变量expand,如果为true,表示输出图像足够大,可以装载旋转后的图像。如果为false或者缺省,则输出图像与输入图像尺寸一样大。
例子:
>>> im01 =Image.open(“D:\\Code\\Python\\test\\img\\test01.jpg”)
>>> im01.size
(1024, 768)
>>>im_30 = im01.rotate(30)
>>>im_30.size
(1024, 768)
>>>im_30_1 = im01.rotate(30, Image.BICUBIC,1)
>>>im_30_1.size
(1271, 1178)
图像im_30如下:
图像im_30_1如下:
25、 Save
定义:im.save(outfile,options…)
im.save(outfile, format, options…)
含义:使用给定的文件名保存图像。如果变量format缺省,如果可能的话,则从文件名称的扩展名判断文件的格式。该方法返回为空。
关键字options为文件编写器提供一些额外的指令。如果编写器不能识别某个选项,它将忽略它。
用户可以使用文件对象代替文件名称。在这种情况下,用户必须指定文件格式。文件对象必须实现了seek()、tell()和write()方法,且其以二进制模式打开。
如果方法save()因为某些原因失败,这个方法将产生一个异常(通常为IOError异常)。如果发生了异常,该方法也有可能已经创建了文件,并向文件写入了一些数据。如果需要的话,用户的应用程序可以删除这个不完整的文件。
例子:
>>> im01 =Image.open(“D:\\Code\\Python\\test\\img\\test01.jpg”)
>>>im01.size
(1024, 768)
>>>im_30 = im01.rotate(30)
>>>im_30.save(“D:\\Code\\Python\\test\\img\\test_rotate_30.jpg”)
(未完待续)
转载自 [Python图像处理库PIL的Image模块介绍(四)](https://blog.****.net/icamera0/article/details/50706615)