Pillow 方法、属性
Image类的属性:1、Format 2、Mode 3、Size 4、Palette 5、Info
类的函数:1、New 2、Open 3、Blend 4、Composite 5、Eval 6、Frombuffer 7、Fromstring 8、Merge
Image类的方法:1、Convert 2、Copy 3、Crop 4、Draft 5、Filter 6、Fromstring 7、Getbands 8、Getbbox 9、Getcolors 10、Getdata 1 1、 Getextrema 12、Getpixel 13、Histogram 14、Load 15、Paste
Image 类
Pillow的坐标系原点:图像的左上角为 (0, 0) , X轴是从左到右增长的,而Y轴是从上到下增长。
坐标系表示:矩形元组参数,(左,顶,右,底),可以理解为[左, 右)和[顶, 底)这样左闭右开的区间。
比如(3, 2, 8, 9)就表示了横坐标范围[3, 7];纵坐标范围[2, 8]的矩形区域。
format:图片格式
size:返回图片的宽高
mode:返回图片的模式
show():显示图片
save(img_path, mode):保存图片
crop(left, upper, right, lower):从图片中提取一个子矩形,返回一个新Image对象
resize((width, height)): 返回新Image
copy(): 复制图片,不影响原图
paste(): 粘贴覆盖,在调用原图上直接修改
resize():
rotate(): 返回新Image , 逆时针旋转
transform():
transpose(): 图像的镜面翻转,返回新Imagetranspose(Image.FLIP_LEFT_RIGHT): 水平翻转
transpose(Image.FLIP_TOP_BOTTOM): 垂直翻转
transpose(Image.ROTATE_90)
convert(): ‘L’ , ‘RGB’, ‘CMYK’
getbands(): 获取图像通道名称
point(): 对图像中的像素点进行处理(例如对比度操作)
split(): 通过通道分割图像,返回元祖,元素是分割后单个通道的图像
getchannel(): 可以获取单个通道的图片,R,G,B
getpixel((x, y)): 获取单个像素位置的RGB值,返回元祖
load(): 加载图片所有的数据,通过指定坐标索引 [x,y] 获取RGB值
getdata(): 获取全部像素的值,生成器对象
R,G,B = img.split()
R = img.getchannel('R')
pixdata = img.load()
pixdata[100,200] = 255
list(img.getdata(0))
函数
-
Image.new(mode, size, color)
使用给定的变量mode和size生成新的图像。Size是给定的宽/高二元组,这是按照像素数来计算的。对于单通道图像,变量color只给定一个值;对于多通道图像,变量color给定一个元组(每个通道对应一个值)。
Image.new(“RGB”, (128, 128), “red”) #图像im为128x128大小的红色图像。 -
Image.blend(image1,image2, alpha)
使用给定的两张图像及透明度变量alpha,插值出一张新的图像。这两张图像必须有一样的尺寸和模式。
合成公式为:out = image1 *(1.0 - alpha) + image2 * alpha
如果变量alpha为0.0,将返回第一张图像的拷贝。如果变量alpha为1.0,将返回第二张图像的拷贝。对变量alpha的值没有限制。
Image.blend(im1,im2,0.5) -
Image.composite(image1,image2, mask)
使用给定的两张图像及mask图像作为透明度,插值出一张新的图像。变量mask图像的模式可以为“1”,“L”或者“RGBA”。所有图像必须有相同的尺寸。
-
Image.eval(image,function)
使用变量function对应的函数(该函数应该有一个参数)处理变量image所代表图像中的每一个像素点。如果变量image所代表图像有多个通道,那变量function对应的函数作用于每一个通道。
注意:变量function对每个像素只处理一次,所以不能使用随机组件和其他生成器。
from PIL import Image
im = Image.open(“jing.jpg”)
def deffun©:
return c*0.89 #改变了亮度
im_eval = Image.eval(im,deffun) -
Image.merge(mode,bands)
使用一些单通道图像,创建一个新的图像。变量bands为一个图像的元组或者列表,每个通道的模式由变量mode描述。所有通道必须有相同的尺寸。
im1 = Image.open(“jing.jpg”)
im2 = Image.open(“wu.jpg”)
r1,g1,b1 = im1.split()
r2,g2,b2 = im2.split()
imgs =[r1,g2,b2]
im_merge = Image.merge(“RGB”,imgs)
类方法
-
im.convert(mode,matrix)
将当前图像转换为其他模式,并且返回新的图像。
-
im.copy()
拷贝这个图像。如果用户想粘贴一些数据到这张图,可以使用这个方法,但是原始图像不会受到影响。
-
im.crop(box)
从当前的图像中返回一个矩形区域的拷贝。变量box是一个四元组,定义了左、上、右和下的像素坐标。
对源图像的改变可能或者可能不体现在裁减下来的图像中。为了获取一个分离的拷贝,对裁剪的拷贝调用方法load()。 -
im.filter(filter)
返回一个使用给定滤波器处理过的图像的拷贝。可用滤波器需要参考ImageFilter模块。
-
im.histogram()
返回一个图像的直方图。这个直方图是关于像素数量的list,图像中的每个象素值对应一个成员。如果图像有多个通道,所有通道的直方图会连接起来(例如,“RGB”图像的直方图有768个值)。
二值图像(模式为“1”)当作灰度图像(模式为“L”)处理。 -
im.load()
为图像分配内存并从文件中加载它
-
im.paste(image,box)
将一张图粘贴到另一张图像上。变量box或者是一个给定左上角的2元组,或者是定义了左,上,右和下像素坐标的4元组,或者为空(与(0,0)一样)。如果给定4元组,被粘贴的图像的尺寸必须与区域尺寸一样。
如果模式不匹配,被粘贴的图像将被转换为当前图像的模式。>例子1: from PIL import Image im1 = Image.open("jing.jpg") box = [0,0,200,200] im_crop = im1.crop(box) im1.paste(im_crop,(200,200,400,400)) #等价于im1.paste(im_crop,(200,200)) im1.save("he.jpg") >定义2:im.paste(colour,box) 含义2:它与定义1一样,但是它使用同一种颜色填充变量box对应的区域。对于单通道图像,变量colour为单个颜色值;对于多通道,则为一个元组。 例子2: from PIL import Image im1 = Image.open("jing.jpg") im1.paste((256,256,256),(200,100,500,200)) im1.save("he.jpg") 注:图像im1的(200,100)位置将出现一个300x100的白色方块,对于多通道的图像,如果变量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: from PIL import Image im1 = Image.open("jing.jpg") box = [100,100,200,200] im_crop = im1.crop(box) r,g,b = im_crop.split() im1.paste(im_crop,(200,100,300,200),b) im1.save("he.jpg") 注:在图像im1的(0,0)位置将出现一个半透明的100x100的方块。 >定义4:im.paste(colour,box, mask) 含义4:与定义3一样,只是使用变量colour对应的单色来填充区域。 例子4: from PIL import Image im1 = Image.open("jing.jpg") box = [100,100,200,200] im_crop = im1.crop(box) r,g,b = im_crop.split() im1.paste((0,256,0),(200,100,300,200),b) im1.save("he.jpg") 注:在图像im1的(0,0)位置将出现一个100x100的绿色方块。
-
im.point(table)
返回给定查找表对应的图像像素值的拷贝。变量table为图像的每个通道设置256个值。如果使用变量function,其对应函数应该有一个参数。这个函数将对每个像素值使用一次,结果表格将应用于图像的所有通道。
-
im.resize(size, filter)
返回改变尺寸的图像的拷贝。变量size是所要求的尺寸,是一个二元组:(width, height)。
变量filter为NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果忽略,或者图像模式为“1”或者“P”,该变量设置为NEAREST。 -
im.rotate(angle,filter=NEAREST, expand=0)
返回一个按照给定角度顺时钟围绕图像中心旋转后的图像拷贝。
变量filter应该是NEAREST、BILINEAR或者BICUBIC之一。如果省略该变量,或者图像模式为“1”或者“P”,则默认为NEAREST。
变量expand,如果为true,表示输出图像足够大,可以装载旋转后的图像。如果为false或者缺省,则输出图像与输入图像尺寸一样大。 -
im.save(outfile, format, options…)
使用给定的文件名保存图像。如果变量format缺省,如果可能的话,则从文件名称的扩展名判断文件的格式。该方法返回为空。
关键字options为文件编写器提供一些额外的指令。如果编写器不能识别某个选项,它将忽略它。
用户可以使用文件对象代替文件名称。在这种情况下,用户必须指定文件格式。文件对象必须实现了seek()、tell()和write()方法,且其以二进制模式打开。
如果方法save()因为某些原因失败,这个方法将产生一个异常(通常为IOError异常)。如果发生了异常,该方法也有可能已经创建了文件,并向文件写入了一些数据。如果需要的话,用户的应用程序可以删除这个不完整的文件。 -
im.seek(frame)
在给定的文件序列中查找指定的帧。如果查找超越了序列的末尾,则产生一个EOFError异常。当文件序列被打开时,PIL库自动指定到第0帧上。
-
im.tell()
返回当前帧所处位置,从0开始计算。
-
im.transpose(method)
返回当前图像的翻转或者旋转的拷贝。
变量method的取值为:FLIP_LEFT_RIGHT,FLIP_TOP_BOTTOM,ROTATE_90,ROTATE_180,或者ROTATE_270。 -
im.split()
返回当前图像各个通道组成的一个元组。例如,分离一个“RGB”图像将产生三个新的图像,分别对应原始图像的每个通道(红,绿,蓝)。
im = Image.open(im_path)
-高斯模糊
im.filter(ImageFilter.GaussianBlur).save(new_path)
-普通模糊
im.filter(ImageFilter.BLUR).save(new_path)
-边缘增强
im.filter(ImageFilter.EDGE_ENHANCE).save(new_path)
-找到边缘
im.filter(ImageFilter.FIND_EDGES).save(new_path)
-浮雕
im.filter(ImageFilter.EMBOSS).save(new_path)
-轮廓
im.filter(ImageFilter.CONTOUR).save(new_path)
-锐化
im.filter(ImageFilter.SHARPEN).save(new_path)
-平滑
im.filter(ImageFilter.SMOOTH).save(new_path)
-细节
im.filter(ImageFilter.DETAIL).save(new_path)