python图片处理PIL
一、PIL介紹
PIL中所涉及的基本概念有如下幾個(gè):通道(bands)、模式(mode)、尺寸(size)、坐標(biāo)系統(tǒng)(coordinate system)、調(diào)色板(palette)、信息(info)和濾波器(filters)
1、 通道
每張圖片都是由一個(gè)或者多個(gè)數(shù)據(jù)通道構(gòu)成。PIL允許在單張圖片中合成相同維數(shù)和深度的多個(gè)通道。
以RGB圖像為例,每張圖片都是由三個(gè)數(shù)據(jù)通道構(gòu)成,分別為R、G和B通道。而對(duì)于灰度圖像,則只有一個(gè)通道。
2、 模式(mode)
圖像的模式定義了圖像的類型和像素的位寬。當(dāng)前支持如下模式:
1:1位像素,表示黑和白,但是存儲(chǔ)的時(shí)候每個(gè)像素存儲(chǔ)為8bit。
L:8位像素,表示黑和白。 ****
P:8位像素,使用調(diào)色板映射到其他模式。
RGB:3x8位像素,為真彩色。 ****
RGBA:4x8位像素,有透明通道的真彩色。
CMYK:4x8位像素,顏色分離。
YCbCr:3x8位像素,彩色視頻格式。
I:32位整型像素。
F:32位浮點(diǎn)型像素。
PIL也支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)
3、 尺寸
通過(guò)size屬性可以獲取圖片的尺寸。這是一個(gè)二元組,包含水平和垂直方向上的像素?cái)?shù)。
4、 坐標(biāo)系統(tǒng)(從左上角開(kāi)始計(jì)算)
PIL使用笛卡爾像素坐標(biāo)系統(tǒng),坐標(biāo)(0,0)位于左上角。注意:坐標(biāo)值表示像素的角;位于坐標(biāo)(0,0)處的像素的中心實(shí)際上位于(0.5,0.5)。
坐標(biāo)經(jīng)常用于二元組(x,y)。長(zhǎng)方形則表示為四元組,前面是左上角坐標(biāo)。例如,一個(gè)覆蓋800x600的像素圖像的長(zhǎng)方形表示為(0,0,800,600)。
5、 調(diào)色板
調(diào)色板模式 ("P")使用一個(gè)顏色調(diào)色板為每個(gè)像素定義具體的顏色值
6、 信息
使用info屬性可以為一張圖片添加一些輔助信息。這個(gè)是字典對(duì)象。加載和保存圖像文件時(shí),多少信息需要處理取決于文件格式。
7、 濾波器(素描等)
對(duì)于將多個(gè)輸入像素映射為一個(gè)輸出像素的幾何操作,PIL提供了4個(gè)不同的采樣濾波器:
NEAREST:最近濾波。從輸入圖像中選取最近的像素作為輸出像素。它忽略了所有其他的像素。
BILINEAR:雙線性濾波。在輸入圖像的2x2矩陣上進(jìn)行線性插值。注意:PIL的當(dāng)前版本,做下采樣時(shí)該濾波器使用了固定輸入模板。
BICUBIC:雙立方濾波。在輸入圖像的4x4矩陣上進(jìn)行立方插值。注意:PIL的當(dāng)前版本,做下采樣時(shí)該濾波器使用了固定輸入模板。
ANTIALIAS:平滑濾波。這是PIL 1.1.3版本中新的濾波器。對(duì)所有可以影響輸出像素的輸入像素進(jìn)行高質(zhì)量的重采樣濾波,以計(jì)算輸出像素值。在當(dāng)前的PIL版本中,這個(gè)濾波器只用于改變尺寸和縮略圖方法。
注意:在當(dāng)前的PIL版本中,ANTIALIAS濾波器是下采樣(例如,將一個(gè)大的圖像轉(zhuǎn)換為小圖)時(shí)唯一正確的濾波器。BILIEAR和BICUBIC濾波器使用固定的輸入模板,用于固定比例的幾何變換和上采樣是最好的。
二、Image方法 常用方法
img = Image.open("1.png") #獲取圖片句柄
img.show() #打開(kāi)圖片
img.save("t1.jpg") #保存圖片,保存名字為t1.jpg
img.format #img的格式信息(這里是jpg)
img.rotate #圖片翻轉(zhuǎn)例如;img3 = img.rotate(90) #圖片旋轉(zhuǎn)90度
img.resize #更改圖片大小(縮放等)
例如:
img2 = img.resize((200,200)) #存放元祖 img2.show()
img.mode #圖像的模式(這里是RGB),(上面的2、 模式(mode))
img1 = img.convert('P') #轉(zhuǎn)換圖像模式(銳化、復(fù)古等)
img.size #圖像的尺寸,按照像素?cái)?shù)計(jì)算,它的返回值為寬度和高度的二元組(width, height),如(232, 153)
img.info #存儲(chǔ)圖像相關(guān)數(shù)據(jù)的字典。
img.palette #顏色調(diào)色板表格。如果圖像的模式是“P”,則返回ImagePalette類的實(shí)例;否則,將為None。
Image.new #使用給定的變量mode和size生成新的圖像。
例如:
例如:(生成一個(gè)圖像模式未RGB,全身為紅色的128*128像素的正方形)
n_im= Image.new("RGB", (128, 128), "#FF0000")
img.crop #從當(dāng)前的圖像中返回一個(gè)矩形區(qū)域的拷貝。變量box是一個(gè)四元組,定義了左、上、右和下的像素坐標(biāo)。
例如:
img = Image.open("1.jpg")
box = (300, 100, 700, 700) ##確定拷貝區(qū)域大小
region = img.crop(box) ##將im表示的圖片對(duì)象拷貝到region中,大小為box
region.show()
img.paste #將一張圖粘貼到另一張圖像上(覆蓋)。變量box或者是一個(gè)給定左上角的2元組,或者是定義了左,上,右和下像素坐標(biāo)的4元組,或者為空(與(0,0)一樣)。如果給定4元組,被粘貼的圖像的尺寸必須與區(qū)域尺寸一樣。如果模式不匹配,被粘貼的圖像將被轉(zhuǎn)換為當(dāng)前圖像的模式。
例如:
img = Image.open("1.jpg")
box=[0,0,100,100]
im_crop = img.crop(box)
print(im_crop.size,im_crop.mode)
img.paste(im_crop, (100,100)) ##(100,100,0,0)
img.paste(im_crop, (400,400,500,500))
img.show()
img.filter #返回一個(gè)使用給定濾波器處理過(guò)的圖像的拷貝(圖像的浮雕等)。具體參考圖像濾波在ImageFilter 模塊的應(yīng)用,在該模塊中,預(yù)先定義了很多增強(qiáng)濾波器,可以通過(guò)filter( )函數(shù)使用
例子:
img = Image.open("1.jpg")
bluF = img.filter(ImageFilter.BLUR) ##均值濾波
conF = img.filter(ImageFilter.CONTOUR) ##找輪廓
edgeF = img.filter(ImageFilter.FIND_EDGES) ##邊緣檢測(cè)
img.show()
bluF.show()
conF.show()
edgeF.show()
img.point #返回給定查找表對(duì)應(yīng)的圖像像素值的拷貝。變量table為圖像的每個(gè)通道設(shè)置256個(gè)值。如果使用變量function,其對(duì)應(yīng)函數(shù)應(yīng)該有一個(gè)參數(shù)。這個(gè)函數(shù)將對(duì)每個(gè)像素值使用一次,結(jié)果表格將應(yīng)用于圖像的所有通道。
如果圖像的模式為“I(整數(shù))”或者“F(浮點(diǎn))”,用戶必須使用function方式,function必須按照下面的格式:
argument * scale+ offset
例如:
out = im.point(lambda i: i * 1.2 + 10)
用戶可以省略變量scale和offset。
img.point例子:
img = Image.open("1.jpg")
im_point = img.point(lambda x:x*1.3+5)
im_point.show()
img.split #返回當(dāng)前圖像各個(gè)通道組成的一個(gè)元組。例如,分離一個(gè)“RGB”圖像將產(chǎn)生三個(gè)新的圖像,分別對(duì)應(yīng)原始圖像的每個(gè)通道(紅,綠,藍(lán))。
例子:
img = Image.open("1.jpg")
r,g,b = img.split()
print(r,g,b)
b.save('b.png') #無(wú)顏色圖片
print(b.getpixel((1,3))) #72
三、其它方法(畫(huà)圖等)
Draw #畫(huà)圖
例子:
import PIL.Image as image
import PIL.ImageDraw as draw #畫(huà)圖
import PIL.ImageFont as imgfont #字體
img1 = image.open("1.jpg")
img1.show()
img = draw.Draw(img1)
img.point((100,100),fill="red")#畫(huà)點(diǎn)
img1.show()
img.rectangle((30,30,100,100),outline="red")#畫(huà)矩形
img1.show()
img.line((20,10,100,120),fill="red",width=2) #畫(huà)線
img1.show()
font = imgfont.truetype("font.ttf",40) #設(shè)置字體和字的大小
img.text((50,50),text="text",fill="red",font=font)#圖片中添加文本("text")
img1.show()
img.chord((30,50,100,120),100,200,outline="blue") #畫(huà)圓弧
img1.show()
四、PIL驗(yàn)證碼
import PIL.Image as image
import PIL.ImageDraw as draw
import PIL.ImageFont as imgfont
import PIL.ImageFilter as ifr
import random
font = imgfont.truetype("font.ttf",60) #字體
w = 240
h = 120
def randchar():
'''生成隨機(jī)字母'''
return chr(random.randint(65,90))
# print(randchar())
def b_color():
'''生成隨機(jī)背景色'''
return (random.randint(64,255),
random.randint(64,255),
random.randint(64,255))
def f_color():
'''生成隨機(jī)前景色'''
return (random.randint(32,128),
random.randint(32,128),
random.randint(32,128))
def img():
return image.new("RGB",(w,h),(255,255,255))
if __name__ == '__main__':
img = img()
image = draw.Draw(img)
for x in range(w):
for y in range(h):
image.point((x,y),fill=b_color())
for i in range(4):
image.text((60*i+10,30),text=randchar(),fill=f_color(),font=font)
img.show()
總結(jié)
以上是生活随笔為你收集整理的python图片处理PIL的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 钉钉如何投屏到投影仪电脑如何投屏到投影仪
- 下一篇: Macbook电脑如何切换输入法苹果电脑