cv2.imshow("left", img_left)
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、微信平臺(tái)小程序開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶(hù)創(chuàng)新互聯(lián)還提供了城固免費(fèi)建站歡迎大家使用!
filename3=str(number)+'n3'+'.jpg' #打印第number張圖片+增值方式+保存類(lèi)型
cv2.imwrite(savedpath + filename3, img_left)
"""
# 數(shù)據(jù)增強(qiáng)實(shí)現(xiàn)
"""
import cv2
import numpy as np
import os
# 圖像平移
def img_translation(image):
# 圖像平移 下、上、右、左平移
M = np.float32([[1, 0, 0], [0, 1, 100]])
img_down = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
M = np.float32([[1, 0, 0], [0, 1, -100]])
img_up = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
M = np.float32([[1, 0, 100], [0, 1, 0]])
img_right = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
M = np.float32([[1, 0, -100], [0, 1, 0]])
img_left = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
# 保存圖片,需要保存上述的哪一圖片,就在cv2.imwrite()中,將哪一圖片名放入。
# filename='xxx' +'.jpeg'
# cv2.imwrite(savedpath + filename, img_left)
# 顯示圖形
cv2.imshow("down", img_down)
filename0=str(number)+'n0'+'.jpg'
cv2.imwrite(savedpath + filename0, img_down)
cv2.imshow("up", img_up)
filename1=str(number)+'n1'+'.jpg'
cv2.imwrite(savedpath + filename1, img_up)
cv2.imshow("right", img_right)
filename2=str(number)+'n2'+'.jpg'
cv2.imwrite(savedpath + filename2, img_right)
cv2.imshow("left", img_left)
filename3=str(number)+'n3'+'.jpg'
cv2.imwrite(savedpath + filename3, img_left)
# 圖像縮放
def img_scale(image):
result = cv2.resize(image, (224, 224))
cv2.imshow("scale", result)
filename=str(number)+'n5'+'.jpg'
cv2.imwrite(savedpath + filename, result)
# 圖像翻轉(zhuǎn)
def img_flip(image):
# 0以X軸為對(duì)稱(chēng)軸翻轉(zhuǎn),0以Y軸為對(duì)稱(chēng)軸翻轉(zhuǎn), 0X軸Y軸翻轉(zhuǎn)
horizontally = cv2.flip(image, 0) # 水平鏡像
vertically = cv2.flip(image, 1) # 垂直鏡像
hv = cv2.flip(image, -1) # 水平垂直鏡像
# 顯示圖形
cv2.imshow("Horizontally", horizontally)
filename1=str(number)+'n6'+'.jpg'
cv2.imwrite(savedpath + filename1, horizontally)
cv2.imshow("Vertically", vertically)
filename2=str(number)+'n7'+'.jpg'
cv2.imwrite(savedpath + filename2, vertically)
cv2.imshow("Horizontally Vertically", hv)
filename3=str(number)+'n8'+'.jpg'
cv2.imwrite(savedpath + filename3, hv)
# 圖像旋轉(zhuǎn)
def img_rotation(image):
# 原圖的高、寬 以及通道數(shù)
rows, cols, channel = image.shape
# 繞圖像的中心旋轉(zhuǎn)
# 參數(shù):旋轉(zhuǎn)中心 旋轉(zhuǎn)度數(shù) scale
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 30, 1)
# 參數(shù):原始圖像 旋轉(zhuǎn)參數(shù) 元素圖像寬高
rotated = cv2.warpAffine(image, M, (cols, rows))
# 顯示圖像
cv2.imshow("rotated", rotated)
filename1=str(number)+'n9'+'.jpg'
cv2.imwrite(savedpath + filename1, rotated)
#選裝60度
W = cv2.getRotationMatrix2D((cols / 2, rows / 2), 60, 1)
# 參數(shù):原始圖像 旋轉(zhuǎn)參數(shù) 元素圖像寬高
rotated1 = cv2.warpAffine(image, W, (cols, rows))
cv2.imshow("rotated", rotated)
filename2=str(number)+'n12'+'.jpg'
cv2.imwrite(savedpath + filename2, rotated1)
#選裝145度
W = cv2.getRotationMatrix2D((cols / 2, rows / 2), 60, 1)
# 參數(shù):原始圖像 旋轉(zhuǎn)參數(shù) 元素圖像寬高
rotated2 = cv2.warpAffine(image, W, (cols, rows))
cv2.imshow("rotated", rotated)
filename3=str(number)+'n13'+'.jpg'
cv2.imwrite(savedpath + filename3, rotated2)
# 圖像加噪
def img_noise(image, mean=0, var=0.001):
'''
添加高斯噪聲
mean : 均值
var : 方差
'''
image = np.array(image / 255, dtype=float)
noise = np.random.normal(mean, var ** 0.5, image.shape)
out = image + noise
if out.min() 0:
low_clip = -1.
else:
low_clip = 0.
out = np.clip(out, low_clip, 1.0)
out = np.uint8(out * 255)
cv2.imshow("noise", out)
filename3=str(number)+'n10'+'.jpg'
cv2.imwrite(savedpath + filename3, out)
# 圖像亮度調(diào)節(jié)
def img_brightness(image):
contrast = 1 # 對(duì)比度
brightness = 100 # 亮度
pic_turn = cv2.addWeighted(image, contrast, image, 0, brightness)
# cv2.addWeighted(對(duì)象,對(duì)比度,對(duì)象,對(duì)比度)
'''cv2.addWeighted()實(shí)現(xiàn)的是圖像透明度的改變與圖像的疊加'''
cv2.imshow('bright', pic_turn) # 顯示圖片
filename3=str(number)+'n11'+'.jpg'
cv2.imwrite(savedpath + filename3, pic_turn)
if __name__ == '__main__':
i = 0
path = '../Data/'
print(path)
savedpath = './result_new/'
filelist = os.listdir(path)
total_num = len(filelist)
for item in filelist:
number = i + 1
i = number
print("######")
print("打印到第",i,"張圖片")
src = cv2.imread(path + item)
img_translation(src)
img_scale(src)
img_flip(src)
img_rotation(src)
img_noise(src)
img_brightness(src)
cv2.waitKey(0)
cv2.destroyAllWindows()
代碼較為繁瑣,有空之后進(jìn)行優(yōu)化
輸出結(jié)果
使用matplotlib畫(huà)圖保存方法:
首先,import頭文件如下:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib.pyplot
import plot,savefig
畫(huà)圖:fig, ax = plt.subplots(figsize=(12, 12))
ax.imshow(im, aspect='equal') #im表示顯示的圖像
保存圖片:savefig("D:/1.jpg")
展示圖片:plt.show()
PIL (Python Imaging Library)
Python圖像處理庫(kù),該庫(kù)支持多種文件格式,提供強(qiáng)大的圖像處理功能。
PIL中最重要的類(lèi)是Image類(lèi),該類(lèi)在Image模塊中定義。
從文件加載圖像:
如果成功,這個(gè)函數(shù)返回一個(gè)Image對(duì)象?,F(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 文件中??梢允褂肅ontainerIO或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)自
要使用python,必須先安裝python,一般是2.7版本以上,不管是在windows系統(tǒng),還是linux系統(tǒng),安裝都是非常簡(jiǎn)單的。
要使用python進(jìn)行各種開(kāi)發(fā),就必須安裝對(duì)應(yīng)的庫(kù)。(推薦學(xué)習(xí):Python視頻教程)
這和matlab非常相似,只是matlab里面叫工具箱(toolbox),而python里面叫庫(kù)或包。安裝這些庫(kù),一般都是使用pip來(lái)安裝。
使用python進(jìn)行數(shù)字圖片處理,還得安裝Pillow包。雖然python里面自帶一個(gè)PIL(python images library), 但這個(gè)庫(kù)現(xiàn)在已經(jīng)停止更新了,所以使用Pillow, 它是由PIL發(fā)展而來(lái)的。
圖片的打開(kāi)與顯示
雖然使用的是Pillow,但它是由PIL fork而來(lái),因此還是要從PIL中進(jìn)行import. 使用open()函數(shù)來(lái)打開(kāi)圖片,使用show()函數(shù)來(lái)顯示圖片。
這種圖片顯示方式是調(diào)用操作系統(tǒng)自帶的圖片瀏覽器來(lái)打開(kāi)圖片,有些時(shí)候這種方式不太方便,因此我們也可以使用另上一種方式,讓程序來(lái)繪制圖片。
這種方法雖然復(fù)雜了些,但推薦使用這種方法,它使用一個(gè)matplotlib的庫(kù)來(lái)繪制圖片進(jìn)行顯示。matplotlib是一個(gè)專(zhuān)業(yè)繪圖的庫(kù),相當(dāng)于matlab中的plot,可以設(shè)置多個(gè)figure,設(shè)置figure的標(biāo)題,甚至可以使用subplot在一個(gè)figure中顯示多張圖片。
python中保存圖片的方法:
1、使用io模塊的imsave(fname,arr)函數(shù)來(lái)保存生成的圖片。
第一個(gè)參數(shù)表示保存的路徑和名稱(chēng),第二個(gè)參數(shù)表示需要保存的數(shù)組變量。
示例:
2、使用plt.savefig()方法保存
python保存img文件有兩種方法:
1、使用matplotlib模塊的“matplotlib.image.imsave()”函數(shù)可以保存圖片
示例代碼如下:
2、使用opencv模塊“opencv.imwrite()”函數(shù)可以保存圖片
、
更多Python知識(shí),請(qǐng)關(guān)注:Python自學(xué)網(wǎng)?。?/p>
1、 定義x和y,畫(huà)圖展示,保存圖片
其中dpi參數(shù)指定圖像的分辨率為120
2、 優(yōu)化繪圖線(xiàn)條風(fēng)格
線(xiàn)條顏色color
線(xiàn)條標(biāo)記marker
線(xiàn)條風(fēng)格linestyle
3、 坐標(biāo)軸的控制
坐標(biāo)軸范圍和標(biāo)題
坐標(biāo)圖上標(biāo)記
坐標(biāo)間隔設(shè)定
函數(shù)plt.xticks()和plt.xticks()用來(lái)實(shí)現(xiàn)對(duì)x軸和y軸坐標(biāo)間隔(也就是軸記號(hào))的設(shè)定。用法上,函數(shù)的輸入是兩個(gè)列表,第一個(gè)表示取值,第二個(gè)表示標(biāo)記。當(dāng)然如果你的標(biāo)記就是取值本身,則第二個(gè)列表可以忽略
多圖與子圖
figure() 函數(shù)可以幫助我們同時(shí)處理生成多個(gè)圖,而subplot()函數(shù)則用來(lái)實(shí)現(xiàn),在一個(gè)大圖中,出現(xiàn)多個(gè)小的子圖。需要注意的是, figure() 中的參數(shù)為圖片序號(hào),一般是按序增加的,這里面還涉及一個(gè)當(dāng)前圖的概念,其中 subplot() 的參數(shù)有3個(gè),分別為行數(shù)、列數(shù)、以及子圖序號(hào)。比如 subplot(1,2,1) 表示這是一個(gè)1行,2列布局的圖(兩個(gè)子圖,在同一行,分居左右),其中,當(dāng)前處理的子圖是第一個(gè)圖(也就是左圖)。
這樣,我們就用一個(gè)腳本畫(huà)了兩張圖fig.1和fig.2。其中,fig.1包含了分居左右的兩個(gè)子圖,分別是y1和y3的曲線(xiàn);fig.2是一張整圖,畫(huà)的是y2曲線(xiàn)。
如果想要某個(gè)子圖占據(jù)整行或者整列,可以采用下面
第三個(gè)圖,實(shí)際上相當(dāng)于將前面的兩個(gè)小的子圖看作是一個(gè)整圖