nodejs 圖片處理模塊 rotate_學會Pillow再也不用PS啦——Python圖像處理庫Pillow入門!...

你在用什么軟件進行圖像處理呢?厭倦了鼠標和手指的拖拖點點,想不想用程序和代碼進行圖像的高效處理,Python作為簡單高效又很強大的一門編程語言,對于圖像的處理自然也是輕松拿下,聽起來是不是很酷很極客,那么就跟著我來看看吧!

一、Python的強大圖像處理庫——Pillow

工欲善其事必先利其器, Python的標準庫中雖然沒有直接支持圖像處理操作的模塊,但我們可以通過Python生態圈中的第三方庫來完成這些操作。

1 什么是Pillow:

Pillow作為python的第三方圖像處理庫,提供了廣泛的文件格式支持,強大的圖像處理能力,主要包括圖像儲存、圖像顯示、格式轉換以及基本的圖像處理操作等。

2 Pillow與PIL的關系:

PIL(Python Image Library)是python的第三方圖像處理庫,因其強大的功能與眾多的使用人數,幾乎已經被認為是python官方圖像處理庫了。但由于PIL僅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基礎上創建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了許多新特性,因此,我們可以直接安裝使用Pillow。

二、安裝Pillow

如果安裝了Anaconda,Pillow就已經可用了。

否則,需要在命令行下通過pip安裝:

pip install pillow

三、基本操作

1 使用 Image 類:

PIL最重要的類是 Image class, 讀取和處理圖像都要通過這個類來完成。我們可以通過多種方法創建這個類的實例,你可以從文件加載圖像,或者處理其他圖像, 或者從 scratch 創建。

要從文件加載圖像,請使用Image模塊中的open函數:

from PIL import Image
# 打開一個jpg圖像文件,注意是當前路徑:
im = Image.open('cat.jpg')

溫馨提示:向左滑動可查看完整代碼~)

如果成功,這個函數返回Image對象。您現在可以使用實例屬性來檢查文件內容:

print(im.format, im.size, im.mode)
JPEG (1920, 1200) RGB

format屬為圖像來源。如果不是從文件讀取就是None。

size屬性是包含寬度和高度(像素)的二元組)。

mode屬性定義了圖像中波段的數量和名稱,以及像素類型和深度。常見模式為灰度圖像為“L”(亮度),真彩色圖像為“RGB”,印刷四色為“CMYK”。

獲得了Image類的實例,就可以使用此類定義的方法來處理和操作圖像。例如讓我們顯示剛剛加載的圖像:

im.show()

04f870b7aa550913cad66fa306fbc8de.png

接下來讓我們看看一些具體的圖像處理操作吧~

2 保存指定格式的圖像

save(filename,format) :

im.save("cat.jpg",'png')

上面的代碼將圖像重新保存成png格式

3 剪裁矩形區域 crop(box)

box是一個有四個數字的元組(upper_left_x,upper_left_y,lower_right_x,lower_right_y),分別表示裁剪矩形區域的左上角x,y坐標,右下角的x,y坐標,規定圖像的最左上角的坐標為原點(0,0),寬度的方向為x軸,高度的方向為y軸,每一個像素代表一個坐標單位。

crop()返回的仍然是一個Image對象。

im = Image.open("cat.jpg","r")
box = (300,300,800,800)
region = im.crop(box)
region.show()
im.crop()

上面的代碼在im圖像上裁剪了一個box矩形區域,然后顯示出來,效果如圖:

4d1a18404ab8776f69d07b045f8567d5.png

109a906749aef7e8e565be76329f8041.png

4 圖像粘貼 paste(region,box,mask)

region是要粘貼的Image對象,box是要粘貼的位置,可以是一個兩個元素的元組,表示粘貼區域的左上角坐標,也可以是一個四個元素的元組,表示左上角和右下角的坐標。如果是四個元素元組的話,box的size必須要和region的size保持一致,否則將會被convert成和region一樣的size。

im.paste(region,(100,100),None)
im.show()

上面的代碼將region圖像粘貼到左上角為(100,100)的位置,效果如圖所示:

a4bf61bca837be1a72e5950c4455bfc6.png

5 生成縮略圖 thumbnail(size,resample)

thumbnail可以創建一個指定大小(size)的縮略圖,需要注意的是,thumbnail方法是原地操作,返回值是None。第一個參數是指定的縮略圖的大小,第二個是采樣的,有Image.BICUBIC,PIL.Image.LANCZOS,PIL.Image.BILINEAR,PIL.Image.NEAREST這四種采樣方法。默認是Image.BICUBIC。

im.thumbnail((200,200),resample=Image.BICUBIC)
im.show()

上面的代碼形成了一個200×200的縮略圖,效果如圖:

