python圖像常規(guī)操作
使用python進(jìn)行基本的圖像操作與處理
前言:
與早期計(jì)算機(jī)視覺(jué)領(lǐng)域多數(shù)程序都是由 C/C++ 寫就的情形不同。隨著計(jì)算機(jī)硬件速度越來(lái)越快,研究者在考慮選擇實(shí)現(xiàn)算法語(yǔ)言的時(shí)候會(huì)更多地考慮編寫代碼的效率和易用性,而不是像早年那樣把算法的執(zhí)行效率放在首位。這直接導(dǎo)致近年來(lái)越來(lái)越多的研究者選擇 Python 來(lái)實(shí)現(xiàn)算法。
今天在計(jì)算機(jī)視覺(jué)領(lǐng)域,越來(lái)越多的研究者使用 Python 開展研究,所以有必要去學(xué)習(xí)一下十分易用的python在圖像處理領(lǐng)域的使用,這篇博客將會(huì)介紹如何使用Python的幾個(gè)著名的圖像處理庫(kù)完成最基本的圖像操作與處理。
使用PIL進(jìn)行基本圖像操作
PIL簡(jiǎn)介:
PIL(Python Imaging Library Python,圖像處理類庫(kù))提供了通用的圖像處理功能,以及大量有用的基本圖像操作,比如圖像縮放、裁剪、旋轉(zhuǎn)、顏色轉(zhuǎn)換等。
PIL讀取與存儲(chǔ)圖像:
利用 PIL 中的函數(shù),我們可以從大多數(shù)圖像格式的文件中讀取數(shù)據(jù),然后寫入最常見的圖像格式文件中。PIL 中最重要的模塊為 Image 。
下面這個(gè)程序我使用PIL讀取一張jpg圖片將其灰度化之后存為一個(gè)png文件:
# -*- coding: utf-8 -*-
from PIL import Image
import os
#打開圖像得到一個(gè)PIL圖像對(duì)象
img = Image.open("./source/test.jpg")
#將其轉(zhuǎn)為一張灰度圖
img = img.convert('L')
#存儲(chǔ)該張圖片
try:
img.save("test.png")
except IOError:
print "cannot convert"
Test.jpg

Test.png

PIL生成縮略圖:
# -*- coding: utf-8 -*-
from PIL import Image
import os
#打開圖像得到一個(gè)PIL圖像對(duì)象
img = Image.open("./source/test.jpg")
#創(chuàng)建最長(zhǎng)邊為128的縮略圖
img.thumbnail((128,128))
#存儲(chǔ)該張圖片
try:
img.save("test.png")
except IOError:
print "cannot convert"
Test.png

PIL調(diào)整尺寸與旋轉(zhuǎn):
# -*- coding: utf-8 -*-
from PIL import Image
import os
#打開圖像得到一個(gè)PIL圖像對(duì)象
img = Image.open("./source/test.jpg")
#修改圖片大小,參數(shù)為一元組
img = img.resize((100,200))
#使圖片逆時(shí)針選擇45度
img = img.rotate(45)
#存儲(chǔ)該張圖片
try:
img.save("test.png")
except IOError:
print "cannot convert"
Test.png

PIL復(fù)制粘貼圖像區(qū)域:
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
from PIL import Image
import os
#打開圖像得到一個(gè)PIL圖像對(duì)象
img = Image.open("./source/test.jpg")
#從img中裁剪指定區(qū)域
region = img.crop((300,300,500,500))
#使裁剪部分逆時(shí)針選擇145度
region = region.rotate(145)
#將該區(qū)域粘貼至指定區(qū)域
img.paste(region,(100,100,300,300));
#存儲(chǔ)該張圖片
try:
img.save("test.png")
except IOError:
print "cannot convert"
Test.png

元組的使用中,坐標(biāo)原點(diǎn)為左上角,區(qū)域劃分如下圖所示

