Python3 集成Pillow

Posted 在奋斗的大道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3 集成Pillow相关的知识,希望对你有一定的参考价值。

1.安装pillow

pip install pillow

2.图像处理简介

图像处理RGB色彩模式:

-R(red)      0--255

-G(green)  0--255

-B(blue)     0--255

像素阵列

每个点就是一个像素每个点都由(R,G,B)表示颜色

图片素材:

 

3.模块介绍

A.Image模块

(1)打开图片

例:用Image打开一张图片

#导入模块
from PIL import Image
#打开图片
img=Image.open('kiki.jpg')
#显示图片
img.show()
print('图片格式:',img.format)
print('图片大小:',img.size)
print('高度:',img.height)
print('宽度:',img.width)
print('(100,100)处的RGB:',img.getpixel((100,100)))
'''
图片格式 JPEG
图片大小 (500, 330)
高度 330
宽度 500
(100,100)处的RGB (2, 6, 5)
'''

(2)混合

①透明度混合

blend(im1,im2,alpha)

im1:图1,im2:图2,alpha混合透明度(0-1)为im2的占比

注意:im1,im2的尺寸需要相同

具体混合的公式:im1*(1-alpha)+im2*alpha

#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
img2=Image.open('yoki.jpg')
#图片混合
img1add2=Image.blend(img1,img2,0.5)
#显示图片
img1add2.show()

混合结果

 

②遮罩混合

composite(im1,im2,mask)

功能:使用mask来混合处理im1,im2,要求im1,im2,mask三幅图片尺寸相同。

#导入模块
from PIL import Image
#打开图片并变成相同尺寸(这里本来就相同)
img1=Image.open('kiki.jpg')
img2=Image.open('yoki.jpg').resize(img1.size)
img3=Image.open('niki.jpg').resize(img1.size)
#把img3的rgb分离
r3,g3,b3=img3.split()
img1composite2=Image.composite(img1,img2,b3)
#显示图片
img1composite2.show()

 结果:

(3)图像缩放

①像素缩放(其实是调亮度):

#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
#将每个像素值扩大2倍
img1_mul2=Image.eval(img1,lambda x:x*2)
#显示图片
img1_mul2.show()

结果:

②尺寸缩放(改变大小):

#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
img2=img1.copy()
#将每个像素值缩小一半
img2.thumbnail((img1.size[0]/2,img1.size[1]/2))
#显示图片大小
print('img1:',img1.size)
print('img2:',img2.size)
'''
img1: (500, 330)
img2: (250, 165)
'''

(4)粘贴和裁剪

①粘贴:

Image.paste(im,box=None,mask=None)

im:源图或像素值;box:粘贴区域;mask:遮罩

box:

a.(x1,y1):将图像左上角对齐(x1,y1),超出被粘贴图像区域丢弃

b.(x1,y1,x2,y2):原图像与此区域保持一致。

c.   None:原图像与被粘贴图像必须大小一致。

#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
img2=img1.copy()
#将每个像素值缩小一半
img2.thumbnail((img1.size[0]/3,img1.size[1]/3))
#把img2贴到img1上
img1.paste(img2,(30,40))
img1.show()

 结果:

 

(5)图像的旋转

Image.rotate(angle,resample=0,expand=0,center=None,translate=None,fillcolor=None)

angle:旋转角度

#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
img1=img1.rotate(60)
img1.show()

(6)格式转换

#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
#上下滤镜
#img2=img1.transpose(Image.FLIP_TOP_BOTTOM)#上下
img2=img1.transpose(Image.FLIP_LEFT_RIGHT)#左右
img2=img1.transpose(Image.ROTATE_90)#旋转90度,尺寸也变
img2=img1.transpose(Image.ROTATE_180)#旋转180度
img2.show()

(7)图像分离(split),混合(merge)