1dc3064ee35a7232e33dd1c335eb567f.png

6 旋轉和翻轉 transpose(method)

method是transpose的參數,表示選擇什么樣的翻轉或者旋轉方式,可以選擇的值有:

- Image.FLIP_LEFT_RIGHT,表示將圖像左右翻轉

- Image.FLIP_TOP_BOTTOM,表示將圖像上下翻轉

- Image.ROTATE_90,表示將圖像逆時針旋轉90°

- Image.ROTATE_180,表示將圖像逆時針旋轉180°

- Image.ROTATE_270,表示將圖像逆時針旋轉270°

- Image.TRANSPOSE,表示將圖像進行轉置(相當于順時針旋轉90°)

- Image.TRANSVERSE,表示將圖像進行轉置,再水平翻轉

im_rotate_180 = im.transpose(Image.ROTATE_180)
im_rotate_180.show()

上面的代碼將im逆時針旋轉180°,然后顯示出來,效果如下圖:

699b2abc058b8efdc15955747bf74ea9.png

7 顏色通道分離split())

split()方法可以原來圖像的各個通道分離,比如對于RGB圖像,可以將其R,G,B三個顏色通道分離。

r,g,b = im.split()
r.show()
g.show()
b.show()

上面的代碼將小貓圖像的RGB顏色通道分離,效果如圖:

ab4708a31a550f9de95b4313ad92b5e2.png

6e20f6dc833f4452536d83c92515b9e5.png

1b968ad3f5fb0a6b76b064e4ebe03801.png

8 顏色通道合并merge(mode,channels)

merge方法和split方法是相對的,其將多個單一通道的序列合并起來,組成一個多通道的圖像,mode是合并之后圖像的模式,比如"RGB",channels是多個單一通道組成的序列。

im_merge = Image.merge("RGB",[b,r,g])
im_merge.show()

上面的代碼將小貓圖像的顏色通道合并,效果如下圖:

c9a3d5d1008634e6dfb734a4d984ab7b.png

9 顏色模式轉換

convert(mode,matrix,dither,palette,colors)

convert方法可以改變圖像的模式(mode),一般是在'RGB'(真彩圖)、'L'(灰度圖)、'CMYK'(壓縮圖)之間轉換。

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

上面的代碼就是將圖像轉化為灰度圖。效果如下圖:

614cae7b2b44b084b102e1e2c291678f.png

10 圖像過濾器 filter(filter)

filter方法可以將一些過濾器操作應用于原始圖像,比如模糊,邊緣增強、浮雕等。filter是過濾器函數,在PIL.ImageFilter函數中定義了大量內置的filter函數,比如BLUR(普通模糊),GaussianBlur(高斯模糊) FIND_EDGES(查找邊)等

from PIL import Image, ImageFilter
im = Image.open('cat.jpg')
# 高斯模糊
im_gaussianblur = im.filter(ImageFilter.GaussianBlur)
im_gaussianblur.show()
# 普通模糊
im_blur = im.filter(ImageFilter.BLUR)
im_blur.show()
# 找到邊緣
im_find_edge = im.filter(ImageFilter.FIND_EDGES)
im_find_edges.show()
# 浮雕
im_emboss = im.filter(ImageFilter.EMBOSS)
im_emboss.show()
# 輪廓
im_contour = im.filter(ImageFilter.CONTOUR)
im_contour.show()
# 銳化
im_sharpen = im.filter(ImageFilter.SHARPEN)
im_sharpen.show()
# 平滑
im_smooth = im.filter(ImageFilter.SMOOTH)
im_smooth.show()
# 細節
im_detail = im.filter(ImageFilter.DETAIL)
im_detail.show()

下圖依次為浮雕與輪廓效果:

c6f1eb7fc676797f05fd95b1c3b9c478.png

8a32be88a41498b7bff6f05ffd7c3de5.png

11 圖像增強ImageEnhance()

圖像增強也是圖像預處理中的一個基本技術,Pillow中的圖像增強函數主要在ImageEnhance模塊下,通過該模塊可以調節圖像的白平衡(Color)、亮度(Brightness)、對比度(Contrast)和銳化(Sharpness)等。

from PIL import ImageEnhance
brightness = ImageEnhance.Brightness(im)
im_brightness = brightness.enhance(1.5)
im_brightness.show()

上面的代碼將原來圖像的亮度增加50%,效果如下圖:

b32f41212cdee5f765ef246922ee4163.png

四、練習項目——圖片轉字符畫

看完了上面的操作是不是手癢癢呢,下面我們一起來做一個有趣的練手項目吧~

主要思路

讀取彩色圖片的RGB值,利用公式轉化為灰度值,將圖片的灰度值與你自己設定的字符集之間建立映射關系,不同區間的灰度值對應不同的字符。最后將每個像素對應的字符按照原位置打印出來

