python3-PIL图像实战3

发布时间:2021-07-31 00:35:56编辑:run阅读(327)

    使用PIL进行图片处理,PIL提供了许多图像处理的函数,使用点变换来更改像素值对图像实现几何变换


    PIL模块安装

    pip install pillow



    创建缩略图,可以使用thumbnail()函数创建图像的缩略图

    from PIL import Image
    
    im = Image.open(r'D:\image_processing\jpgs\cc.jpg')
    im_thumbnail = im.copy()
    im_thumbnail.thumbnail((100, 100))
    im.paste(im_thumbnail, (10, 10))
    im.save('D:\image_processing\jpgs\cc_1.jpg')
    im.show()

    image.png



    计算图像的基本统计信息,可以使用stat模块来计算一幅图像的基本统计信息(不同通道像素值的平均值,中值,标准差等)

    from PIL import Image
    import PIL.ImageStat as stat
    
    im = Image.open(r'D:\image_processing\jpgs\cc.jpg')
    s = stat.Stat(im)
    # 取图像中每个通道的最大值和最小值
    print(s.extrema)
    
    # 获取图像中每个通道的像素个数
    print(s.count)
    
    # 获取图像中每个通道的像素值之和
    print(s.sum)
    
    # 获取图像中每个通道的像素值平方之和
    print(s.sum2)
    
    # 获取图像中每个通道的像素值的平均值
    print(s.mean)
    
    # 获取图像中每个通道的像素值的中值
    print(s.median)
    
    # 获取图像中每个通道的像素值的均方根值,均方根值,也称方均根值或有效值,
    # 它的计算方法是先平方、再平均、然后开方
    print(s.rms)
    
    # 获取图像中每个通道的像素值的方差值。方差(variance)是在概率论和统计方差衡量随机变量
    # 或一组数据时离散程度的度量。概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。
    # 统计中的方差(样本方差)是各个数据分别与其平均数之差的平方的和的平均数
    print(s.var)
    
    # 获取图像中每个通道的像素值的标准差值。标准差也被称为标准偏差,
    # 标准差(Standard Deviation)描述各数据偏离平均数的距离(离均差)的平均数,
    # 它是方差平方和平均后的方根,用σ表示。标准差是方差的算术平方根。
    # 标准差能反映一个数据集的离散程度,标准偏差越小,这些值偏离平均值就越少,
    # 反之亦然。标准偏差的大小可通过标准偏差与平均值的倍率关系来衡量
    print(s.stddev)



    绘制图像RGB通道像素值的直方图,histogram()函数可用于计算每个通道像素的直方图(像素值与频率表),并返回相关关联的输出-对于RGB图像,输出包含3x256=768个值

    from PIL import Image
    import matplotlib.pylab as plt
    
    im = Image.open(r'D:\image_processing\jpgs\cc.jpg')
    pl = im.histogram()
    plt.bar(range(256), pl[:256], color='r', alpha=0.5)
    plt.bar(range(256), pl[256:2*256], color='g', alpha=0.4)
    plt.bar(range(256), pl[2*256:], color='b', alpha=0.3)
    plt.show()

    image.png

    RGB三色直方图



    分离图像的RGB通道,可以用split()函数来分离多通道图像的通道,对RGB图像实现RGB通道分离

    from PIL import Image
    import matplotlib.pylab as plt
    
    im = Image.open(r'D:\image_processing\jpgs\cc.jpg')
    ch_r,ch_g,ch_b = im.split()
    plt.figure(figsize=(18,6))
    plt.subplot(1,3,1);plt.imshow(ch_r,cmap=plt.cm.Reds);plt.axis('off')
    plt.subplot(1,3,2);plt.imshow(ch_r,cmap=plt.cm.Greens);plt.axis('off')
    plt.subplot(1,3,3);plt.imshow(ch_r,cmap=plt.cm.Blues);plt.axis('off')
    plt.tight_layout()
    plt.show()

    image.png


    合并图像的多个通道。可以使用merge()函数合并多通道图像的通道

    将上面拆分出来的3种颜色通道合并

    from PIL import Image
    
    im = Image.open(r'D:\image_processing\jpgs\cc.jpg')
    ch_r,ch_g,ch_b = im.split()
    im_1 = Image.merge('RGB', (ch_r,ch_g,ch_b))
    im_1.show()

    又会得到原始图像

    image.png



    两幅图像的a-混合。blend()函数可将一个常量a插入两个给定的图像大小相同,从而创建一个新的图像,两个图像的大小和模式必须相同。

    公式:out=(1.0-a)*image1+a*image2

    如果a为0.0,则返回第一个图像的副本;如果a为1.0则返回第二个图像的副本

    from PIL import Image
    import matplotlib.pylab as plt
    
    im1 = Image.open(r'D:\image_processing\jpgs\cc.jpg')
    im2 = Image.open(r'D:\image_processing\jpgs\cc_bei.jpg')
    im1 = im1.convert('RGB')
    im2 = im2.resize((im1.width, im1.height), Image.BILINEAR)
    im = Image.blend(im1, im2, alpha=0.5)
    plt.subplot(221), plt.imshow(im1), plt.title('原图', size=20),plt.axis('off')
    plt.subplot(222), plt.imshow(im2), plt.title('背景图', size=20),plt.axis('off')
    plt.subplot(223), plt.imshow(im), plt.title('合成图', size=20),plt.axis('off')
    plt.show()

    image.png

关键字