#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
img2=Image.open('yoki.jpg').resize(img1.size)
#分离
r1,g1,b1=img1.split()
r2,g2,b2=img2.split()
tempa=[r1,g2,b1]
tempb=[r2,g1,b2]
#混合
imga=Image.merge('RGB',tempa)
imgb=Image.merge('RGB',tempb)
imga.show()
imgb.show()

(7)图像滤镜

BLUR:模糊滤波

CONTOUR:轮廓滤波

DETAIL:细节滤波

EDGE_ENHANCE:边界增强滤波

EDGE_ENHANCE_MORE:边界增强滤波(程度更深)

EMBOSS:浮雕滤波

FIND_EDGES:寻找边界滤波

SMOOTH:平滑滤波

SMOOTH_MORE:平滑滤波(程度更深)

SHARPEN:锐化滤波

GaussianBlur(radius=2):高斯模糊

例:

#导入模块
from PIL import Image,ImageFilter
#打开图片
img1=Image.open('kiki.jpg')
img1.thumbnail((img1.size[0]/3,img1.size[1]/3))
w,h=img1.size
#输出图片
img_output=Image.new('RGB',(3*w,4*h))
#高斯模糊
img1_GaussianBlur=img1.filter(ImageFilter.GaussianBlur(radius=3))
#BLUR普通模糊
img1_BLUR=img1.filter(ImageFilter.BLUR)
#DETAIL细节滤波
img1_DETAIL=img1.filter(ImageFilter.DETAIL)
#EDGE_ENHANCE:边界增强滤波
img1_EDGE_ENHANCE=img1.filter(ImageFilter.EDGE_ENHANCE)
#EDGE_ENHANCE_MORE:边界增强滤波(程度更深)
img1_EDGE_ENHANCE_MORE=img1.filter(ImageFilter.EDGE_ENHANCE_MORE)
#EMBOSS浮雕
img1_EMBOSS=img1.filter(ImageFilter.EMBOSS)
#FIND_EDGES:寻找边界滤波
img1_FIND_EDGES=img1.filter(ImageFilter.FIND_EDGES)
#SMOOTH:平滑滤波
img1_SMOOTH=img1.filter(ImageFilter.SMOOTH)
#SMOOTH_MORE:平滑滤波(程度更深)
img1_SMOOTH_MORE=img1.filter(ImageFilter.SMOOTH_MORE)
#SHARPEN:锐化滤波
img1_SHARPEN=img1.filter(ImageFilter.SHARPEN)
#CONTOUR:轮廓滤波
img1_CONTOUR=img1.filter(ImageFilter.CONTOUR)
#拼接
img_output.paste(img1,(0,0))
img_output.paste(img1_GaussianBlur,(w,0))
img_output.paste(img1_BLUR,(2*w,0))
img_output.paste(img1_DETAIL,(0,h))
img_output.paste(img1_EDGE_ENHANCE,(w,h))
img_output.paste(img1_EDGE_ENHANCE_MORE,(2*w,h))
img_output.paste(img1_EMBOSS,(0,2*h))
img_output.paste(img1_FIND_EDGES,(w,2*h))
img_output.paste(img1_SMOOTH,(2*w,2*h))
img_output.paste(img1_SMOOTH_MORE,(0,3*h))
img_output.paste(img1_SHARPEN,(w,3*h))
img_output.paste(img1_CONTOUR,(2*w,3*h))
img_output.show()

结果:

不想学了,我去打游戏了,过两天继续

继续继续

(8)图像整体运算

from PIL import ImageEnhance,Image
 
im1=Image.open('kiki.jpg')
out=im1.point(lambda i:i*2)#图片整体变亮
out.show()

 

 

B.ImageChops模块

(1)图片相加

ImageChops.add(im1,im2,scale=1.0,offset=0)

计算公式:

out=((im1+im2)/scale+offset)

from PIL import ImageChops,Image
 
im1=Image.open('kiki.jpg')
im2=Image.open('niki.jpg')
 
out=ImageChops.add(im1,im2,1,0)
out.show()

(2)图片相减

ImageChops.subtract(im1,im2,scale=1.0,offset=0)

