最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python用Pillow(PIL)進(jìn)行簡(jiǎn)單的圖像操作方法

 更新時(shí)間:2017年07月07日 10:18:57   投稿:jingxian  
下面小編就為大家?guī)硪黄狿ython用Pillow(PIL)進(jìn)行簡(jiǎn)單的圖像操作方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

Python用Pillow(PIL)進(jìn)行簡(jiǎn)單的圖像操作方法

顏色與RGBA值

計(jì)算機(jī)通常將圖像表示為RGB值,或者再加上alpha值(通透度,透明度),稱為RGBA值。在Pillow中,RGBA的值表示為由4個(gè)整數(shù)組成的元組,分別是R、G、B、A。整數(shù)的范圍0~255。RGB全0就可以表示黑色,全255代表黑色??梢圆聹y(cè)(255, 0, 0, 255)代表紅色,因?yàn)镽分量最大,G、B分量為0,所以呈現(xiàn)出來是紅色。但是當(dāng)alpha值為0時(shí),無論是什么顏色,該顏色都不可見,可以理解為透明。

from PIL import ImageColor
print(ImageColor.getcolor('red', 'RGBA'))
# 也可以只以RBG的方式查看
print(ImageColor.getcolor('black', 'RGB'))
(255, 0, 0, 255)
(0, 0, 0)

圖像的坐標(biāo)表示

圖像中左上角是坐標(biāo)原點(diǎn)(0, 0),這和平常數(shù)學(xué)里的坐標(biāo)系不太一樣。這樣定義的坐標(biāo)系意味著,X軸是從左到右增長(zhǎng)的,而Y軸是從上到下增長(zhǎng)。

在Pillow中如何使用上述定義的坐標(biāo)系表示一塊矩形區(qū)域?許多函數(shù)或方法要求提供一個(gè)矩形元組參數(shù)。元組參數(shù)包含四個(gè)值,分別代表矩形四條邊的距離X軸或者Y軸的距離。順序是(左,頂,右,底)。右和底坐標(biāo)稍微特殊,表示直到但不包括??梢岳斫鉃閇左, 右)和[頂, 底)這樣左閉右開的區(qū)間。比如(3, 2, 8, 9)就表示了橫坐標(biāo)范圍[3, 7];縱坐標(biāo)范圍[2, 8]的矩形區(qū)域。

使用Pillow操作圖像

了解了一些基礎(chǔ)知識(shí),可以上手了。首先從讀取圖片開始,很多圖像處理庫(如opencv)都以imread()讀取圖片。Pillow中使用open方法。

from PIL import Image

im_path = r'F:\Jupyter Notebook\csv_time_datetime_PIL\rabbit.jpg'
im = Image.open(im_path)
width, height = im.size
# 寬高
print(im.size, width, height)
# 格式,以及格式的詳細(xì)描述
print(im.format, im.format_description)

im.save(r'C:\Users\Administrator\Desktop\rabbit_copy.jpg')
im.show()
(1920, 1080) 1920 1080
JPEG JPEG (ISO 10918)

im.size返回一個(gè)元組,分別是寬和高。show()方法會(huì)調(diào)用系統(tǒng)默認(rèn)圖像查看軟件,打開并顯示。im.format可查看圖像的格式。save()可保存處理后的圖片,如果未經(jīng)處理,保存后的圖像占用的空間(字節(jié)數(shù))一般也與原圖像不一樣,可能經(jīng)過了壓縮。

新建圖像

Pillow也可以新建空白圖像, 第一個(gè)參數(shù)是mode即顏色空間模式,第二個(gè)參數(shù)指定了圖像的分辨率(寬x高),第三個(gè)參數(shù)是顏色。

可以直接填入常用顏色的名稱。如'red'

也可以填入十六進(jìn)制表示的顏色,如#FF0000表示紅色。

還能傳入元組,比如(255, 0, 0, 255)或者(255, 0, 0)表示紅色。

# 通常使用RGB模式就可以了
newIm= Image.new('RGB', (100, 100), 'red')
newIm.save(r'C:\Users\Administrator\Desktop\1.jpg')