使用Matplotlib進(jìn)行基本圖像操作
Matplotlib簡(jiǎn)介:
我們處理數(shù)學(xué)運(yùn)算、繪制圖表,或者在圖像上繪制點(diǎn)、直線和曲線時(shí), Matplotlib是個(gè)很好的類庫(kù),具有比 PIL 更強(qiáng)大的繪圖功能。Matplotlib 可以繪制出較好的條形圖、餅狀圖、散點(diǎn)圖等,但是對(duì)于大多數(shù)計(jì)算機(jī)視覺(jué)應(yīng)用來(lái)說(shuō),僅僅需要用到幾個(gè)繪圖命令。比如,我們想用點(diǎn)和線來(lái)表示一些事物,比如興趣點(diǎn)、對(duì)應(yīng)點(diǎn)以及檢測(cè)出的物體。
使用Matplotlib繪制圖像、點(diǎn)、線
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
#打開圖像得到一個(gè)PIL圖像對(duì)象
img = Image.open("./source/test.jpg")
# 讀取圖像到數(shù)組中
im = array(img)
# 繪制圖像
imshow(im)
# 一些點(diǎn)
x = [100,100,400,400]
y = [200,500,200,500]
# 使用紅色星狀標(biāo)記繪制點(diǎn)
plot(x,y,'r*')
# 繪制連接前兩個(gè)點(diǎn)的線
plot(x[:2],y[:2])
# 添加標(biāo)題,顯示繪制的圖像
title('Plotting: "Test.jpg"')
show()
show() 命令首先打開圖形用戶界面(GUI),然后新建一個(gè)圖像窗口。該圖形用戶界面會(huì)循環(huán)阻斷腳本,然后暫停,直到最后一個(gè)圖像窗口關(guān)閉。在每個(gè)腳本里,你只能調(diào)用一次 show() 命令,而且通常是在腳本的結(jié)尾調(diào)用。
也可以使用axis(‘off')命令使坐標(biāo)軸不顯示。
運(yùn)行結(jié)果

在繪圖時(shí),有很多選項(xiàng)可以控制圖像的顏色和樣式。
如:
plot(x,y) #默認(rèn)為藍(lán)色實(shí)線 plot(x,y,'r*') #紅色星狀標(biāo)記 plot(x,y,'go-') #帶有圓圈標(biāo)記的綠線 plot(x,y,'ks:') #帶有正方形標(biāo)記的黑色虛線
| 標(biāo)記 | 顏色 |
|---|---|
| ‘b' | 藍(lán)色 |
| ‘g' | 綠色 |
| ‘r' | 紅色 |
| ‘c' | 青色 |
| ‘m' | 品紅 |
| ‘y' | 黃色 |
| ‘k' | 黑色 |
| ‘w' | 白色 |
| 標(biāo)記 | 線型 |
|---|---|
| ‘-‘ | 實(shí)線 |
| ‘–' | 虛線 |
| ‘:' | 點(diǎn)線 |
| 標(biāo)記 | 形狀 |
|---|---|
| ‘.' | 點(diǎn) |
| ‘o' | 圓圈 |
| 's' | 正方形 |
| ‘*' | 星形 |
| ‘+' | 加號(hào) |
| ‘x' | 叉號(hào) |
使用Matplotlib繪制圖像輪廓
繪制圖像的輪廓(或者其他二維函數(shù)的等輪廓線)在工作中非常有用。因?yàn)槔L制輪廓需要對(duì)每個(gè)坐標(biāo) [x, y] 的像素值施加同一個(gè)閾值,所以首先需要將圖像灰度化,之后使用contour獲得輪廓圖像
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
# 讀取圖像到數(shù)組中,并灰度化
im = array(Image.open('./source/test.jpg').convert('L'))
#顯示時(shí)拋棄顏色信息
gray()
# 顯示輪廓圖像
contour(im, origin='image')
# 在原點(diǎn)的左上角顯示
axis('equal')
#關(guān)閉坐標(biāo)軸
axis('off')
show()
運(yùn)行結(jié)果

