Python笔记(三):PIL简单图像处理

目录

 

一、Image.py

二、Image_name.Method()

1. Image.open("Image_name")

2.Image_name.show()

3.Image_name.rotate(0-360)

4.Image_name.format

5.Image_name.size

6.Image_name.mode

7.Image_name.save(self, fp, format=None)

8.Image_name.convert("mode")

9.Image.new("mode",(size_1,size_2),"corlor")

10.Image_name.copy()

11.Image_name.crop(box)

12.Image_name.paste(image,box,mask)

13.Image_name.filter(filter)


一、Image.py

Image是PIL库里面的一个py文件,Image 类里面定义了许多对于图像的操作方法,在对图像进行操作的时候,已经默认将图片类型归入Image类里面,关于使用Image里面的方法,可以Image_name.Method()直接调用。

          

 

如果碰到实在不清楚的内部函数,可以看lib\site-packages\PIL\Image.py  里面的 class  Image 内部如何定义。

二、Image_name.Method()

1. Image.open("Image_name")

处理图片的第一步,打开一个图片,我习惯性的将图片直接放到创建的文件夹中,可以直接以文件名的形式打开,当然也可以根据文件路径来打开,注意路径打开的时候,可能需要将"\"转换成"/"才能正确引入。

电脑中复制的路径,比如:E:\视频照片\Python

引入的时候,需要:E:/视频照片/Python,

或者后面跟"r",即("E:\视频照片\Python","r")

Image.open()直接将beauty_1创建为Image类的对象,所以在后面可以直接用beauty_1.method()调用各种方法对图片对象进行操作

       

没有报错,引入成功了。

还有一点,就是如果用Image.open()不传递给对象的话,是可以直接打开的,在Notebook中,用Image.open()比Image_name.show()好用的多,可以直接在notebook内部查看,但是open()只能显示具有路径的,不能显示程序中的图片对象。

打印一下,看下我的beauty_1是什么类型的:

        

可以直接看到,打印包含了图片的属性,以及所属的类别。

2.Image_name.show()

打开了图片,就要显示出来,Image_name.show()将图片在外部显示出来,刚才将图片传入到beauty_1里面,现在显示出来:

可以看到,美女的样子:

3.Image_name.rotate(0-360)

这是使图像旋转的方法,返回旋转后的图像,角度超过360°的,对360取余,比如旋转45°,beauty_1.rotage(45)

不知道为什么,歪歪的一看,更加撩人了。

打印一下:

这里不知道为什么,类别和原来的不一样了,小白阶段,个人感觉是内部矩阵重组时,使用其他方法,直接生成了一个新的PIL.Image类,而引入的文件不属于PIL内部制造,所以不一样。(有待以后学习并去考证

这样看着感觉原画被裁剪掉了一部分,打开Image.py,查看rotage方法,如下:

resample:滤波器;NEAREST:最近的;expand:扩展的,以及后面波拉波拉的全是空值。

因为刚接触这方面,不如就多走走错路,我不怎么会用这个方法,我就试一试:

先用beauty_2 = beauty_1.rotate(45,1),将扩展置1,是不是在转变后的图片中就能全局显示了呢?:

结果:ValueError: unknown resampling filter  报错,不知道采样滤波器类型,那可能是1 传入了resample中。

这样看来,方法总共需要必传的变量只有一个angle,而resample与expand都是默认的,如果更改的话,需要逐步输入变量,我的写入方法不对,那我一样逐步输入,beauty_2 = beauty_1.rotate(45,NEAREST,1)  试试:

NameError: name 'NEAREST' is not defined  又报错,返回来想,既然函数或方法里面什么变量都可以传,那这个方法里面是不是resample=本身就是一个调用方法的过程,换成 beauty_2 = beauty_1.rotate(45,Image.NEAREST,1)  试试:

结果成功的将美女放了出来,而且是想象中的效果。

多走几步错路,返回来再看原文档的定义,往往使我激动人心,醍醐灌顶,对于变量作用描述如下:

param angle: In degrees counter clockwise.

角度:逆时针旋转

param resample: An optional resampling filter.  

This can be one of :

py:attr:`PIL.Image.NEAREST` (use nearest neighbour),
           py:attr:`PIL.Image.BILINEAR` (linear interpolation in a 2x2 environment), or

py:attr:`PIL.Image.BICUBIC` (cubic spline interpolation in a 4x4 environment).
           If omitted, or if the image has mode "1" or "P", it is set :

py:attr:`PIL.Image.NEAREST`. See :ref:`concept-filters`.

那resample接收到的确认是方法Image的方法:

Image.NEAREST,接近尺度的;

Image.BILINEAR,双线性的;

Image.BICUBIC,双三次的;

默认Image.NEAREST

param expand: Optional expansion flag.

If true, expands the output image to make it large enough to hold the entire rotated image.
           If false or omitted, make the output image the same size as the input image.  

Note that the expand flag assumes rotation around the center and no translation.

可选的扩展标志,

如果是1,则使其最大情况下保持整个图像旋转

如果是0或者省略,则输出图像与原图像大小保持一致。

那么好,rotate(旋转)终于说完了。

4.Image_name.format

返回图片的来源,如果不是引入的图像,而是生成的图像,返回NONE:

beauty_1是外部引入的,有格式,beauty_2是内部重组的,暂时没有输出,没有保存,则暂时没有格式。

5.Image_name.size

这个其实与直接打印"print"显示效果一样:

6.Image_name.mode

这个是显示当前图片的像素格式,比如:二值图像(1),灰度图像(L),真彩图像(RGB)等。

7.Image_name.save(self, fp, format=None)

根据上次rotate()教训,这次直接将定义部分引入,直接从上面查看。

fp: A filename (string), pathlib.Path object or file object.

名字和路径;

format: Optional format override.  If omitted, the format to use is determined from the filename extension. If a file object was used instead of a filename, this parameter should always be used.

保存的时候,foramt使用默认值None,如果使用文件扩展名来保存,则原先的文件扩展名的format会直接覆盖将要生成的图像文件的format,也就是说必须使用扩展名。

returns: None

没有返回值

试着将翻转45°的美女保存在电脑E盘中,

输入了路径与文件名,但是没有加扩展名,如果这样的话,输出的文件将会与之前文件format保持一致,但是beauty_2的format是None,果然,报错,说没有文件的扩展名:

ValueError: unknown file extension: 那么输出的时候,把文件的扩展名添加上,beauty_2.png,结果没有报错,在E盘里,找到了这个保存的旋转45°美女:

现在,再在Notebook中打开这个beauty_2.

看到,beauty_2已经输出一个PNG的beauty了。

再来看,beauty_2的format:

仍然是None,输出保存并不影响程序内部的变量format。

8.Image_name.convert("mode")

该方法转换成其他模式图像,并返回转换后的图像。

首先看一下图片的mode类型:

1 1位像素,黑和白,存成8位的像素
L 8位像素,黑白
P 8位像素,使用调色板映射到任何其他模式
RGB 3× 8位像素,真彩
RGBA 4×8位像素,真彩+透明通道
CMYK 4×8位像素,颜色隔离
YCbCr 3×8位像素,彩色视频格式
I 32位整型像素
F 32位浮点型像素

           再直接查看方法声明:

convert(self, mode=None, matrix=None, dither=None, palette=WEB, colors=256)

param mode: The requested mode. 

直接说要求转换的mode,再看上面:

 The current version supports all possible conversions between "L", "RGB" and "CMYK." The **matrix** argument only supports "L"and "RGB".

这个版本只支持"L","RGB","CMYK"之间的转换,矩阵间只支持"L","RGB"之间的转换。

param matrix: An optional conversion matrix.  If given, this should be 4- or 12-tuple containing floating point values.

参数矩阵:可选的转换矩阵。如果给定,这应该是包含浮点值的4-或12-元组。(看起来像是自定义调色盘)

param dither: Dithering method

used when converting from mode "RGB" to "P" or from "RGB" or "L" to "1".
           Available methods are NONE or FLOYDSTEINBERG (default).

抖动方法,一般情况下默认(小白我不懂)

param palette: Palette to use when converting from mode "RGB" to "P".  Available palettes are WEB or ADAPTIVE.

在RGB转P时,有两个调色盘选择WEB和ADAPTIVE.

param colors: Number of colors to use for the ADAPTIVE palette. Defaults to 256.

用于自适应调色板的颜色数量,默认为256。

这样看起来,除了mode,都可以默认,那就直接Image_name.convert(mode)

beauty_1是RBG图像,转换成1(二值)图像看下:

再转换成L(灰度)图像看下:

这样看起来,第一个小姐姐的皮肤就比较粗糙一点。

9.Image.new("mode",(size_1,size_2),"corlor")

声明中:new(mode, size, color=0 .color默认值为0

先创建一个color默认值为0的图像:

再创建color = 255的图像:

这个color可以有更丰富的设置方法,比如"#FFFFFF"."#F00000",也可以直接命名:

10.Image_name.copy()

返回一个除了id不一样,其他都一样的图片对象。

如果直接image_a = image_b,改动其中任意一个,另一个都会改变。

11.Image_name.crop(box)

挑两句声明中重要的话:

 Returns a rectangular region from this image.

返回一个从原画上裁下来的矩形

param box: The crop rectangle, as a (left, upper, right, lower)

box:原画上的矩形边座标(左,上,右,下)分别表示与边的距离,以像素值为单位。

12.Image_name.paste(image,box,mask)

看内部声明部分:

Pastes another image into this image. 

将另一个图像粘贴进入当前图像。

If a 4-tuple is given,the size of the pasted image must match the size of the region.

如果传入的是4元组(上下左右都有),box的设置大小,与传入的图像大小保持一致。

If the modes don't match, the pasted image is converted to the mode of this image

如果不匹配,粘贴的图像自动转换成当前图像的mode。

Instead of an image, the source can be a integer or tuple containing pixel values.

插入的也可以是矩阵或数组

the box defaults to (0, 0)

box默认(0,0)

现在试着粘上去一张:

13.Image_name.filter(filter)

看下内部声明:

 Filters this image using the given filter.

使用给定的过滤器过滤此图像,那么filter = 具体的滤波器名字,不同的滤波器有不同的功能。

关于滤波器,lib\site-packages\PIL\ImageFilter给出了很多,下面挑出两个:

寻找轮廓 ImageFilter.CONTOUR:

得到结果:

边缘检测ImageFilter.FIND_EDGES:

如果找更多的方法的话,可一网上找下资料,自己再去Image.py里面巴拉巴拉,虽然有点费时间。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章