计算公式:

out=((im1-im2)/scale+offset)

(3)图片变暗

ImageChops.darker(im1,im2)

比较两图片像素,取对应像素值的较小值然后保留,从而去除亮的部分

from PIL import ImageChops,Image
 
im1=Image.open('kiki.jpg')
im2=Image.open('niki.jpg')
 
out=ImageChops.darker(im1,im2)
out.show()

(4)图片变亮

ImageChops.lighter(im1,im2)

比较两图片像素,取对应像素值的较大值然后保留,从而去除暗的部分

from PIL import ImageChops,Image
 
im1=Image.open('kiki.jpg')
im2=Image.open('niki.jpg')
 
out=ImageChops.lighter(im1,im2)
out.show()

(5)屏幕函数

ImageChops.screen(im1,im2)

先反色后叠加,类似于将两张幻灯片用两台投影仪投影到一个屏幕上

计算公式:

out=MAX-((MAX-im1)*(MAX-im2)/MAX)

from PIL import ImageChops,Image
 
im1=Image.open('kiki.jpg')
im2=Image.open('niki.jpg')
 
out=ImageChops.screen(im1,im2)
out.show()

(6)反色函数

ImageChops.invert(im1)

计算公式:out=255-im1

from PIL import ImageChops,Image
 
im1=Image.open('kiki.jpg')
out=ImageChops.invert(im1)
out.show()

(7)比较函数

ImageChops.difference(im1,im2)

做减法操作取绝对值

计算公式:

abs(im1-im2)

from PIL import ImageChops,Image
 
im1=Image.open('kiki.jpg')
im2=Image.open('niki.jpg')
 
out=ImageChops.difference(im1,im2)
out.show()

B.ImageEnhance模块(图像增强)

使用方法:

image_enhance=ImageEnhance.XXX(img)(获取XXX调整器)

im=image_enhance.enhance(0~2)   0~1减弱,1~2增强

(1)获取色彩调整器

ImageEnhance.Color(im)

(2)获取对比度调整器

ImageEnhance.Contrast(im)

(3)获取亮度调整器

ImageEnhance.Brightness(im)

(4)获取清晰度调整器

ImageEnhancd.Sharpness(im)

from PIL import ImageEnhance,Image
 
im1=Image.open('kiki.jpg')
im1.thumbnail((im1.size[0]/3,im1.size[1]/3))
w,h=im1.size
out=Image.new('RGB',(3*w,4*h))
#获取色彩调整器对象
im_color=ImageEnhance.Color(im1)
im_color_a=im_color.enhance(1.5)
im_color_b=im_color.enhance(0.5)
 
#获取对比度调整器对象
im_contrast=ImageEnhance.Contrast(im1)
im_contrast_a=im_contrast.enhance(1.5)
im_contrast_b=im_contrast.enhance(0.5)
 
#获取亮度调整器对象
im_brightness=ImageEnhance.Brightness(im1)
im_brightness_a=im_brightness.enhance(1.5)
im_brightness_b=im_brightness.enhance(0.5)
 
#获取锐度调整器对象
im_sharpness=ImageEnhance.Sharpness(im1)
im_sharpness_a=im_sharpness.enhance(1.7)
im_sharpness_b=im_sharpness.enhance(0.2)
 
out.paste(im1,(0,0))
out.paste(im_color_a,(w,0))
out.paste(im_color_b,(2*w,0))
 
out.paste(im1,(0,h))
out.paste(im_contrast_a,(w,h))
out.paste(im_contrast_b,(2*w,h))
 
out.paste(im1,(0,2*h))
out.paste(im_brightness_a,(w,2*h))
out.paste(im_brightness_b,(2*w,2*h))
 
out.paste(im1,(0,3*h))
out.paste(im_sharpness_a,(w,3*h))
out.paste(im_sharpness_b,(2*w,3*h))
 
out.show()

 

C.ImagDraw模块(图像绘制)

使用方法:

drawObject = ImageDraw.Draw(blank)

