图像混合
在 Pillow 库的 Image 模块中,可以使用函数 blend()实现透明度混合处理
blend(im1,im2,alpha)
其中 im1、im2 指参与混合的图片 1 和图片 2,alpha 指混合透明度,取值是 0-1。通过使用函数 blend(),可以将 im1 和 im2 这两幅图片(尺寸相同)以一定的透明度进行混合。混合过场(im1*(1-alpha)+im2*alpha)
当混合透明度为 0 时,显示 im1 原图。当混合透明度 alpha 取值为 1 时,显示 im2原图片。
from PIL import Image
img1=Image.open('bjsxt.png')
img2=Image.new('RGB',img1.size,'red')#创建一张红包的图
Image.blend(img1,img2,alpha=0.5).show()
以上将一个图片变红
遮罩混合处理
遮罩混合处理是一种图像处理技术,通常用于将两张图像按照一个遮罩(mask)的形状进行混合。这个遮罩图像通常是一个灰度图像,其中的像素值决定了混合过程中每个像素在最终输出中所占的权重。
遮罩混合处理的作用包括但不限于:
图像融合:通过遮罩混合处理,可以将两张图像以非常精细的方式混合在一起,使它们融合成一张新的图像。
局部处理:遮罩可以用来指定图像的某些部分需要特殊处理,从而实现图像的局部调整或特效效果。
透明度控制:遮罩可以指定图像的透明度,让某些部分更透明,某些部分更不透明,从而实现图像的淡入淡出效果。
特效添加:遮罩混合可以用来添加各种特效,比如模糊、锐化、颜色调整等,以实现更加生动丰富的图像效果。
总的来说,遮罩混合处理提供了一种灵活的方式来控制图像的混合过程,使得图像处理更加精确和具有创造性。
在 Pillow 库中 Image 模块中,可以使用函数 composite()实现遮罩混合处理
composite(im1,im2,mask)
其中 im1 和 im2 表示混合处理的图片 1 和图片 2.mask 也是一个图像,mode 可以为“1”, “L”, or “RGBA”,并且大小要和 im1、im2 一样。
函数 composite()的功能是使用 mask 来混合图片 im1 和 im2,并且要求 mask、im1和 im2 三幅图片的尺寸相同。
from PIL import Image
img1=Image.open('blend1.jpg')
img2=Image.open('blend2.jpg')
img2=img2.resize(img1.size)#重设image的大小使其与img1一致
r,g,b=img2.split()
Image.composite(img2,img1,b).show()
img2 这张图片按通道拆分成三个单独的通道,即红色通道(Red)、绿色通道(Green)、蓝色通道(Blue)。在这里,img2 是一个 PIL.Image 对象,通过 split() 方法将其分割为这三个通道的图像对象。
一旦拆分完成,你就可以对每个通道进行独立的操作,比如对图像进行通道间的混合、处理或者分别处理每个通道的数据。在这段代码的后续部分,使用了这些通道来合成两张图片,其中 b 通道被用来控制两张图片的混合程度。
这种通道分离的方式允许你在图像处理中更精细地控制每个颜色通道的处理过程,从而实现各种图像处理效果。
复制和缩放
(1) 复制图像
在 Pillow 库的 Image 模块中,可以使用函数 Image.copy()复制指定的图片,这可以用于在处理或粘贴时需要持有源图片。
(2) 缩放像素
在 Pillow 库的 Image 模块中,可以使用函数 eval()实现像素缩放处理,能够使用函数 fun()计算输入图片的每个像素并返回。使用函数 eval()语法格式如下:
eval(image,fun)
from PIL import Image
img=Image.open('blend1.jpg')
Image.eval(img,lambda i:i*2).show()#使每个像素变为原来的两倍,使整个图像更加明亮
这个函数的作用是对图像的每个像素进行逐一处理,将其值乘以 2,从而使图像变得更亮(因为像素值变大了)。
需要注意的是,这种处理可能会导致像素值超过图像所能表示的最大值(通常是 255 对于 8 位图像),从而导致溢出和视觉上的失真。为了避免这种情况,可以在应用 Image.eval 之前或之后进行适当的剪裁或归一化。
举个例子,如果原图像的一个像素值为 100,经过 lambda i: i * 2 处理后,这个像素值将变为 200。如果原图像的一个像素值为 150,经过处理后变为 300,但是对于 8 位图像,300 超过了 255 的最大值,这时候可能会被裁剪为 255 或者取模处理。
传递的 fun 函数的参数是图像的像素值。对于灰度图像(模式为 ‘L’),每个像素值是一个 0 到 255 之间的整数,表示亮度。对于其他模式的图像(如 ‘RGB’),eval 只对单个通道应用函数,因此通常需要分别处理每个通道。
对于灰度图像(‘L’ 模式),fun 函数的参数是每个像素的亮度值(0 到 255 的整数)。
Image.eval(img, lambda i: i * 2) 会对图像中的每个像素值 i 进行操作,并返回 i * 2,然后生成一个新的图像。
对于 RGB 图像,eval 函数不能直接应用于整个图像,因为它需要逐个通道地处理。因此,需要分别对 R、G、B 三个通道应用函数,然后再合并回一个图像。
缩放图像
在 Pillow 库的 Image 模块中,可以使用函数 thumbnail()原生地缩放指定的图像 。具
体语法格式如下
Image.thmbnail(size,resample=3)
size:
类型:tuple
描述:一个包含宽度和高度的二元组,表示缩略图的最大尺寸。缩略图的实际尺寸将根据图像的长宽比进行调整,以适应此最大尺寸。
resample:
类型:int
描述:可选参数,指定重采样滤波器。可以使用的值包括:
Image.NEAREST 或 0: 最邻近滤波
Image.BOX 或 4: 方框滤波
Image.BILINEAR 或 2: 双线性滤波
Image.HAMMING 或 5: 哈明滤波
Image.BICUBIC 或 3: 双三次滤波
Image.LANCZOS 或 1: Lanczos滤波(高质量)
默认值:Image.BICUBIC 或 3
from PIL import Image
img=Image.open('blend1.jpg')
imgb=img.copy()#处理时可以保留源文件
#缩放为指定大小(220,168)
imgb.thumbnail((220,168))
imgb.show()
粘贴和裁剪
(1) 粘贴
在 Pillow 库的 Image 模块中,函数 paste()的功能是粘贴源图像或像素至该图像中。
具体语法格式如下:
Image.paste(im,box=None,mask=None)
遮罩的作用
选择性显示:
遮罩可以用来控制图像的哪些部分应该被显示或隐藏。例如,在图像合成中,遮罩可以决定前景图像的哪些部分应该显示在背景图像上。
应用效果:
使用遮罩,可以在图像的特定区域应用滤镜或效果。比如,只对图像的一部分进行模糊处理或颜色调整。
透明度控制:
遮罩可以用来控制图像不同部分的透明度。例如,可以通过一个渐变遮罩来创建从不透明到透明的渐变效果。
其中 im 是源图或像素值;box 是粘贴的区域;mask 是遮罩。参数 box 可以分为以下 3 中情况。
1.(x1,y1):将源图像左上角对齐(x1,y1)点,其余超出被粘贴图像的区域被抛弃。
2.(x1,y1,x2,y2):源图像与此区域必须一致。
3.None:源图像与被粘贴的图像大小必须一致。
(2) 裁剪图像
在 Pillow 库的 Image 模块中,函数 crop()的功能是剪切图片中 box 所指定的区域,
具体语法如下:
Image.crop(box=None)
参数 box 是一个四元组,分别定义了剪切区域的左、上、右、下 4 个坐标。
from PIL import Image
img=Image.open('bjsxt.png')
#复制图片
imgb=img.copy()
imgc=img.copy()
#剪切图片
region=imgb.crop((5,5,120,120))
#粘贴图片
imgc.paste(region,(30,30))
imgc.show()
在 Pillow 库的 Image 模块中,函数 rotate()的功能返回此图像的副本,围绕其中心逆时针旋转给定的度数。具体语法格式如下:
Image.rotate(angle,resample = 0,expand = 0,center = None,translate = None,fillcolor = None )
from PIL import Image
img=Image.open('bjsxt.png')
img.rotate(90).show()
格式转换
(1) covert()
在 Pillow 库的 Image 模块中,函数 convert()的功能是返回模式转换后的图像实例。
具体转换的语法格式如下:
Image.convert(mode=None,matrix=None,dither=None,palette=0,colors=256)
其中 mode:转换文件的模式,默契支持的模式有“L”、“RGB”“CMYK”;matrix:
转使用的矩阵;dither:取值为 None 切转为黑白图时非 0(1-255)像素均为白,也
可以设置此参数为 FLOYDSTEINBERG。
(2) transpose()
在 Pillow 库的 Image 模块中,函数 transpose()函数功能是实现图像格式的转换。
具体语法格式如下:
Image.transpose(method)
转换图像后,返回转换后的图像,“method”的取值有以下几个。
- PIL.Image.FLIP_LEFT_RIGHT:左右镜像
- PIL.Image.FLIP_TOP_BOTTOM :上下镜像
- PIL.Image.ROTATE_90:旋转 90
- PIL.Image.ROTATE_180:旋转 180
- PIL.Image.ROTATE_270:旋转 270
- PIL.Image.TRANSPOSE :颠倒顺序
from PIL import Image
#打开指定的图片
img1=Image.open('bjsxt.png')
img2=img1.copy()
#convert()
img_convert=img2.convert('CMYK')
# img_convert.show()
#transpose()
img_transpose=img2.transpose(Image.ROTATE_90)
img_transpose.show()
分离
在 Pillow 库的 Image 模块中,使用函数 split()可以将图片分割为多个通道列表。使
用函数 split()的语法格式如下所示:
Image.split()
合并
在 Pillow 库的 Image 模块中,使用函数 merge()可以将一个通道的图像合并到更多通
道图像中。使用函数 merge()的语法格式如下所示:
Image.merge(mode,bands)
其中 mode 指输出图像的模式,bands 波段通道,一个序列包含单个带图通道。
from PIL import Image
img1=Image.open('blend1.jpg')
img2=Image.open('blend2.jpg')
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()
滤镜
在 Pillow 库中的 Image 模块中,使用函数 filter()可以对指定的图片使用滤镜效果,在Pillow 库中可以用的滤镜保存在 ImageFilter 模块中。使用函数 filter()的语法格式如下所示:
Image.filter(filter)
通过函数 filter(),可以使用给定的滤镜过虑指定的图像,参数“filter”表示滤镜内核。
在 Pillow 库的 Image 模块中,还有很多其他重要的内置函数和属性。
常用的属性:
- Image.format:源图像格式
- Image.mode:图像模式字符串
- Image.size:图像尺寸
在 Pillow 库的 Image 模块中,其他常用的内置函数如下所示: - Image.getbands():获取图像每个通道的名称列表,例如 RGB 图像返回[‘R’,’G’,’B’]。
- Image.getextrema():获取图像最大、最小像素的值。
- Image.getpixel(xy):获取像素点值。
- Image.histogram(mask=None,extrema=None):获取图像直方图,返回像素计数的列表。
- Image.point(function):使用函数修改图像的每个像素。
- Image.putalpha(alpha):添加或替换图像的 alpha 层。
- Image.save(fp,format=None,**params):保存图片。
- Image.show(title=None,command=None):显示图片。
- Image.transform(size,method,data=None,resample=0,fill=1):变换图像。
- Image.verify():校验文件是否损坏。
- Image.close():关闭文件。