Python图像处理库PIL的Image模块介绍(四)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/icamera0/article/details/50706615

(Image模块方法16-25)

16、  Paste

定义1im.paste(image,box)

含义1:将一张图粘贴到另一张图像上。变量box或者是一个给定左上角的2元组,或者是定义了左,上,右和下像素坐标的4元组,或者为空(与(00)一样)。如果给定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的(200200)和(500500)两个位置分别出现了裁剪出来的100x100的图像。其结果如下图所示:

                             

定义2im.paste(colour,box)

含义2:它与定义1一样,但是它使用同一种颜色填充变量box对应的区域。对于单通道图像,变量colour为单个颜色值;对于多通道,则为一个元组。

例子2

>>>from PIL import Image

>>> im01= Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

 

>>> im01.paste((0,256,0),(0,0,100,100))

图像im01的(00)位置将出现一个100x100的绿色方块。

 

>>> im01.paste(255,(0,0,100,100))

图像im01的(00)位置将出现一个100x100的红色方块。对于多通道的图像,如果变量colour只给定一个数值,将只会应用于图像的第一个通道。如果是“RGB”模式的图像,将应用于红色通道。

定义3im.paste(image,box, mask)

含义3:与定义1一样,但是它使用变量mask对应的模板图像来填充所对应的区域。可以使用模式为“1”、“L”或者“RGBA”的图像作为模板图像。模板图像的尺寸必须与变量image对应的图像尺寸一致。如果变量mask对应图像的值为255,则模板图像的值直接被拷贝过来;如果变量mask对应图像的值为0,则保持当前图像的原始值。变量mask对应图像的其他值,将对两张图像的值进行透明融合。

注意:如果变量image对应的为“RGBA”图像,即粘贴的图像模式为“RGBA”,则alpha通道被忽略。用户可以使用同样的图像作为原图像和模板图像。

例子3

>>>from PIL import Image

>>> 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的(00)位置将出现一个半透明的100x100的方块。

定义4im.paste(colour,box, mask)

含义4:与定义3一样,只是使用变量colour对应的单色来填充区域。

例子4

>>>from PIL import Image

>>> 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的(00)位置将出现一个100x100的绿色方块。

17、  Point

定义1im.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)

用户可以省略变量scaleoffset

例子1

>>>from PIL import Image

>>> 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中的每一个元素,并用一个列表给出返回值。如果funcNone,作用同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]

funcNone的情况,它的目的是将多个列表相同位置的元素归并到一个元组,在现在已经有了专用的函数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)]

 

定义2im.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

>>>from PIL import Image

>>> 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要么为图像,要么为颜色值(一个整数)。

例子:

>>>from PIL import Image

>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

 

>>>im01.mode

'RGB'

>>>im01.putalpha(100)

>>>im01.mode

'RGBA'

 

>>>im01.getpixel((0,0))

(11, 113, 198,100)

19、  Putdata

定义:im.putdata(data)

  im.putdata(data, scale, offset)

含义:从sequence对象中拷贝数据到当前图像,从图像的左上角(00)位置开始。变量scaleoffset用来调整sequence中的值:

pixel = value *scale + offset

如果变量scale忽略,则默认为1.0。如果变量offset忽略,则默认为0.0

例子:

>>>from PIL import Image

>>> 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项整数,每组三个值表示对应像素的红,绿和蓝。用户可以使用768byte的字符串代替这个整数序列。

例子:

>>>from PIL import Image

>>> 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模块。

例子:

>>>from PIL import Image

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

变量filterNEARESTBILINEARBICUBIC或者ANTIALIAS之一。如果忽略,或者图像模式为“1”或者“P”,该变量设置为NEAREST

注意:在当前的版本中bilinearbicubic滤波器不能很好地适应大比例的下采样(例如生成缩略图)。用户需要使用ANTIALIAS,除非速度比质量更重要。

例子:

>>>from PIL import Image

>>> 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应该是NEARESTBILINEAR或者BICUBIC之一。如果省略该变量,或者图像模式为“1”或者“P”,则默认为NEAREST

变量expand,如果为true,表示输出图像足够大,可以装载旋转后的图像。如果为false或者缺省,则输出图像与输入图像尺寸一样大。

例子:

>>>from PIL import Image

>>> 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异常)。如果发生了异常,该方法也有可能已经创建了文件,并向文件写入了一些数据。如果需要的话,用户的应用程序可以删除这个不完整的文件。

例子:

>>>from PIL import Image

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

(未完待续)

展开阅读全文

没有更多推荐了,返回首页