1. 簡介。
創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、成都網(wǎng)站制作與策劃設(shè)計(jì),阿圖什網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:阿圖什等地區(qū)。阿圖什做網(wǎng)站價(jià)格咨詢:18980820575
圖像處理是一門應(yīng)用非常廣的技術(shù),而擁有非常豐富第三方擴(kuò)展庫的 Python 當(dāng)然不會錯過這一門盛宴。PIL (Python Imaging Library)是 Python 中最常用的圖像處理庫,目前版本為 1.1.7,我們可以?在這里?下載學(xué)習(xí)和查找資料。
Image 類是 PIL 庫中一個非常重要的類,通過這個類來創(chuàng)建實(shí)例可以有直接載入圖像文件,讀取處理過的圖像和通過抓取的方法得到的圖像這三種方法。
2. 使用。
導(dǎo)入 Image 模塊。然后通過 Image 類中的 open 方法即可載入一個圖像文件。如果載入文件失敗,則會引起一個 IOError ;若無返回錯誤,則 open 函數(shù)返回一個 Image 對象?,F(xiàn)在,我們可以通過一些對象屬性來檢查文件內(nèi)容,即:
1 import Image
2 ? im = Image.open("j.jpg")
3 ? print im.format, im.size, im.mode
4 JPEG (440, 330) RGB
這里有三個屬性,我們逐一了解。
format : 識別圖像的源格式,如果該文件不是從文件中讀取的,則被置為 None 值。
size : 返回的一個元組,有兩個元素,其值為象素意義上的寬和高。
mode : RGB(true color image),此外還有,L(luminance),CMTK(pre-press image)。
現(xiàn)在,我們可以使用一些在 Image 類中定義的方法來操作已讀取的圖像實(shí)例。比如,顯示最新載入的圖像:
1 im.show()
2 ?
輸出原圖:
3. 函數(shù)概貌。
3.1 ? ?Reading and Writing Images : open( infilename ) , save( outfilename )
3.2 ? ?Cutting and Pasting and Merging Images :
crop() : 從圖像中提取出某個矩形大小的圖像。它接收一個四元素的元組作為參數(shù),各元素為(left, upper, right, lower),坐標(biāo)系統(tǒng)的原點(diǎn)(0, 0)是左上角。
paste() :
merge() :
1 box = (100, 100, 200, 200)
2 ? region = im.crop(box)
3 ? region.show()
4 ? region = region.transpose(Image.ROTATE_180)
5 ? region.show()
6 ? im.paste(region, box)
7 ? im.show()
其效果圖為:
旋轉(zhuǎn)一幅圖片:
1 def roll(image, delta):
2 ?? ?"Roll an image sideways"
3
4 ?? ?xsize, ysize = image.size
5
6 ?? ?delta = delta % xsize
7 ?? ?if delta == 0: return image
8
9 ?? ?part1 = image.crop((0, 0, delta, ysize))
10 ?? ?part2 = image.crop((delta, 0, xsize, ysize))
11 ?? ?image.paste(part2, (0, 0, xsize-delta, ysize))
12 ?? ?image.paste(part1, (xsize-delta, 0, xsize, ysize))
13
14 ?? ?return image
3.3 ? ?幾何變換。
3.3.1 ? ?簡單的幾何變換。
1 out = im.resize((128, 128)) ? ? ? ? ? ? ? ? ? ? #
2 ?out = im.rotate(45) ? ? ? ? ? ? ? ? ? ? ? ? ? ??#逆時(shí)針旋轉(zhuǎn) 45 度角。
3 ?out = im.transpose(Image.FLIP_LEFT_RIGHT) ? ? ? #左右對換。
4 ?out = im.transpose(Image.FLIP_TOP_BOTTOM) ? ? ? #上下對換。
5 ?out = im.transpose(Image.ROTATE_90) ? ? ? ? ? ? #旋轉(zhuǎn) 90 度角。
6 ?out = im.transpose(Image.ROTATE_180) ? ? ? ? ? ?#旋轉(zhuǎn) 180 度角。
7 out = im.transpose(Image.ROTATE_270) ? ? ? ? ? ?#旋轉(zhuǎn) 270 度角。
各個調(diào)整之后的圖像為:
圖片1:
圖片2:
圖片3:
圖片4:
3.3.2 ? ?色彩空間變換。
convert() : 該函數(shù)可以用來將圖像轉(zhuǎn)換為不同色彩模式。
3.3.3 ? ?圖像增強(qiáng)。
Filters : 在 ImageFilter 模塊中可以使用 filter 函數(shù)來使用模塊中一系列預(yù)定義的增強(qiáng)濾鏡。
1 import ImageFilter
2 imfilter = im.filter(ImageFilter.DETAIL)
3 imfilter.show()
3.4 ? ?序列圖像。
即我們常見到的動態(tài)圖,最常見的后綴為 .gif ,另外還有 FLI / FLC 。PIL 庫對這種動畫格式圖也提供了一些基本的支持。當(dāng)我們打開這類圖像文件時(shí),PIL 自動載入圖像的第一幀。我們可以使用 seek 和 tell 方法在各幀之間移動。
1 import Image
2 im.seek(1) ? ? ? ?# skip to the second frame
3
4 try:
5 ?? ?while 1:
6 ?? ? ? ?im.seek( im.tell() + 1)
7 ?? ? ? ?# do something to im
8 except EOFError:
9 ?? ?pass
3.5 ? ?更多關(guān)于圖像文件的讀取。
最基本的方式:im = Image.open("filename")
類文件讀取:fp = open("filename", "rb"); im = Image.open(fp)
字符串?dāng)?shù)據(jù)讀?。篿mport StringIO; im = Image.open(StringIO.StringIO(buffer))
從歸檔文件讀?。篿mport TarIO; fp = TarIo.TarIO("Image.tar", "Image/test/lena.ppm"); im = Image.open(fp)
基本的 PIL 目前就練習(xí)到這里。其他函數(shù)的功能可點(diǎn)擊?這里?進(jìn)一步閱讀。
使用 cvInRangeS 函數(shù)過濾出深藍(lán)色區(qū)域即可。
OpenCVchm文檔上對函數(shù)的解釋:
InRangeS:檢查數(shù)組元素是否在兩個數(shù)量之間
void cvInRangeS( const CvArr* src, CvScalar lower, CvScalar upper, CvArr* dst );
src :第一個原數(shù)組
lower:包括進(jìn)的下邊界.
upper :不包括進(jìn)的上邊界
dst :輸出數(shù)組必須是 8u 或 8s 類型.
在寫python程序時(shí),常能用到一些函數(shù)和方法,總結(jié)一下,保存起來,方便查詢。
一、內(nèi)置函數(shù)
# abs()獲取數(shù)字絕對值
# chr(i)數(shù)字轉(zhuǎn)換為字符類型
# divmod() 獲取兩個數(shù)值的商和余數(shù)
# enumerate() 將可遍歷序列組合為索引序列
# float()轉(zhuǎn)換為浮點(diǎn)數(shù)
# format() 格式化字符串
# int()轉(zhuǎn)換為整數(shù)?
# input() 接受用戶輸入內(nèi)容
# len() 計(jì)算元素個數(shù)
# max() 返回最大值
# min() 返回最小值
# math.ceil() 返回指定數(shù)值的上舍整數(shù)
# open()打開文件并返回文件對象
# pow() 冪運(yùn)算
# print()打印輸出?
# range() 生成器
# reversed()反轉(zhuǎn)所有元素
# round()四舍五入求值
# sorted()對可迭代對象進(jìn)行排序?
# str() 轉(zhuǎn)換為字符串
# sum() 求和
# set() 創(chuàng)建集合
# tuple() 將序列轉(zhuǎn)換為元組
# zip()將可迭代對象打包成元組
二、方法
# append() 添加列表元素
# capitalize()首字母轉(zhuǎn)換為大寫?
# count()字符出現(xiàn)次數(shù)
# close() 關(guān)閉文件
# decode() 解碼字符串
# dict.keys() 獲取字典所有的鍵
# find()字符串首次出現(xiàn)的索引
# f.read() 讀取文件內(nèi)容
# dict.update()更新字典
# dict.items() 獲取字典鍵/值對
# dict.get() 返回指定鍵的值
# encode() 編碼字符串
# list.sort() 排序列表元素
# index() 元素首次出現(xiàn)的索引
# isdigit() 判斷字符串是否只由數(shù)字組成
# isupper() 是否所有字母都為大寫
# isnum() 判斷字符串是否由字母和數(shù)字組成
# islower() 是否所有字母都為小寫
# isdecimal() 檢查字符串是否只包含十進(jìn)制字符
# isalpha() 檢測字符串是否為純字母
# random.shuffle()隨機(jī)排序
# random.sample()返回?zé)o重復(fù)隨機(jī)數(shù)列表
# random.choice() 返回一個隨機(jī)元素
# random.randint() 生成指定范圍的隨機(jī)整數(shù)
# random.randrange() 生成指定范圍的指定遞增基數(shù)隨機(jī)整數(shù)
# pop() 刪除列表中的元素
# remove()刪除列表中的指定元素
# strip()去除空格
# lstrip()去除左側(cè)空格
# rstrip() 去除右側(cè)空格
# readline() 讀取單行內(nèi)容
# root.after() Tkinter中等待一段時(shí)間后再執(zhí)行命令
# str.isnumeric() 驗(yàn)證字符串是否為數(shù)字(適用于Unicode)
# split()分割字符串
# ord() 將字符轉(zhuǎn)換為整數(shù)
# replace() 字符串替換
# ljust() 左對齊填充
# rjust() 左對齊填充
# readlines() 讀取所有行內(nèi)容
# datetime.datetime.now() 返回指定時(shí)區(qū)的本地日期時(shí)間
# datetime.datetime.today() 獲取當(dāng)前本地日期的date對象
# datetime.utcnow() 返回當(dāng)前UTC時(shí)間的datetime對象
# time.strptime()把時(shí)間字符串解析為元組
# time.time()返回當(dāng)前時(shí)間的時(shí)間戳
# time.sleep()暫停指定秒數(shù)
# time.strftime() 返回指定格式的日期字符串
# time.mktime() 接收時(shí)間元組并返回時(shí)間戳
# os.getcwd() 獲取當(dāng)前工作目錄
# os.listdir() 獲取指定路徑下的目錄和文件列表
# os.makedirs() 遞歸創(chuàng)建目錄
# os.rename() 重命名目錄或文件
# os.path.exists() 判斷路徑是否存在
# upper() 全部轉(zhuǎn)換為大寫字母
# lower()? 全部轉(zhuǎn)換為小寫字母
# sys.stdout.write() 標(biāo)準(zhǔn)輸出打印
# sys.stdout.flush()刷新輸出?
# shutil.copy() 復(fù)制單個文件到另一文件或目錄
# write() 寫入文件內(nèi)容
# winsound.Beep() 打開電腦揚(yáng)聲器
# zfill() 在字符串前面填充0
三、循環(huán)語句
# break終止當(dāng)前循環(huán)
# continue 終止本循環(huán)進(jìn)入下一次循環(huán)
# with open() as file 以with語句打開文件(數(shù)據(jù)保存)
四、轉(zhuǎn)義字符
\ 行尾續(xù)行符
\' 單引號?
\'' 雙引號
\a 響鈴
\e 轉(zhuǎn)義
\n 換行
\t 橫向制表符
\f 換頁
\xyy 十六進(jìn)制yy代表的字符
\\反斜杠符號
\b 退格
\000 空
\v 縱向制表符
\r 回車
\0yy 八進(jìn)制yy代表的字符
\other 其他的字符以普通格式輸出
1、 定義一個特殊的 __slots__ 變量,來限制該class實(shí)例能添加的屬性
2、 內(nèi)置的 @property(關(guān)鍵字) 裝飾器就是負(fù)責(zé)把一個方法變成屬性調(diào)用的。@property.setter(這里的property是類里面的屬性名)負(fù)責(zé)把一個setter方法變成屬性賦值。
3、 __str__(),__repr__(),__iter__(),__next__(),__getitem__(),__setitem__(),__delitem__(),__getattr__(),__call__()