# 也可以用RGBA模式,還有其他模式查文檔吧
blcakIm = Image.new('RGB',(200, 100), 'red')
blcakIm.save(r'C:\Users\Administrator\Desktop\2.jpg')
# 十六進(jìn)制顏色
blcakIm = Image.new('RGBA',(200, 100), '#FF0000')
blcakIm.save(r'C:\Users\Administrator\Desktop\3.jpg')
# 傳入元組形式的RGBA值或者RGB值
# 在RGB模式下,第四個(gè)參數(shù)失效,默認(rèn)255,在RGBA模式下,也可只傳入前三個(gè)值,A值默認(rèn)255
blcakIm = Image.new('RGB',(200, 100), (255, 255, 0, 120))
blcakIm.save(r'C:\Users\Administrator\Desktop\4.jpg')

裁剪圖像

Image有個(gè)crop()方法接收一個(gè)矩形區(qū)域元組(上面有提到)。返回一個(gè)新的Image對(duì)象,是裁剪后的圖像,對(duì)原圖沒有影響。

im = Image.open(im_path)
cropedIm = im.crop((700, 100, 1200, 1000))
cropedIm.save(r'C:\Users\Administrator\Desktop\cropped.jpg')

看下原圖和裁剪后的圖像。

原圖

裁剪后

復(fù)制與粘貼圖像到另一個(gè)圖像

Image的copy函數(shù)如其名會(huì)產(chǎn)生一個(gè)原圖像的副本,在這個(gè)副本上的任何操作不會(huì)影響到原圖像。paste()方法用于將一個(gè)圖像粘貼(覆蓋)在另一個(gè)圖像上面。誰調(diào)用它,他就在該Image對(duì)象上直接作修改。

im = Image.open(im_path)
cropedIm = im.crop((700, 100, 1200, 1000))
im.paste(cropedIm, (0, 0))
im.show()
im.save(r'C:\Users\Administrator\Desktop\paste.jpg')

im.show()顯示圖像發(fā)現(xiàn)這時(shí)im(即原圖)已經(jīng)被改變。

這如果之后還會(huì)用到原圖的信息,由于信息被改變就很麻煩。所以paste前最好使用copy()復(fù)制一個(gè)副本,在此副本操作,不會(huì)影響到原圖信息。雖然在程序里原圖信息已改變,但由于保存文件時(shí)用的其他文件名,相當(dāng)于改變沒有生效,所以查看的時(shí)候原圖還是沒有改變的。

im = Image.open(im_path)
cropedIm = im.crop((700, 100, 1200, 1000))
copyIm = im.copy()
copyIm.paste(cropedIm, (0, 0))
im.show()
copyIm.save(r'C:\Users\Administrator\Desktop\paste.jpg')

這回再看原圖,沒有改變了。這就保證了之后再次使用im時(shí),里面的信息還是原汁原味。來看個(gè)有趣的例子。

im = Image.open(im_path)
cropedIm = im.crop((700, 100, 1200, 1000))

crop_width, crop_height = cropedIm.size
width, height = im.size

copyIm = im.copy()
for left in range(0, width, crop_width):
  for top in range(0, height, crop_height):
    copyIm.paste(cropedIm, (left, top))

copyIm.save(r'C:\Users\Administrator\Desktop\dupli-rabbit.jpg')

以裁剪后的圖像寬度和高度為間隔,在循環(huán)內(nèi)不斷粘貼在副本中,這有點(diǎn)像是在拍證件照。

調(diào)整圖像的大小

resize方法返回指定寬高度的新Image對(duì)象,接受一個(gè)含有寬高的元組作為參數(shù)。寬高的值得是整數(shù)。

im = Image.open(im_path)
width, height = im.size
resizedIm = im.resize((width, height+(1920-1080)))
resizedIm.save(r'C:\Users\Administrator\Desktop\resize.jpg')

兔子瘦了,可以看到resize不是等比例縮放的。

旋轉(zhuǎn)和翻轉(zhuǎn)圖像

rotate()返回旋轉(zhuǎn)后的新Image對(duì)象, 保持原圖像不變。逆時(shí)針旋轉(zhuǎn)。