使用Matplotlib繪制直方圖
圖像的直方圖用來(lái)表征該圖像像素值的分布情況。用一定數(shù)目的小區(qū)間(bin)來(lái)指定表征像素值的范圍,每個(gè)小區(qū)間會(huì)得到落入該小區(qū)間表示范圍的像素?cái)?shù)目。(灰度)圖像的直方圖可以使用 hist() 函數(shù)繪制:
hist() 函數(shù)的第二個(gè)參數(shù)指定小區(qū)間的數(shù)目。需要注意的是,因?yàn)?hist() 只接受一維數(shù)組作為輸入,所以我們?cè)诶L制圖像直方圖之前,必須先對(duì)圖像進(jìn)行壓平處理。flatten() 方法將任意數(shù)組按照行優(yōu)先準(zhǔn)則轉(zhuǎn)換成一維數(shù)組。
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
# 讀取圖像到數(shù)組中,并灰度化
im = array(Image.open('./source/test.jpg').convert('L'))
# 直方圖圖像
hist(im.flatten(),128)
# 顯示
show()
運(yùn)行結(jié)果

使用Matplotlib進(jìn)行交互式標(biāo)注
PyLab 庫(kù)中的 ginput() 函數(shù)可以實(shí)現(xiàn)交互式標(biāo)注,用來(lái)標(biāo)記一些點(diǎn)或者是一些訓(xùn)練數(shù)據(jù)。
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
# 讀取圖像到數(shù)組中
im = array(Image.open('./source/test.jpg'))
# 顯示圖像
imshow(im)
print 'Please click 3 points'
#獲取點(diǎn)擊并將點(diǎn)擊坐標(biāo)保存在[x,y]列表中
x = ginput(3)
#輸出保存的數(shù)據(jù)
print 'you clicked:',x
show()
上面的腳本首先繪制一幅圖像,然后等待用戶在繪圖窗口的圖像區(qū)域點(diǎn)擊三次。程 序?qū)⑦@些點(diǎn)擊的坐標(biāo) [x, y] 自動(dòng)保存在 x 列表里。
運(yùn)行結(jié)果
you clicked: [(295.22704081632651, 210.72448979591837), (405.43112244897952, 66.846938775510239), (439.1045918367347, 180.11224489795921)]
總結(jié)
本篇博客介紹了一些python基本的圖像操作,除了上述的PIL和Matplotlib,還經(jīng)常會(huì)使用numpy直接操作圖像數(shù)組來(lái)達(dá)到操作圖像的目的,使用scipy完成更多更復(fù)雜的計(jì)算,我會(huì)把我的學(xué)習(xí)過(guò)程記錄下來(lái),希望對(duì)大家有所幫助~
以上就是本文關(guān)于python圖像常規(guī)操作的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
在Python web中實(shí)現(xiàn)驗(yàn)證碼圖片代碼分享
python好玩的項(xiàng)目—色情圖片識(shí)別代碼分享
有什么問(wèn)題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的。感謝朋友們對(duì)本站的支持!
相關(guān)文章
python 利用瀏覽器 Cookie 模擬登錄的用戶訪問(wèn)知乎的方法
今天小編就為大家分享一篇python 利用瀏覽器 Cookie 模擬登錄的用戶訪問(wèn)知乎的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
Python scipy實(shí)現(xiàn)差分進(jìn)化算法
差分進(jìn)化算法是廣義的遺傳算法的一種,核心思想是變異,這篇文章主要為大家介紹的則是著名的scipy庫(kù)中對(duì)差分進(jìn)化算法的實(shí)現(xiàn),希望對(duì)大家有所幫助2023-08-08
Python數(shù)據(jù)分析Matplotlib?柱狀圖繪制
本文主要介紹了Python數(shù)據(jù)分析Matplotlib柱狀圖繪制,Matplotlib提供了bar()方法繪制柱狀圖,下面具體繪制介紹需要的小伙伴可以參考以一下2022-05-05
python中的標(biāo)準(zhǔn)庫(kù)html
html庫(kù)是用于解析HTML的一個(gè)工具,是python自帶的標(biāo)準(zhǔn)庫(kù)之一,今天通過(guò)本文給大家介紹下python中的標(biāo)準(zhǔn)庫(kù)html,感興趣的朋友一起看看吧2022-04-04
python沒(méi)有g(shù)pu,如何改用cpu跑代碼
這篇文章主要介紹了python沒(méi)有g(shù)pu,如何改用cpu跑代碼?今天小編就為大家分享一下解決方案。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
matplotlib實(shí)現(xiàn)矩陣和圖像的可視化表示
這篇文章主要為大家詳細(xì)介紹了如何利用matplotlib實(shí)現(xiàn)矩陣和圖像的可視化表示,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下2024-03-03