功能:绘制二维图像

from PIL import Image, ImageDraw

img = Image.new('RGBA', (200, 200), 'white')
idraw = ImageDraw.Draw(img)

idraw.rectangle((10, 10, 100, 100), fill='blue')

img.save('D:\\\\rectangle.png')

D.ImagFont模块

功能:验证码功能

# -*- coding: utf-8 -*-
# __author__: Pad0y

from PIL import Image, ImageDraw, ImageFont
from random import choice, randint, randrange
import string

# 候选字符集,大小写字母+数字
chrs = string.ascii_letters + string.digits


def selected_chrs(length):
    """
    返回length个随机字符串
    :param length:
    :return:
    """
    result = ''.join(choice(chrs) for _ in range(length))
    return result


def get_color():
    """
    设置随机颜色
    :return:
    """
    r = randint(0, 255)
    g = randint(0, 255)
    b = randint(0, 255)
    return (r, g, b)


def main(size=(200, 100), chrNumber=6, bgcolor=(255, 255, 255)):
    """
    定义图片大小,验证码长度,背景颜色
    :param size:
    :param chrNumber:
    :param bgcolor:
    :return:
    """
    # 创建空白图像和绘图对象
    image_tmp = Image.new('RGB', size, bgcolor)
    draw = ImageDraw.Draw(image_tmp)

    # 生成并计算随机字符的宽度和高度
    text = selected_chrs(chrNumber)
    font = ImageFont.truetype('c:\\\\windows\\\\fonts\\\\simkai.ttf', 48)  # 选定一款系统字体
    width, height = draw.textsize(text, font)
    if width + 2*chrNumber > size[0] or height > size[1]:
        print('Size Error!')
        return

    # 绘制字符串
    startX = 0
    width_eachchr = width // chrNumber  # 计算每个字符宽度
    for i in range(chrNumber):
        startX += width_eachchr + 1
        position = (startX, (size[1]-height)//2+randint(-10, 10))  # 字符坐标, Y坐标上下浮动
        draw.text(xy=position, text=text[i], font=font, fill=get_color())  # 绘制函数

    # 对像素位置进行微调,实现验证码扭曲效果
    img_final = Image.new('RGB', size, bgcolor)
    pixels_final = img_final.load()
    pixels_tmp = image_tmp.load()
    for y in range(size[1]):
        offset = randint(-1, 0)  # randint()相当于闭区间[x,y]
        for x in range(size[0]):
            newx = x + offset  # 像素微调
            if newx >= size[0]:
                newx = size[0] - 1
            elif newx < 0:
                newx = 0
            pixels_final[newx, y] = pixels_tmp[x, y]

    # 绘制随机颜色随机位置的干扰像素
    draw = ImageDraw.Draw(img_final)
    for i in range(int(size[0]*size[1]*0.07)):  # 7%密度的干扰像素
        draw.point((randrange(size[0]), randrange(size[1])), fill=get_color())  # randrange取值范围是左开右闭

    # 绘制随机干扰线,这里设置为8条
    for i in range(8):
        start = (0, randrange(size[1]))
        end = (size[0], randrange(size[1]))
        draw.line([start, end], fill=get_color(), width=1)

    # 绘制随机弧线
    for i in range(8):
        start = (-50, -50)  # 起始位置在外边看起来才会像弧线
        end = (size[0]+10, randint(0, size[1]+10))
        draw.arc(start+end, 0, 360, fill=get_color())

    # 保存图片
    img_final.save('Veri_code.jpg')
    img_final.show()


if __name__ == '__main__':
    main((200, 100), 6, (255, 255, 255))

以上是关于Python3 集成Pillow的主要内容,如果未能解决你的问题,请参考以下文章

Python3 - pillow的基本用法(第三天)

Python3 Pillow 获取一条线上的所有像素

Python3 - pillow的基本用法(第三天)

苹果电脑python3安装pillow模块

python3用pillow生成验证码,tornado中输出图片

python3之成像库pillow