python-pillow图像处理

一、图像处理

pillow是python imaging library的简称。常见的尺寸/格式/色彩/旋转等处理。引用是为from PIL import Image。PIL库安装目录在/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/PIL,该目录下有所有PIL下的函数。

1、图像处理基本知识

1)图像的RGB色彩模式

RGB三个颜色通过的变化和叠加得到各种颜色:例红色的RGB表示(255,0,0),绿色(0,255,0),黄色(255,255,0)

-R红色,取值范围0-255;

-G绿色,取值范围0-255;

-B蓝色,取值范围0-255;

2)像素阵列

数字图像可以看成一个整数阵列,阵列中的元素称为像素(Pixel),图像中的每个点都有一个像素,表示为(R,G,B)。 

3)RGBA色彩模式:RGBA格式除了r,g,b三个bands之外多了个alpha,不透明度。

可以通过open('文件名').convert(mode='RGB')选择打开色彩模式。

2、Image模块

Pillow库中,使用Image模块可以从文件中加载图像/处理其他图像/从scratch中创建图像;

1)打开和新建

open(fp,mode)  #打开文件,如果文件不存在,则返回IOError错误。fp打开文件的路径;mode可选,打开文件的方式,默认r;
new(mode,size,color=0)  #新建图像,mode图片模式;size图片尺寸,宽和高组成的元组;color默认颜色(黑色),可以是常有颜色名称'red',十六进制颜色'#F0099',元组(255,255,0);

Pillow库支持的常用图片模式信息:

【例1】使用Image打开一副图片

from PIL import Image
#打开图片
im=Image.open('/Users/姓名/Desktop/image03.png')
#显示图片
im.show()
#查看图片的信息
print('图像格式:',im.format)
print('图像大小,格式是(宽度,高度)',im.size)
print('图像宽度:',im.width,'图像高度:',im.height)
print('图像的格式:',im.mode)  #RGBA格式除了r,g,b三个bands之外多了个alpha,不透明度。
print('读取坐标在(100,100)处的像素信息:',im.getpixel((100,100)))

结果:

图像格式: PNG
图像大小,格式是(宽度,高度) (606, 194)
图像宽度: 606 图像高度: 194
图像的格式: RGBA
读取坐标在(100,100)处的像素信息: (123, 163, 241, 255)

2)混合

透明度混合处理:blend()实现透明度混合处理,语法:

blend(im1,im2,alpha) #im1,im2指参与混合的图片1/图片2,alpha混合透明度,取值0-1;混合过程为(im1*(1-alpha)+im2*alpha)

【例2】透明度混合图片

from PIL import Image
im1=Image.open('/Users/姓名/Desktop/image03.png').convert(mode='RGB')
im2=Image.new('RGB',im1.size,'red')  #新创建图像
#混合两幅图
Image.blend(im1, im2, alpha=0.5).show()

遮罩混合处理:composite()实现,语法:

composite(im1,im2.mask)  #im1/im2为混合处理图片,mask也为图像,mode可以为'1'/'L'/'RGBA',大小要和im1/im2一样。功能是使用mask来混合im1/im2图片,要求三张图片尺寸相同。
Image.split()方法用于将图像分成单独的波段。此方法从图像返回单个图像带的元组。分割“RGB”图像会创建三个新图像,每个图像都包含一个原始波段(红色,绿色,蓝色)的副本。

【例3】遮罩混合图片

from PIL import Image
im1=Image.open('/Users/姓名/Desktop/image03.png').convert(mode='RGB')
im2=Image.open('/Users/姓名/Desktop/image04.png').convert(mode='RGB')
im2=im2.resize(im1.size)
r,g,b=im2.split()
Image.composite(im2,im1,b).show()  #b.size返回(606, 194);b.mode返回L;

 

 3)复制和缩放

 复制图像Image.copy()/缩放像素Image.eval()缩放,fun()计算输入图片的每个像素并返回。

eval(Image,fun) #image表示输入的图片。fun表示对输入每个图片的每个像素应用此函数,fun只允许接收一个整型参数。

【例4】缩放指定图片,每个像素*2

from PIL import Image
img=Image.open('/Users/姓名/Desktop/image03.png')
Image.eval(img,lambda i:i*2).show()

after
【例5】按尺寸缩放

from PIL import Image
img=Image.open('/Users/姓名/Desktop/image03.png')
img2=img.copy()
#缩放为指定大小的[200,168]
img2.thumbnail([200,168])
img2.show()

 

 

4)粘贴和剪切

Image.paste(im,box=None,mask=None)  #粘贴。im指源图或像素值;box为粘贴的区域,分为3种情况,(x1,y1)指将原图像左上角对齐(x1,y1)点,其余超出被粘贴图像的区域被抛弃,
(x1,y1,x2,y2)时原图像与此区域必须一致,None源图像与被粘贴的图像大小必须一致;mask为遮罩
Image.crop(box=None)  #剪切box所指定的区域;box时四元组,分别定义了剪切区域的左上右下4个坐标;

【例6】剪切和粘贴

#剪切和粘贴
from PIL import Image
img=Image.open('/Users/姓名/Desktop/image03.png')
#复制图片
img2=img.copy()
img3=img.copy()
#剪切图片
region=img2.crop([5,5,120,120])
region.show()
#粘贴图片
img3.paste(region,[30,30])
img3.show()

 

 

5)图像旋转
Image.rotate(angle, resample=0,expand=0,center=None,translate=None,fillcolor=None)  #围绕其中心逆时针旋转指定度数。

【例7】图像旋转

from PIL import Image
img=Image.open('/Users/姓名/Desktop/image03.png')
img.rotate(90).show()

6)格式转换

 

Image.convert(mode=None,matrix=None,dither=None,palette=0,colors=256)   #返回模式转换后的图像实例。mode为转换文件的模式,支持'L','RGB','CMYK';matrix可选的转换矩阵,
若有,则为包含浮点数的4或12元组;dither抖动方法,从模式“RGB”转换为“P”或从“RGB”或“L”转换为“1”时使用,可用的方法为NONE或FLOYDSTEINBERG;
Image.transpose(method)   #实现图像格式的转换。method取值有PIL.Image.FLIP_LEFT_RIGHT左右镜像/PIL.Image.FLIP_TOP_BOTTOM上下镜像/PIL.Image.ROTATE_90旋转90/
PIL.Image.ROTATE_180/PIL.image.ROTATE_270/PIL.Image.TRANSPOSE颠倒顺序;

【例8】转换操作

from PIL import Image
img=Image.open('/Users/姓名/Desktop/image03.png')
img2=img.copy()
#convert
img_convert=img2.convert('CMYK')
img_convert.show()
#transpose()
img_transpose=img2.transpose(Image.ROTATE_90)
img_transpose.show()

 

7)分离和合并

Image.split()  #将图片分割为多个通道列表。
Image.merge(mode,bands)   #将一个通道的图像合并到更多通道图像中。mode指输出图像的模式;bands波段通道,一个序列包含单个带图通道。

【例9】合并和分离

from PIL import Image
img1=Image.open('/Users/姓名/Desktop/image03.png').convert(mode='RGB')
img2=Image.open('/Users/姓名/Desktop/image04.png').convert(mode='RGB')
img2=img2.resize(img1.size)
#分离 r1,g1,b1
=img1.split() r2,g2,b2=img2.split() tmp=[r1,g2,b1] img=Image.merge('RGB',tmp) img.show()

 

 



 

 



 

 



 

 



 

 



 

 



 

posted @ 2022-11-13 08:06  min222  阅读(414)  评论(0编辑  收藏  举报