im = Image.open(im_path)
im.rotate(90).save(r'C:\Users\Administrator\Desktop\rotate90.jpg')
im.rotate(270).save(r'C:\Users\Administrator\Desktop\rotate270.jpg')
im.rotate(180).save(r'C:\Users\Administrator\Desktop\rotate180.jpg')
im.rotate(20).save(r'C:\Users\Administrator\Desktop\rotate20.jpg')
im.rotate(20, expand=True).save(r'C:\Users\Administrator\Desktop\rotate20_expand.jpg')

90

180

270

20

由上到下,分別是旋轉(zhuǎn)了90°,180°, 270°、普通的20°,加了參數(shù)expand=True旋轉(zhuǎn)的20°。expand放大了圖像尺寸(變成了2174x1672),使得邊角的圖像不被裁剪(四個(gè)角剛好貼著圖像邊緣)。再看旋轉(zhuǎn)90°、270°時(shí)候圖像被裁剪了,但是如下查看圖像的寬高,確是和原圖一樣,搞不懂。

im90 = Image.open(r'C:\Users\Administrator\Desktop\rotate90.jpg')
im270 = Image.open(r'C:\Users\Administrator\Desktop\rotate270.jpg')
# 寬高信息并沒有改變
print(im90.size, im270.size)
(1920, 1080) (1920, 1080)

圖像的鏡面翻轉(zhuǎn)。transpose()函數(shù)可以實(shí)現(xiàn),必須傳入Image.FLIP_LEFT_RIGHT或者Image.FLIP_TOP_BOTTOM,第一個(gè)是水平翻轉(zhuǎn),第二個(gè)是垂直翻轉(zhuǎn)。

im = Image.open(im_path)
im.transpose(Image.FLIP_LEFT_RIGHT).save(r'C:\Users\Administrator\Desktop\transepose_lr.jpg')
im.transpose(Image.FLIP_TOP_BOTTOM).save(r'C:\Users\Administrator\Desktop\transepose_tb.jpg')

水平翻轉(zhuǎn)

水平翻轉(zhuǎn)看不出來,原圖就是水平對(duì)稱的...

垂直翻轉(zhuǎn)

垂直翻轉(zhuǎn)就明顯了...

圖像過濾

Pillow使用ImageFilter可以簡(jiǎn)單做到圖像的模糊、邊緣增強(qiáng)、銳利、平滑等常見操作。

from PIL import Image, ImageFilter

im = Image.open(im_path)
# 高斯模糊
im.filter(ImageFilter.GaussianBlur).save(r'C:\Users\Administrator\Desktop\GaussianBlur.jpg')
# 普通模糊
im.filter(ImageFilter.BLUR).save(r'C:\Users\Administrator\Desktop\BLUR.jpg')
# 邊緣增強(qiáng)
im.filter(ImageFilter.EDGE_ENHANCE).save(r'C:\Users\Administrator\Desktop\EDGE_ENHANCE.jpg')
# 找到邊緣
im.filter(ImageFilter.FIND_EDGES).save(r'C:\Users\Administrator\Desktop\FIND_EDGES.jpg')
# 浮雕
im.filter(ImageFilter.EMBOSS).save(r'C:\Users\Administrator\Desktop\EMBOSS.jpg')
# 輪廓
im.filter(ImageFilter.CONTOUR).save(r'C:\Users\Administrator\Desktop\CONTOUR.jpg')
# 銳化
im.filter(ImageFilter.SHARPEN).save(r'C:\Users\Administrator\Desktop\SHARPEN.jpg')
# 平滑
im.filter(ImageFilter.SMOOTH).save(r'C:\Users\Administrator\Desktop\SMOOTH.jpg')
# 細(xì)節(jié)
im.filter(ImageFilter.DETAIL).save(r'C:\Users\Administrator\Desktop\DETAIL.jpg')

另外,若是要進(jìn)行圖案、文字的繪制,可使用ImageDraw。Pillow還有其他強(qiáng)大功能,就不一一列舉了。

其實(shí),Pillow只是個(gè)基礎(chǔ)的圖像處理庫。若不深入圖像處理,已經(jīng)夠用。專業(yè)人士使用opencv是更好地選擇。Python中使用import cv2開始使用吧!

