美文网首页
python进阶-11-pillow图像处理

python进阶-11-pillow图像处理

作者: 西海岸虎皮猫大人 | 来源:发表于2020-03-15 17:31 被阅读0次

    1 概述

    安装
    pip install pillow
    
    概念

    图像又RGB三个通道叠加得到
    图形可看作像素阵列,可通过矩阵运算实现复杂操作

    第一行程序
    #encoding=utf-8
    from PIL import Image
    # 打开图片
    img = Image.open('img/1.png')
    # 显示图片
    # img.show()
    print('图片格式:', img.format)
    print('图片大小:', img.size)
    print('图片高度:', img.height, '图片宽度:', img.width)
    print('图片(100,100)处像素值:', img.getpixel((100,100)))
    

    2 图像混合

    透明度混合
    #encoding=utf-8
    from PIL import Image
    # 打开图片
    img1 = Image.open('img/1.png').convert(mode='RGB')
    # 创建与img1相同大小的红色图像
    img2 = Image.new('RGB', img1.size, 'red')
    # alpha表示透明度, alpha为0只显示img1,alpha为1只显示img2
    Image.blend(img1, img2, alpha=0.5).show()
    
    遮罩混合
    #encoding=utf-8
    from PIL import Image
    
    img1 = Image.open('img/1.jpg')
    img2 = Image.open('img/2.jpg')
    # 调整大小
    img2 = img2.resize(img1.size)
    r,g,b = img2.split()
    # img2的b通道对img1遮罩
    Image.composite(img2, img1, b).show()
    

    3 图像缩放 | 剪切粘贴

    按像素缩放
    #encoding=utf-8
    from PIL import Image
    img1 = Image.open('img/1.jpg')
    img1.show()
    # 按像素缩放,将每个像素扩大2倍
    Image.eval(img1, lambda x:x*2).show()
    

    会变亮

    按尺寸缩放
    #encoding=utf-8
    from PIL import Image
    img1 = Image.open('img/1.jpg')
    # 复制图片
    img2 = img1.copy()
    print(img2.size)
    # 按尺寸缩放到指定大小
    img2.thumbnail((100,100))
    img2.show()
    
    剪切粘贴
    #encoding=utf-8
    from PIL import Image
    img1 = Image.open('img/1.jpg')
    img2 = img1.copy()
    img3 = img1.copy()
    # 剪切
    img_crop = img2.crop((30, 30, 800, 800))
    img3.paste(img_crop, (500, 500))
    img3.show()
    

    4 图像旋转镜像 | 分离合并

    旋转 | 镜像
    #encoding=utf-8
    from PIL import Image
    # 打开图片
    img = Image.open('img/1.jpg')
    # 旋转90度
    # img.rotate(90).show()
    # 上下镜像
    # img.transpose(Image.FLIP_TOP_BOTTOM).show()
    # 左右镜像
    # img.transpose(Image.FLIP_LEFT_RIGHT).show()
    # 90度镜像
    # img.transpose(Image.ROTATE_90).show()
    # 180度镜像
    # img.transpose(Image.ROTATE_180).show()
    # 颠倒
    # img.transpose(Image.TRANSPOSE).show()
    
    分离 | 合并

    将图片1的通道与图片2的通道合并

    #encoding=utf-8
    from PIL import Image
    img1 = Image.open('img/1.jpg')
    img2 = Image.open('img/2.jpg')
    img2 = img2.resize(img1.size)
    # 分割
    r1,g1,b1 = img1.split()
    r2,g2,b2 = img2.split()
    temp = [r1, g2, b1]
    img = Image.merge('RGB', temp)
    img.show()
    

    5 图像滤镜

    高斯模糊
    #encoding=utf-8
    from PIL import Image, ImageFilter
    img = Image.open('img/1.jpg')
    w, h = img.size
    # 创建一个新图像,宽度为原图2倍
    img_output = Image.new('RGB', (2*w, h))
    # 原图粘贴至左侧
    img_output.paste(img, (0, 0))
    # 高斯模糊
    img_filter = img.filter(ImageFilter.GaussianBlur)
    # 滤镜粘贴至右侧
    img_output.paste(img_filter, (w, 0))
    img_output.show()
    
    其他滤镜
    # 边缘增强
    img_filter2 = img.filter(ImageFilter.EDGE_ENHANCE)
    # 寻找边缘
    img_filter3 = img.filter(ImageFilter.FIND_EDGES)
    

    详见文档

    6 图片合成

    ImageChops模块,通过计算像素值实现
    加法,减法,变暗,变量,叠加
    屏幕函数,先反色再叠加
    反色(底片)
    比较图像差异

    #encoding=utf-8
    from PIL import Image, ImageChops
    img1 = Image.open('img/1.jpg')
    img2 = Image.open('img/2.jpg')
    # 加法
    # ImageChops.add(img1, img2).show()
    # 减法
    # ImageChops.subtract(img1, img2).show()
    # 变暗
    # ImageChops.darker(img1, img2).show()
    # 变亮
    # ImageChops.lighter(img1, img2).show()
    # 叠加
    # ImageChops.multiply(img1, img2).show()
    # 屏幕
    # ImageChops.screen(img1, img2).show()
    # 反色
    # ImageChops.invert(img1).show()
    # 比较
    ImageChops.difference(img1, img2).show()
    

    7 调整图片色彩亮度

    ImageEnhance模块,色彩\对比度\亮度\清晰度

    色彩调整器
    #encoding=utf-8
    from PIL import Image, ImageEnhance
    img = Image.open('img/1.jpg')
    w,h = img.size
    img_output = Image.new('RGB', (3*w, h))
    img_output.paste(img, (0, 0))
    # 获取色彩调整期
    image_color = ImageEnhance.Color(img)
    # 色彩增强, 参数大于1增强
    imgb =  image_color.enhance(1.5)
    img_output.paste(imgb, (w, 0))
    # 色彩减弱
    imgc =  image_color.enhance(0.3)
    img_output.paste(imgc, (2*w, 0))
    img_output.show()
    
    image.png
    亮度调整器
    # 获取亮度调整期
    image_bright = ImageEnhance.Brightness(img)
    # 亮度增强, 参数大于1增强
    imgb = image_bright.enhance(1.5)
    ...
    # 亮度减弱
    imgc =  image_bright.enhance(0.3)
    
    image.png
    像素点运算调整亮度
    #encoding=utf-8
    from PIL import Image
    img = Image.open('img/1.jpg')
    w, h = img.size
    img_output = Image.new('RGB', (3*w, h))
    img_output.paste(img, (0, 0))
    # 对像素点进行运算
    # 图像整体变亮
    imgb = img.point(lambda i:i*1.4)
    # 图像整体变暗
    imgc = img.point(lambda i:i*0.3)
    img_output.paste(imgb, (w, 0))
    img_output.paste(imgc, (2*w, 0))
    img_output.show()
    
    image.png

    8 ImageDraw绘制二维图像

    ImageDraw对原图操作,达到修饰或注释的目的
    可绘制直线\矩形\椭圆\点\文字等

    #coding=utf-8
    from PIL import Image, ImageDraw, ImageFont
    # 创建白背景图像
    img = Image.new('RGB', (300, 200), 'white')
    # 绘制矩形
    draw_obj = ImageDraw.Draw(img)
    # 颜色 填充
    draw_obj.rectangle((50, 50, 150, 150), outline='red', fill='blue')
    # 字体
    font = ImageFont.truetype('arial.ttf', 20)
    draw_obj.text((50, 50), 'Vincent', fill='green',font=font)
    img.show()
    

    window字体位置:
    C:\Windows\Fonts

    9 ImageFont的使用

    在原图片绘制
    #coding=utf-8
    from PIL import Image, ImageDraw
    img = Image.open('img/1.jpg')
    width, height = img.size
    # 创建绘图对象
    draw_obj = ImageDraw.Draw(img)
    draw_obj.arc((0,0, width-1, height-1), 0, 360, fill='blue')
    img.save('circle.jpg')
    
    ImageFont的使用
    #coding=utf-8
    from PIL import Image, ImageDraw, ImageFont
    img = Image.open('img/1.jpg')
    draw_obj = ImageDraw.Draw(img)
    # 加载默认字体
    # font = ImageFont.load_default()
    font = ImageFont.truetype('simhei.ttf', 80)
    draw_obj.text((30, 10), '朵梵', font=font, fill='white')
    img.show()
    

    10 练习 - 绘制十字

    #coding=utf-8
    from PIL import Image, ImageDraw
    img = Image.open('img/1.jpg')
    draw_obj = ImageDraw.Draw(img)
    w, h = img.size
    draw_obj.line((0,0, w, h), fill=(255, 0, 0), width=20)
    draw_obj.line((0,h, w, 0), fill=(255, 0, 0), width=20)
    img.show()
    

    11 练习 - 绘制验证码

    验证码
    #coding=utf-8
    from PIL import Image, ImageDraw, ImageFont
    import random
    width, height = 100, 100
    # 白色背景
    img = Image.new('RGB', (width, height), (255, 255, 255))
    draw_obj = ImageDraw.Draw(img)
    
    
    def get_color():
        return (random.randint(200, 255), random.randint(200, 255), random.randint(200, 255))
    
    
    def get_char():
        return chr(random.randint(65, 97))
    
    
    # 绘制背景
    for x in range(width):
        for y in range(width):
            draw_obj.point((x, y), fill=get_color())
    font = ImageFont.truetype('simhei.ttf', 36)
    # 绘制字母
    for i in range(4):
        draw_obj.text((10+i*20, 40), get_char(), fill=(255, 0, 0), font=font)
    # 绘制干扰线
    draw_obj.line((0, 0, 100, 100), fill='green', width=5)
    img.show()
    

    12 练习 - 绘制九宫格

    TODO

    相关文章

      网友评论

          本文标题:python进阶-11-pillow图像处理

          本文链接:https://www.haomeiwen.com/subject/ktnyehtx.html