当前位置 博文首页 > python PIL 图像处理库简介(一)_weixin_39816027的博客:python

    python PIL 图像处理库简介(一)_weixin_39816027的博客:python

    作者:[db:作者] 时间:2021-09-10 22:42

    >>> im_resize.show()

    >>> im_resize_box = im.resize((100,100),box = (0,0,50,50))

    >>> im_resize_box.show()

    ```

    resize方法可以将原始的图像转换大小,size是转换之后的大小,resample是重新采样使用的方法,仍然有`Image.BICUBIC`,`PIL.Image.LANCZOS`,`PIL.Image.BILINEAR`,`PIL.Image.NEAREST`这四种采样方法,默认是`PIL.Image.NEAREST`,box是指定的要resize的图像区域,是一个用四个元组指定的区域(含义和上面所述box一致)。

    - **convert(mode,matrix,dither,palette,colors)**(mode转换)

    ```python

    >>> im_L = im.convert("L")

    >>> im_L.show()

    >>> im_rgb = im_L.convert("RGB")

    >>> im_rgb.show()

    >>> im_L.mode

    'L'

    >>> im_rgb.mode

    'RGB'

    ```

    convert方法可以改变图像的mode,一般是在'RGB'(真彩图)、'L'(灰度图)、'CMYK'(压缩图)之间转换。上面的代码就是首先将图像转化为灰度图,再从灰度图转化为真彩图。值得注意的是,从灰度图转换为真彩图,虽然理论上确实转换成功了,但是实际上是很难恢复成原来的真彩模式的(不唯一)。

    - **filter(filter)**(应用过滤器)

    ```python

    >>> im = Image.open("dog.jpg","r")

    >>> from PIL import ImageFilter

    >>> im_blur = im.filter(ImageFilter.BLUR)

    >>> im_blur.show()

    >>> im_find_edges = im.filter(ImageFilter.FIND_EDGES)

    >>> im_find_edges.show()

    >>> im_find_edges.save("find_edges.jpg")

    >>> im_blur.save("blur.jpg")

    ```

    filter方法可以将一些过滤器操作应用于原始图像,比如模糊操作,查找边、角点操作等。filter是过滤器函数,在`PIL.ImageFilter`函数中定义了大量内置的filter函数,比如`BLUR`(模糊操作),`GaussianBlur`(高斯模糊),`MedianFilter`(中值过滤器),`FIND_EDGES`(查找边)等。上面得到原始图像dog.jpg,find_edges.jpg以及blur.jpg从左到右如下图1所示:

    o_1cf1lk17c1pnfnoh1t3t1f7a1hj2a.jpg-w.jpg

    图1 从左到右分别是:dog.jpg,find_edges.jpg以及blur.jpg

    point(lut,mode)(对图像像素操作)

    >>> im_point = im.point(lambda x:x*1.5)

    >>> im_point.show()

    >>> im_point.save("im_point.jpg")

    point方法可以对图像进行单个像素的操作,上面的代码对point方法传入了一个匿名函数,表示将图像的每个像素点大小都乘以1.5,mode是返回的图像的模式,默认是和原来图像的mode是一样的。图2是原来的dog.jpg和point操作之后的im_point.jpg之间的对比。

    o_1cf1m7ag59cl1u9q1t57mc0oj6a.jpg-w.jpg

    图2 dog.jpg和point操作之后的im_point.jpg

    下面是一个结合了`point`函数,`split`函数,`paste`函数以及`merge`函数的小例子。

    ```python

    >>> source = im.split()

    >>> R,G,B = 0,1,2

    >>> mask = source[R].point(lambda x: x<100 and 255)

    >>> # x<100,return 255,otherwise return 0

    >>> out_G = source[G].point(lambda x:x*0.7)

    >>> # 将out_G粘贴回来,但是只保留'R'通道像素值<100的部分

    >>> source[G].paste(out_G,None,mask)

    >>> # 合并成新的图像

    >>> im_new = Image.merge(im.mode,source)

    >>> im_new.show()

    >>> im.show()

    ```

    - **ImageEnhance()**(图像增强)

    ```python

    >>> from PIL import ImageEnhance

    >>> brightness = ImageEnhanBce.Brightness(im)

    >>> im_brightness = brightness.enhance(1.5)

    >>> im_brightness.show()

    >>> im_contrast = ImageEnhance.Contrast(im)

    >>> im_contrast.enhance(1.5)

    >>> im_contrast.enhance(1.5).show()

    ```

    ImageEnhance是PIL下的一个子类,主要用于图像增强,比如增加亮度(Brightness),增加对比度(Contrast)等。上面的代码将原来图像的亮度增加50%,将对比度也增加了50%。

    - **ImageSequence()**(处理图像序列)

    下面的代码可以遍历gif图像中的所有帧,并分别保存为图像

    ```python

    >>> from PIL import ImageSequence

    >>> from PIL import Image

    >>> gif = Image.open("pipixia.gif")

    >>> for i,frame in enumerate(ImageSequence.Iterator(gif),1):

    ... if frame.mode == 'JPEG':

    ... frame.save("%d.jpg" %i)

    ... else:

    ... frame.save("%d.png" % i)

    ```

    除了上面使用迭代器的方式以外,还可以一帧一帧读取gif,比如下面的代码:

    ```python

    >>> index = 0

    >>> while 1:

    ... try:

    ... gif.seek(index)

    ... gif.save("%d.%s" %(index,'jpg' if gif.mode == 'JPEG' else 'png'))

    ... index += 1

    ... except EOFError:

    ... print("Reach the end of gif sequence!")

    ... break

    ```

    上面的代码在读取到gif的最后一帧之后,会throw 一个 EOFError,所以我们只要捕获这个异常就可以了。

    cs