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裏面巴拉巴拉,雖然有點費時間。

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