以上這篇Python用Pillow(PIL)進(jìn)行簡(jiǎn)單的圖像操作方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python解析m3u8拼接下載mp4視頻文件的示例代碼

    Python解析m3u8拼接下載mp4視頻文件的示例代碼

    這篇文章主要介紹了Python解析m3u8拼接下載mp4視頻文件的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Python中Yield的基本用法

    Python中Yield的基本用法

    這篇文章主要給大家介紹了關(guān)于Python中Yield的基本用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Python操作MySQL的方法詳細(xì)解讀

    Python操作MySQL的方法詳細(xì)解讀

    這篇文章主要介紹了Python操作MySQL的方法詳細(xì)解讀,在Python中,通過使用第三方庫:pymysql,完成對(duì)MySQL數(shù)據(jù)庫的操作,Python操作MySQL并不難,難點(diǎn)是如何編寫合適的SQL語句,需要的朋友可以參考下
    2023-11-11
  • 如何在python中實(shí)現(xiàn)capl語言里的回調(diào)函數(shù)(推薦)

    如何在python中實(shí)現(xiàn)capl語言里的回調(diào)函數(shù)(推薦)

    CAPL是一種程序語言,其中程序塊的執(zhí)行由事件控制,主要介紹了如何在python中實(shí)現(xiàn)capl語言里的回調(diào)函數(shù)及事件函數(shù)的作用,需要的朋友可以參考下
    2022-08-08
  • Python自動(dòng)化神器Playwright的用法詳解

    Python自動(dòng)化神器Playwright的用法詳解

    python Playwright 是一個(gè) Python 庫,它提供了一個(gè)高級(jí) API,用于自動(dòng)化 Web 瀏覽器,它支持 chrome、firefox 和 webkit 瀏覽器,并提供了一種簡(jiǎn)單易用的方法來模擬用戶在瀏覽器中的行為,本文小編將詳細(xì)的給大家介紹一下Python自動(dòng)化神器Playwright的用法
    2025-04-04
  • Python中的random.choices函數(shù)用法詳解

    Python中的random.choices函數(shù)用法詳解

    這篇文章主要給大家介紹了關(guān)于Python中random.choices函數(shù)用法的相關(guān)資料,random.random()?的功能是隨機(jī)返回一個(gè)?0-1范圍內(nèi)的浮點(diǎn)數(shù),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • Python descriptor(描述符)的實(shí)現(xiàn)

    Python descriptor(描述符)的實(shí)現(xiàn)

    這篇文章主要介紹了Python descriptor(描述符)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • python自動(dòng)化測(cè)試selenium核心技術(shù)等待條件教程

    python自動(dòng)化測(cè)試selenium核心技術(shù)等待條件教程

    這篇文章主要為大家介紹了python自動(dòng)化測(cè)試selenium核心技術(shù)等待條件教程的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • 使用Python對(duì)IP進(jìn)行轉(zhuǎn)換的一些操作技巧小結(jié)

    使用Python對(duì)IP進(jìn)行轉(zhuǎn)換的一些操作技巧小結(jié)

    這篇文章主要介紹了使用Python對(duì)IP進(jìn)行轉(zhuǎn)換的一些操作技巧小結(jié),包括使用socket模塊里的相關(guān)函數(shù)和匿名函數(shù)實(shí)現(xiàn),需要的朋友可以參考下
    2015-11-11
  • Python微信操控itchat的方法

    Python微信操控itchat的方法

    itchat是一個(gè)開源的微信個(gè)人號(hào)接口,使用python調(diào)用微信從未如此簡(jiǎn)單。這篇文章主要介紹了Python微信操控itchat的方法,需要的朋友可以參考下
    2019-05-05

最新評(píng)論

泰顺县| 华安县| 濮阳县| 林芝县| 三都| 叶城县| 旬阳县| 肇州县| 麦盖提县| 黄冈市| 双城市| 都匀市| 南木林县| 龙里县| 德州市| 白沙| 承德市| 灌云县| 开化县| 正宁县| 平原县| 六安市| 新源县| 宜君县| 竹山县| 集安市| 依安县| 扶风县| 东辽县| 屏东县| 阿荣旗| 九江县| 资兴市| 来凤县| 盖州市| 麻栗坡县| 夏津县| 西和县| 嘉峪关市| 贺州市| 深州市|