測試圖片與結果:

7531c0412b16b9fa2442272198085626.png

操作代碼:

# -*- coding: utf-8 -*-
from PIL import Image
codeLib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^`'. '''#生成字符畫所需的字符集
count = len(codeLib)
def transform1(image_file):image_file = image_file.convert("L") #轉換為黑白圖片,參數"L"表示黑白模式codePic = ''for h in range(0,image_file.size[1]):  #size屬性表示圖片的分辨率,'0'為橫向大小,'1'為縱向for w in range(0,image_file.size[0]):gray = image_file.getpixel((w,h)) #返回指定位置的像素,如果所打開的圖像是多層次的圖片,那這個方法就返回一個元組codePic = codePic + codeLib[int(((count-1)*gray)/256)]#建立灰度與字符集的映射codePic = codePic+'rn'return codePicdef transform2(image_file):codePic = ''for h in range(0,image_file.size[1]):for w in range(0,image_file.size[0]):g,r,b = image_file.getpixel((w,h))gray = int(r* 0.299+g* 0.587+b* 0.114)codePic = codePic + codeLib[int(((count-1)*gray)/256)]codePic = codePic+'rn'return codePicfp = open(u'gray.jpg','rb')
image_file = Image.open(fp)
image_file=image_file.resize((int(image_file.size[0]*0.75), int(image_file.size[1]*0.5)))#調整圖片大小
print(u'Info:',image_file.size[0],' ',image_file.size[1],' ',count)tmp = open('tmp.txt','w')
tmp.write(transform1(image_file))
tmp.close()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260790.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260790.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260790.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

創建一個追蹤攝像機(2)

為了生成曲線&#xff0c;函數需要通過4個在沿著重量值在0和1之間的路徑上連貫的位置。由于重量在這些2個值之間增加&#xff0c;曲線返回在更遠的路徑上的坐標。 當所提供的重量值為0&#xff0c;曲線將返回正確的坐標在第二個輸入坐標。當所提供的重量值為1&#xff0c;曲線將…

Xcodebuild自動打包

#! /bin/bash #firtoken 29b441056e1e17c984cb32fadadsdddd shell_dirdirname $0 TARGET_NAME"SmartLock" DIR_PATH/Users/用戶名/Desktop/SmartLock SIGN"iPhone Distribution:******" PROFILE"66d127d6-7963-4c20-ac8b-47e4f0fe8742" TEMP_DIR…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波12 - 空間域濾波基礎 - 卷積運算(numpy 實現的三種卷積運算)

這篇文章比較長&#xff0c;請耐心看空間域濾波基礎線性濾波可分離濾波器核空間域濾波和頻率域濾波的一些重要比較如何構建空間濾波器第一種卷積方法&#xff08;公式法&#xff09;第二種卷積的方法&#xff08;可分離核&#xff09;第三種方法&#xff08;img2col)這是分離核…

hdu_1861_游船出租_201402282130

游船出租 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7238 Accepted Submission(s): 2411 Problem Description 現有公園游船租賃處請你編寫一個租船管理系統。當游客租船時&#xff0c;管理員輸入船號并按…

acer清理工具 clear下載_SolidWorks綠色版下載-SolidWorks完全清理工具v1.0免費版

SolidWorks完全清理工具(SWCleanUninstall)是一款綠色免費的SolidWorks完全卸載工具。很多SolidWorks安裝不成功都是因為之前安裝錯誤做成軟件殘留。這款工具可以完全清理很多SolidWorks留下的注冊表垃圾。軟件核心功能1、SWCleanUninstall可以直接刪除電腦上的SolidWorks軟件2…

ZOJ1221 Risk 圖形的遍歷

一開始做圖形遍歷的題都是用鏈表做的&#xff0c;這次用數組體會到了方便但就是有點浪費。 不過題目給的內存限制已經足夠了。 View Code 1 #include<cstdio>2 #include<cstdlib>3 #include<cstring>4 #include<queue>5 #include<iostream>6 7 …

Android 從AndroidManifest獲取meta-data

語法如下&#xff1a; <meta-data android:name"string"android:resource"resource specification"android:value"string" /><meta-data>標簽可以作為子標簽&#xff0c;可以被包含在<activity>、<application> 、<s…

trim()函數

參數string&#xff1a;string類型&#xff0c;指定要刪除首部和尾部空格的字符串返回值String。 函數執行成功時返回刪除了string字符串首部和尾部空格的字符串&#xff0c;發生錯誤時 返回空字符串&#xff08;""&#xff09;。 如果參數值為null時&#xff0c;會拋…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波13 - 平滑低通濾波器 -盒式濾波器核

這里寫目錄標題平滑&#xff08;低通&#xff09;空間濾波器盒式濾波器核平滑&#xff08;低通&#xff09;空間濾波器 平滑&#xff08;也稱平均&#xff09;空間濾波器用于降低灰度的急劇過渡 在圖像重取樣之前平滑圖像以減少混淆用于減少圖像中無關細節平滑因灰度級數量不…

python中str用法_python數據類型之str用法

1、首字母大寫 語法&#xff1a;S.capitalize() ->str title "today is a good day"title_catitle.capitalize() print(title_ca) 結果&#xff1a;today is a good day 2、大寫轉小寫 1 語法&#xff1a;S.casefold() ->str2 3 title "TODAY is a GOOD …

WPF 窗體設置

WPF 當窗體最大化時控件位置的大小調整&#xff1a; View Code 1 <Window x:Class"WpfApplication1.MainWindow"2 xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"3 xmlns:x"http://schemas.microsoft.com/wi…

Git實踐

Git是什么自不必說。Git和gitlab安裝和實踐在后邊的倆篇中會寫。本篇僅重點寫Git自動部署。Git同樣有Hooks,可以用于各種需求。可以控制提交commit名稱&#xff0c;可以控制代碼規范&#xff0c;也當然包含以下要介紹的自動部署&#xff0c;也不僅包含這些。Git自動部署簡單的思…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波14 - 平滑低通濾波器 -高斯濾波器核的生成方法

目錄平滑&#xff08;低通&#xff09;空間濾波器低通高斯濾波器核統計排序&#xff08;非線性&#xff09;濾波器平滑&#xff08;低通&#xff09;空間濾波器 平滑&#xff08;也稱平均&#xff09;空間濾波器用于降低灰度的急劇過渡 在圖像重取樣之前平滑圖像以減少混淆用…

易經0

--- 陽爻 - - 陰爻 從下往上 畫爻 (yao) 三畫卦 --> 2^38 (八卦) 那天有空用程序 解析一下 六畫卦 --> 2^664(卦) 卦形記憶歌&#xff1a;宋代朱熹的《周易本義》寫了《八卦取象歌》幫人記卦形&#xff1a; 乾三連&#xff0c;坤六斷&#xff1b;震仰盂&#xff0c;艮覆碗…

python3.7怎么安裝turtle_python怎么安裝turtle

turtle庫是Python語言中一個很流行的繪制圖像的函數庫&#xff0c;想象一個小烏龜&#xff0c;在一個橫軸為x、縱軸為y的坐標系原點&#xff0c;(0,0)位置開始&#xff0c;它根據一組函數指令的控制&#xff0c;在這個平面坐標系中移動&#xff0c;從而在它爬行的路徑上繪制了圖…

強制html元素不隨窗口縮小而換行

<style> div{ white-space:nowrap; } </style> 強制div內的元素不隨窗口縮小而換行 本文出自 “點滴積累” 博客&#xff0c;請務必保留此出處http://tianxingzhe.blog.51cto.com/3390077/1679366

靜態變量、方法

static 變量---所有對象共享一個變量&#xff08;全局變量區&#xff09;&#xff0c;無需構造---概念上和.net相同所有對象共享一個變量的實質&#xff1a;聲明時&#xff1a;堆區存放一個地址&#xff0c;地址指向全局變量區。然后當類對象聲明時&#xff0c;只是在堆區中為自…

python語言是機器語言_Python解釋器:源代碼--字節碼--機器語言

"一個用編譯性語言比如C或C寫的程序可以從源文件&#xff08;即C或C語言&#xff09;轉換到一個你的計算機使用的語言&#xff08;二進制代碼&#xff0c;即0和1&#xff09;。這個過程通過編譯器和不同的標記、選項完成。當你運行你的程序的時候&#xff0c;連接/轉載器軟…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波15 - 銳化高通濾波器 -拉普拉斯核(二階導數)

目錄銳化&#xff08;高通&#xff09;空間濾波器基礎 - 一階導數和二階導數的銳化濾波器二階導數銳化圖像--拉普拉斯銳化&#xff08;高通&#xff09;空間濾波器 平滑通過稱為低通濾波類似于積分運算銳化通常稱為高通濾波微分運算高過&#xff08;負責細節的&#xff09;高頻…

Debian on VirtualBox下共享win7文件夾設置

借用&#xff1a;http://www.dbasoul.com/2010/695.html 1. 安裝增強功能包(Guest Additions) 參考文檔&#xff1a;Debian下安裝VirtualBox增強功能2. 設置共享文件夾 重啟完成后點擊”設備(Devices)” -> 共享文件夾(Shared Folders)菜單&#xff0c;添加一個共享文件夾&a…