重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
一、cv函數(shù)
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的豐鎮(zhèn)網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
1、imread:讀取圖片
imread(image_path, flag):
?images_path:圖片路徑,找不到不報(bào)錯(cuò)
flag:
1/cv2.IMREAD_COLOR:彩色圖片,圖片透明性會(huì)被忽略,默認(rèn)參數(shù)
0/cv2.IMREAD_GRAYSCALE:灰色圖片
-1/cv2.IMREAD_UNCHANGED:包括其alpha通道
2、imwrite
imwrite(img_path_name,img)
img_path_name:保存的文件名
img:文件對(duì)象
3、cvtColor
cvtColor(img,code)
img: 圖像對(duì)象
code:
cv2.COLOR_RGB2GRAY: RGB轉(zhuǎn)換到灰度模式
cv2.COLOR_RGB2HSV: RGB轉(zhuǎn)換到HSV模式(hue,saturation,Value)
4、matchTemplate
matchTemplate(img_path, bg_path, cv2.TM_CCOEFF_NORMED)
img_path:對(duì)比圖片
bg_path:背景圖片
cv2.TM_CCOEFF_NORMED
```
# encoding=utf8
import cv2
import numpyas np
def show(name):
cv2.imshow('Show', name)
cv2.waitKey(0)
cv2.destroyAllWindows()
def main():
otemp ='./images/tb.png'
oblk ='./images/bg.jpg'
target = cv2.imread(otemp, 0)
template = cv2.imread(oblk, 0)# 讀取到兩個(gè)圖片,進(jìn)行灰值化處理
w, h = target.shape[::-1]
aa = target.shape
print(aa)
print(w, h)
temp ='./images/temp.jpg'
targ ='./images/targ.jpg'
cv2.imwrite(temp, template)
cv2.imwrite(targ, target)# 處理后進(jìn)行保存
target = cv2.imread(targ)
target = cv2.cvtColor(target, cv2.COLOR_BGR2GRAY)# 轉(zhuǎn)化到灰度
target =abs(255 - target)# 返回絕對(duì)值
cv2.imwrite(targ, target)# 重新寫(xiě)入
target = cv2.imread(targ)
template = cv2.imread(temp)
result = cv2.matchTemplate(target, template, cv2.TM_CCOEFF_NORMED)# 進(jìn)行匹配
x, y = np.unravel_index(result.argmax(), result.shape)# 通過(guò)np轉(zhuǎn)化為數(shù)值,就是坐標(biāo)
print(y, x)
# 展示圈出來(lái)的區(qū)域
cv2.rectangle(template, (y, x), (y + w, x + h), (7, 249, 151), 2)
show(template)
return y, x
if __name__ =='__main__':
a, b = main()
```
此函數(shù)將輸入的圖片從一個(gè)顏色域轉(zhuǎn)換到另一個(gè)。
input: 以數(shù)組形式輸入圖片
zoom:浮點(diǎn)數(shù)或數(shù)組。如果是一個(gè)浮點(diǎn)數(shù),對(duì)每一個(gè)軸放縮相同的倍數(shù)。如果是一個(gè)數(shù)組,則對(duì)每一個(gè)軸分配一個(gè)值。
output:輸出,默認(rèn)為None
order:整型(范圍0-5)樣條插值的順序,默認(rèn)為3。詳見(jiàn)后續(xù)
mode:字符串,包括{‘reflect’, ‘constant’, ‘nearest’, ‘mirror’, ‘wrap’},輸入的數(shù)組如何擴(kuò)展邊界,默認(rèn)為 ‘constant'(具體參考官方文檔 插值的邊界處理 )
cval:浮點(diǎn)數(shù),當(dāng)插值的邊界處理模式為’constant‘時(shí)發(fā)揮作用。默認(rèn)為0.0
prefilter:bool,input輸入的數(shù)組是否經(jīng)過(guò)一個(gè)預(yù)樣條濾波器,默認(rèn)為T(mén)rue
設(shè)原圖 ,
目標(biāo)圖片
設(shè) 之比為 , ,則:
設(shè)原圖坐標(biāo)上的像素點(diǎn) ,
目標(biāo)圖片坐標(biāo)上的像素的為
1.計(jì)算目標(biāo)圖片的坐標(biāo)點(diǎn)對(duì)應(yīng)原圖中哪個(gè)坐標(biāo)點(diǎn),公式為:
2.根據(jù)dst_x,dst_y的值四舍五入為整數(shù),填充到目標(biāo)圖片的相應(yīng)位置。
由上圖可以看到,經(jīng)過(guò)轉(zhuǎn)換后的圖片出現(xiàn)了鋸齒感。
1.計(jì)算目標(biāo)圖片的坐標(biāo)點(diǎn)對(duì)應(yīng)原圖中哪個(gè)坐標(biāo)點(diǎn)(此步與最鄰近插值算法相同),公式為:
2.由于點(diǎn) 是個(gè)浮點(diǎn)數(shù)坐標(biāo),無(wú)法用整型的灰度值或RGB值來(lái)表示,因此雙線(xiàn)性插值算法通過(guò)尋找距離這個(gè)對(duì)應(yīng)坐標(biāo)最近的四個(gè)像素點(diǎn),來(lái)計(jì)算該點(diǎn)的值(灰度值或者RGB值)。
設(shè)分解后的坐標(biāo)為:
首先,在x方向上進(jìn)行線(xiàn)性插值, 代表該點(diǎn)的像素值。
然后,在y方向上進(jìn)行線(xiàn)性插值:
得到的 就是該點(diǎn)經(jīng)過(guò)處理后的像素值,填充到目標(biāo)圖片的相應(yīng)位置。
可見(jiàn),雙線(xiàn)性插值算法的鋸齒感要少于最鄰近插值法。
三次插值法(cubic interpolation method)是一種 多項(xiàng)式插值法 ,逐次以 三次曲線(xiàn) φ(t)=a 0 +a 1 t+a 2 t 2 +a 3 t 3 的極小點(diǎn)逼近尋求函數(shù)f(t)的極小點(diǎn)的一種方法.(摘自 百度百科 )
可見(jiàn),三次插值法處理后的圖片幾乎沒(méi)有鋸齒感
1. PIL.Image.open
代碼在這里:Pillow/Image.py at 3.1.x · python-pillow/Pillow · GitHub
open() 函數(shù)打開(kāi)圖像,但并不讀入,直到有操作發(fā)生。
具體的讀取操作是在 ImageFile.py 寫(xiě)的。大體流程是先檢測(cè)文件類(lèi)型,整塊地讀入文件內(nèi)容,然后調(diào)用解碼器解碼,做了很多優(yōu)化,效率應(yīng)該還是很高的。
2. scipy.ndimage.imread
代碼在這里:scipy/io.py at v0.17.1 · scipy/scipy · GitHub
imread 調(diào)用 scipy.misc.pilutil.imread。從名字就能看出來(lái)其實(shí)調(diào)用的還是 Pillow。
根據(jù) pilutil 代碼:scipy/pilutil.py at v0.17.1 · scipy/scipy · GitHub
確實(shí)是調(diào)用 pil.image.open(),然后返回一個(gè) fromimage()。
3. scipy.misc.imread
misc 的 __init__.py 在這里:scipy/__init__.py at v0.17.1 · scipy/scipy · GitHub
調(diào)用的還是 pilutil 中的 imread
相關(guān)代碼如下
try:
from .pilutil import *
from . import pilutil
__all__ += pilutil.__all__
del pilutil
except ImportError:
pass
也算是學(xué)了一招,從 pilutil 導(dǎo)入其所有函數(shù)添加到當(dāng)前空間,然后又刪除了 pilutil 消除影響。
4. skimage.io.imread
代碼在這里:scikit-image/_io.py at master · scikit-image/scikit-image · GitHub
是通過(guò)插件 plugin 來(lái)讀入不同的文件,而且會(huì)試用幾個(gè)不同的 plugins 來(lái)找到合適的。
使用 call_plugin 來(lái)調(diào)用,代碼在這里:scikit-image/manage_plugins.py at master · scikit-image/scikit-image · GitHub
可以根據(jù)如下代碼查看插件調(diào)用的優(yōu)先級(jí)
# For each plugin type, default to the first available plugin as defined by
# the following preferences.
preferred_plugins = {
# Default plugins for all types (overridden by specific types below).
'all': ['pil', 'matplotlib', 'qt', 'freeimage'],
'imshow': ['matplotlib'],
'imshow_collection': ['matplotlib']
}
plugins 的源代碼在這里:scikit-image/skimage/io/_plugins at master · scikit-image/scikit-image · GitHub。可以看到 pil 的 imread,是用 open 打開(kāi)圖像之后,再轉(zhuǎn)換成 ndarray。
5. cv2.imread
這里是調(diào)用的 CV::imread(),代碼在這里:opencv/loadsave.cpp at master · opencv/opencv · GitHub。一般來(lái)說(shuō) C\C++ 的實(shí)現(xiàn),應(yīng)該比 python 速度快一點(diǎn)。
6. matplotlib.image.imread
matplotlib 的文檔里面說(shuō),matplotlib 原生只可以讀取 PNG 文件,有 PIL 的時(shí)候,可以讀取其他類(lèi)型的文件。如果使用 URL 打開(kāi)在線(xiàn)圖像文件,需要符合 PIL 的文檔要求。
matplotlib.image.imread 的代碼在這里:matplotlib/image.py at master · matplotlib/matplotlib · GitHub。matplotlib 的原生 PNG 讀取和寫(xiě)入,是用 C 實(shí)現(xiàn)的,代碼在這里:matplotlib/_png.cpp at master · matplotlib/matplotlib · GitHub。
matplotlib 是先用 pil 的 open 打開(kāi)圖像,如果格式是 png,就用原生方法打開(kāi)。相關(guān)代碼如下:
handlers = {'png': _png.read_png, }
if format is None:
if cbook.is_string_like(fname):
parsed = urlparse(fname)
# If the string is a URL, assume png
if len(parsed.scheme) 1:
ext = 'png'
else:
basename, ext = os.path.splitext(fname)
ext = ext.lower()[1:]
elif hasattr(fname, 'name'):
basename, ext = os.path.splitext(fname.name)
ext = ext.lower()[1:]
else:
ext = 'png'
else:
ext = format
if ext not in handlers:
im = pilread(fname)
if im is None:
raise ValueError('Only know how to handle extensions: %s; '
'with Pillow installed matplotlib can handle '
'more images' % list(six.iterkeys(handlers)))
return im
聲明的處理器只有 png。如果是 png 文件,調(diào)用 _png.read_png。如果不是 png 直接使用 pilread(就是用 pil 的 Image.open 然后 pil_to_array)。
matplotlib 的源碼確實(shí)比較復(fù)雜,一大部分主體是用 C 寫(xiě)的,改動(dòng)很激進(jìn),功能更新猛烈。
因?yàn)轵?yàn)證碼圖片是禁止緩存的 ,當(dāng)然無(wú)法用緩存函數(shù)獲取了。 解決方法有很多。可以用同樣的會(huì)話(huà)再次請(qǐng)求得到圖片。
1、需要用到其他模塊的函數(shù),如:
for i in range(20) #循環(huán)次數(shù)
image=cv2.imread("D:\\picture\\%d.jpg"%(i))#路徑自己選擇。
2、可以先升級(jí)你的pip,另外看看你的版本是否匹配,包括py版本和32位64位。
3、關(guān)于python下使用opencv讀取圖像。首先需要導(dǎo)入opencv包,上面說(shuō)的那個(gè)Ipython并沒(méi)有opencv包,所以想使用的請(qǐng)先正確導(dǎo)入opencv包再說(shuō),至于怎么導(dǎo)入,先下載個(gè)opencv包,里面有關(guān)于python的opencv包。?
以下照片是關(guān)于Ipython的運(yùn)行界面:
PIL (Python Imaging Library)
Python圖像處理庫(kù),該庫(kù)支持多種文件格式,提供強(qiáng)大的圖像處理功能。
PIL中最重要的類(lèi)是Image類(lèi),該類(lèi)在Image模塊中定義。
從文件加載圖像:
如果成功,這個(gè)函數(shù)返回一個(gè)Image對(duì)象。現(xiàn)在你可以使用該對(duì)象的屬性來(lái)探索文件的內(nèi)容。
format 屬性指定了圖像文件的格式,如果圖像不是從文件中加載的則為 None 。
size 屬性是一個(gè)2個(gè)元素的元組,包含圖像寬度和高度(像素)。
mode 屬性定義了像素格式,常用的像素格式為:“L” (luminance) - 灰度圖, “RGB” , “CMYK”。
如果文件打開(kāi)失敗, 將拋出IOError異常。
一旦你擁有一個(gè)Image類(lèi)的實(shí)例,你就可以用該類(lèi)定義的方法操作圖像。比如:顯示
( show() 的標(biāo)準(zhǔn)實(shí)現(xiàn)不是很有效率,因?yàn)樗鼘D像保存到一個(gè)臨時(shí)文件,然后調(diào)用外部工具(比如系統(tǒng)的默認(rèn)圖片查看軟件)顯示圖像。該函數(shù)將是一個(gè)非常方便的調(diào)試和測(cè)試工具。)
接下來(lái)的部分展示了該庫(kù)提供的不同功能。
PIL支持多種圖像格式。從磁盤(pán)中讀取文件,只需使用 Image 模塊中的 open 函數(shù)。不需要提供文件的圖像格式。PIL庫(kù)將根據(jù)文件內(nèi)容自動(dòng)檢測(cè)。
如果要保存到文件,使用 Image 模塊中的 save 函數(shù)。當(dāng)保存文件時(shí),文件名很重要,除非指定格式,否則PIL庫(kù)將根據(jù)文件的擴(kuò)展名來(lái)決定使用哪種格式保存。
** 轉(zhuǎn)換文件到JPEG **
save 函數(shù)的第二個(gè)參數(shù)可以指定使用的文件格式。如果文件名中使用了一個(gè)非標(biāo)準(zhǔn)的擴(kuò)展名,則必須通過(guò)第二個(gè)參數(shù)來(lái)指定文件格式。
** 創(chuàng)建JPEG縮略圖 **
需要注意的是,PIL只有在需要的時(shí)候才加載像素?cái)?shù)據(jù)。當(dāng)你打開(kāi)一個(gè)文件時(shí),PIL只是讀取文件頭獲得文件格式、圖像模式、圖像大小等屬性,而像素?cái)?shù)據(jù)只有在需要的時(shí)候才會(huì)加載。
這意味著打開(kāi)一個(gè)圖像文件是一個(gè)非常快的操作,不會(huì)受文件大小和壓縮算法類(lèi)型的影響。
** 獲得圖像信息 **
Image 類(lèi)提供了某些方法,可以操作圖像的子區(qū)域。提取圖像的某個(gè)子區(qū)域,使用 crop() 函數(shù)。
** 復(fù)制圖像的子區(qū)域 **
定義區(qū)域使用一個(gè)包含4個(gè)元素的元組,(left, upper, right, lower)。坐標(biāo)原點(diǎn)位于左上角。上面的例子提取的子區(qū)域包含300x300個(gè)像素。
該區(qū)域可以做接下來(lái)的處理然后再粘貼回去。
** 處理子區(qū)域然后粘貼回去 **
當(dāng)往回粘貼時(shí),區(qū)域的大小必須和參數(shù)匹配。另外區(qū)域不能超出圖像的邊界。然而原圖像和區(qū)域的顏色模式無(wú)需匹配。區(qū)域會(huì)自動(dòng)轉(zhuǎn)換。
** 滾動(dòng)圖像 **
paste() 函數(shù)有個(gè)可選參數(shù),接受一個(gè)掩碼圖像。掩碼中255表示指定位置為不透明,0表示粘貼的圖像完全透明,中間的值表示不同級(jí)別的透明度。
PIL允許分別操作多通道圖像的每個(gè)通道,比如RGB圖像。 split() 函數(shù)創(chuàng)建一個(gè)圖像集合,每個(gè)圖像包含一個(gè)通道。 merge() 函數(shù)接受一個(gè)顏色模式和一個(gè)圖像元組,然后將它們合并為一個(gè)新的圖像。接下來(lái)的例子交換了一個(gè)RGB圖像的三個(gè)通道。
** 分離和合并圖像通道 **
對(duì)于單通道圖像, split() 函數(shù)返回圖像本身。如果想處理各個(gè)顏色通道,你可能需要先將圖像轉(zhuǎn)為RGB模式。
resize() 函數(shù)接受一個(gè)元組,指定圖像的新大小。
rotate() 函數(shù)接受一個(gè)角度值,逆時(shí)針旋轉(zhuǎn)。
** 基本幾何變換 **
圖像旋轉(zhuǎn)90度也可以使用 transpose() 函數(shù)。 transpose() 函數(shù)也可以水平或垂直翻轉(zhuǎn)圖像。
** transpose **
transpose() 和 rotate() 函數(shù)在性能和結(jié)果上沒(méi)有區(qū)別。
更通用的圖像變換函數(shù)為 transform() 。
PIL可以轉(zhuǎn)換圖像的像素模式。
** 轉(zhuǎn)換顏色模式 **
PIL庫(kù)支持從其他模式轉(zhuǎn)為“L”或“RGB”模式,其他模式之間轉(zhuǎn)換,則需要使用一個(gè)中間圖像,通常是“RGB”圖像。
ImageFilter 模塊包含多個(gè)預(yù)定義的圖像增強(qiáng)過(guò)濾器用于 filter() 函數(shù)。
** 應(yīng)用過(guò)濾器 **
point() 函數(shù)用于操作圖像的像素值。該函數(shù)通常需要傳入一個(gè)函數(shù)對(duì)象,用于操作圖像的每個(gè)像素:
** 應(yīng)用點(diǎn)操作 **
使用以上技術(shù)可以快速地對(duì)圖像像素應(yīng)用任何簡(jiǎn)單的表達(dá)式。可以結(jié)合 point() 函數(shù)和 paste 函數(shù)修改圖像。
** 處理圖像的各個(gè)通道 **
注意用于創(chuàng)建掩碼圖像的語(yǔ)法:
Python計(jì)算邏輯表達(dá)式采用短路方式,即:如果and運(yùn)算符左側(cè)為false,就不再計(jì)算and右側(cè)的表達(dá)式,而且返回結(jié)果是表達(dá)式的結(jié)果。比如 a and b 如果a為false則返回a,如果a為true則返回b,詳見(jiàn)Python語(yǔ)法。
對(duì)于更多高級(jí)的圖像增強(qiáng)功能,可以使用 ImageEnhance 模塊中的類(lèi)。
可以調(diào)整圖像對(duì)比度、亮度、色彩平衡、銳度等。
** 增強(qiáng)圖像 **
PIL庫(kù)包含對(duì)圖像序列(動(dòng)畫(huà)格式)的基本支持。支持的序列格式包括 FLI/FLC 、 GIF 和一些實(shí)驗(yàn)性的格式。 TIFF 文件也可以包含多個(gè)幀。
當(dāng)打開(kāi)一個(gè)序列文件時(shí),PIL庫(kù)自動(dòng)加載第一幀。你可以使用 seek() 函數(shù) tell() 函數(shù)在不同幀之間移動(dòng)。
** 讀取序列 **
如例子中展示的,當(dāng)序列到達(dá)結(jié)尾時(shí),將拋出EOFError異常。
注意當(dāng)前版本的庫(kù)中多數(shù)底層驅(qū)動(dòng)只允許seek到下一幀。如果想回到前面的幀,只能重新打開(kāi)圖像。
以下迭代器類(lèi)允許在for語(yǔ)句中循環(huán)遍歷序列:
** 一個(gè)序列迭代器類(lèi) **
PIL庫(kù)包含一些函數(shù)用于將圖像、文本打印到Postscript打印機(jī)。以下是一個(gè)簡(jiǎn)單的例子。
** 打印到Postscript **
如前所述,可以使用 open() 函數(shù)打開(kāi)圖像文件,通常傳入一個(gè)文件名作為參數(shù):
如果打開(kāi)成功,返回一個(gè)Image對(duì)象,否則拋出IOError異常。
也可以使用一個(gè)file-like object代替文件名(暫可以理解為文件句柄)。該對(duì)象必須實(shí)現(xiàn)read,seek,tell函數(shù),必須以二進(jìn)制模式打開(kāi)。
** 從文件句柄打開(kāi)圖像 **
如果從字符串?dāng)?shù)據(jù)中讀取圖像,使用StringIO類(lèi):
** 從字符串中讀取 **
如果圖像文件內(nèi)嵌在一個(gè)大文件里,比如 tar 文件中。可以使用ContainerIO或TarIO模塊來(lái)訪(fǎng)問(wèn)。
** 從tar文檔中讀取 **
** 該小節(jié)不太理解,請(qǐng)參考原文 **
有些解碼器允許當(dāng)讀取文件時(shí)操作圖像。通常用于在創(chuàng)建縮略圖時(shí)加速解碼(當(dāng)速度比質(zhì)量重要時(shí))和輸出一個(gè)灰度圖到激光打印機(jī)時(shí)。
draft() 函數(shù)。
** Reading in draft mode **
輸出類(lèi)似以下內(nèi)容:
注意結(jié)果圖像可能不會(huì)和請(qǐng)求的模式和大小匹配。如果要確保圖像不大于指定的大小,請(qǐng)使用 thumbnail 函數(shù)。
Python2.7 教程 PIL
Python 之 使用 PIL 庫(kù)做圖像處理
來(lái)自