好玩的Python图像PIL库实训项目

 一、PIL库学习笔记:

  PIL(Python Image Library)库是Python语言的第三方库,需要通过pip工具安装。(安装::\>pip install pillow   # 或者 pip3 install pillow)支持图像存储、显示和处理,它能够处理几乎所有图片格式,可以完成对图像的缩放、剪裁、叠加以及向图像添加线条、图像和文字等操作。

  PIL库的基本操作:

  1、图像归档(Image Archives)。图像归档以及图像的批处理任务。可以使用PIL创建缩略图,转换图像格式,打印图像等等。

  2、图像展示(Image Display)。

  3、图像处理(Image Processing)。PIL包括了基础的图像处理函数,包括对点的处理,使用众多的卷积核(convolution kernels)做过滤(filter)、颜色空间的转换、图像的大小转换、图像旋转,以及任意的仿射变换。PIL还有一些直方图的方法,可以展示图像的一些统计特性,可以用来实现图像的自动对比度增强,还有全局的统计分析等。

  PIL库Image类解析:

  在PIL中,任何一个图像文件都可以用Image对象表示Image类的图像读取和创建方法。

方法

描述

Image.open(filename)

根据参数加载图像文件

Image.new(mode, size, color)

根据给定参数创建一个新的图像

Image.open(StringIO.StringIO(buffer))

从字符串中获取图像

Image.frombytes(mode, size, data)

根据像素点data创建图像

Image.verify()

对图像文件完整性进行检查,返回异常

  Image类还有4个处理图片的常用属性

属性

描述

Image.format

标识图像格式或来源,如果图像不是从文件读取,值是None

Image.mode

图像的色彩模式,"L"灰度图像、"RGB"真彩色图像、"CMYK"出版图像

Image.size

图像宽度和高度,单位是像素(px),返回值是二元元组(tuple)

Image.palette

调色板属性,返回一个ImagePalette类型

  Image类的图像转换和保存方法如表所示。

方法

描述

Image.save(filename, format)

将图像保存为filename文件名,format是图片格式

Image.convert(mode)

使用不同的参数,转换图像为新的模式

Image.thumbnail(size)

创建图像的缩略图,size是缩略图尺寸的二元元组

  Image类可以缩放和旋转图像,其中,rotate()方法以逆时针旋转的角度值作为参数来旋转图像。

方法

描述

Image.resize(size)

按size大小调整图像,生成副本

Image.rotate(angle)

按angle角度旋转图像,生成副本

  Image类能够对每个像素点或者一幅RGB图像的每个通道单独进行操作,split()方法能够将RGB图像各颜色通道提取出来,merge()方法能够将各独立通道再合成一幅新的图像。

方法

描述

Image.point(func)

根据函数func功能对每个元素进行运算,返回图像副本

Image.split()

提取RGB图像的每个颜色通道,返回图像副本

Image.merge(mode,bands)

合并通道 ,采用mode色彩,bands是新色的色彩通道

Image.blend(im1,im2,alpha)

将两幅图片im1和im2按照如下公式插值后生成新的图像:

im1 * (1.0-alpha) + im2 * alpha

  图像的过滤和增强,PIL库的ImageFilter类和ImageEnhance类提供了过滤图像和增强图像的方法,共10种

方法表示

描述

ImageFilter.BLUR

图像的模糊效果

ImageFilter.CONTOUR

图像的轮廓效果

ImageFilter.DETAIL

图像的细节效果

ImageFilter.EDGE_ENHANCE

图像的边界加强效果

ImageFilter.EDGE_ENHANCE_MORE

图像的阈值边界加强效果

ImageFilter.EMBOSS

图像的浮雕效果

ImageFilter.FIND_EDGES

图像的边界效果

ImageFilter.SMOOTH

图像的平滑效果

ImageFilter.SMOOTH_MORE

图像的阈值平滑效果

ImageFilter.SHARPEN

图像的锐化效果

  ImageEnhance类提供了更高级的图像增强需求,它提供调整色彩度、亮度、对比度、锐化等功能。

方法

描述

ImageEnhance.enhance(factor)

对选择属性的数值增强factor倍

ImageEnhance.Color(im)

调整图像的颜色平衡

ImageEnhance.Contrast(im)

调整图像的对比度

ImageEnhance.Brightness(im)

调整图像的亮度

ImageEnhance.Sharpness(im)

调整图像的锐度

(例)加载一个图片:

>>>from PIL import Image
>>>im = Image.open("D:\\pycodes\\birdnest.jpg")

(例)对一个GIF格式动态文件,提取其中各帧图像,并保存为文件。

from PIL import Image
im = Image.open('pybit.gif')      # 读入一个GIF文件
try:
    im.save('picframe{:02d}.png'.format(im.tell()))
    while True:
        im.seek(im.tell()+1)
        im.save('picframe{:02d}.png'.format(im.tell())) except: print("处理结束")

(例)生成"birdnest.jpg"图像的缩略图,其中(128,128)是缩略图的尺寸。

>>>im.thumbnail((128, 128))
>>>im.save("birdnestTN","JPEG")

 (例)交换图像中的颜色。可以通过分离RGB图片的三个颜色通道实现颜色交换

from PIL import Image
im = Image.open('birdnest.jpg')
r, g, b = im.split()
om = Image.merge("RGB", (b, g, r))
om.save('birdnestBGR.jpg')

 (例)操作图像的每个像素点需要通过函数实现,采用lambda函数和point()方法搭配使用

>>>im = Image.open('D:\\pycodes\\birdnest.jpg') #打开鸟巢文件
>>>r, g, b = im.split() #获得RGB通道数据
>>>newg = g.point(lambda i: i * 0.9) # 将G通道颜色值变为原来的0.9倍
>>>newb = b.point(lambda i: i < 100) # 选择B通道值低于100的像素点
>>>om = Image.merge(im.mode, (r, newg, newb)) # 将3个通道合形成新图像
>>>om.save('D:\\pycodes\\birdnestMerge.jpg') #输出图片

 (例)利用Image类的filter()方法可以使用ImageFilter类,如:Image.filter(ImageFilter.fuction)   图像的轮廓获取。获取图像的轮廓,北京鸟巢变得更加抽象、更具想象空间。

from PIL import Image
from PIL import ImageFilter
im = Image.open('birdnest.jpg')
om = im.filter(ImageFilter.CONTOUR)
om.save('birdnestContour.jpg')

 (例)图像的对比度增强。增强图像的对比度为初始的20倍。

from PIL import Image
from PIL import ImageEnhance
im = Image.open('birdnest.jpg')
om = ImageEnhance.Contrast(im)
om.enhance(20).save('birdnestEnContrast.jpg')

二、处理两张图片:

                          图片一:“me.jpg”                                                                      图片二:“touxiang.jpg”

                  

 (1)a.生成缩略图(压缩后小于10k):

from PIL import Image
im = Image.open("me.jpg")
im.thumbnail((50, 50))
im.save('smallme','PNG')

 运行结果:

from PIL import Image
im = Image.open("touxiang.jpg")
im.thumbnail((50, 50))
im.save('smalltouxiang.png','PNG')

 运行结果:

 b.改变颜色:

from PIL import Image
im = Image.open("me.jpg")
r, g, b = im.split()
om = Image.merge("RGB", (b, g, r))
om.save('colorme.jpg')

运行结果:

from PIL import Image
im = Image.open("touxiang.jpg")

r, g, b = im.split()
om = Image.merge("RGB", (g, r,b))
om.save('colortouxiang.jpg')

运行结果:

 

c.改变轮廓:

from PIL import Image
from PIL import ImageFilter
im = Image.open('touxiang.jpg')
om = im.filter(ImageFilter.FIND_EDGES)
om.save('lunkuotouxiang.jpg')

运行结果:

d.浮雕效果:

from PIL import Image
from PIL import ImageFilter
im = Image.open('touxiang.jpg')
om = im.filter(ImageFilter.EMBOSS)
om.save('fudiaotouxiang.jpg')

运行结果:

三、做一张字符画:

from PIL import Image  

IMG='xin.jpg'  
WIDTH=60  
HEIGHT=45  
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")  

def get_char(r,g,b,alpha=256):

    if alpha==0:  

        return ' '  

    length=len(ascii_char)  

    gray=int(0.2126*r+0.7152*g+0.0722*b)

    unit=(256.0+1)/length  

    return ascii_char[int(gray/unit)]

if __name__=='__main__':  

    im=Image.open(IMG)  

    im=im.resize((WIDTH,HEIGHT),Image.NEAREST)  

    txt=""  

    for i in range(HEIGHT):  

        for j in range(WIDTH):  

            txt+=get_char(*im.getpixel((j,i)))  

        txt+='\n'  

    print (txt)  

    with open("output.txt",'w') as f:  

        f.write(txt)  

运行结果:

猜你喜欢

转载自www.cnblogs.com/nicaihui/p/12693658.html