在 python 中使用 matplotlib 繪制散點(diǎn)圖時(shí),可以使用 xtick.set_rotation() 函數(shù)來(lái)設(shè)置 x 軸刻度標(biāo)簽的旋轉(zhuǎn)角度。例如,要將 x 軸刻度標(biāo)簽傾斜 45 度,可以使用以下代碼:
為福貢等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及福貢網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、福貢網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
Copy code
import matplotlib.pyplot as plt
# 繪制散點(diǎn)圖
plt.scatter(x, y)
# 獲取 x 軸的刻度對(duì)象
xticks = plt.gca().get_xticks()
# 設(shè)置 x 軸刻度標(biāo)簽的旋轉(zhuǎn)角度
plt.gca().set_xticklabels(xticks, rotation=45)
# 顯示圖形
plt.show()
在這段代碼中,我們使用 plt.scatter() 函數(shù)繪制散點(diǎn)圖,然后使用 plt.gca().get_xticks() 函數(shù)獲取 x 軸的刻度對(duì)象。接著,我們使用 plt.gca().set_xticklabels() 函數(shù)設(shè)置 x 軸刻度標(biāo)簽的旋轉(zhuǎn)角度,最后使用 plt.show() 函數(shù)顯示圖形。
注意:在調(diào)用 plt.scatter() 函數(shù)之前,需要先設(shè)置 x 和 y 軸的數(shù)據(jù)。
環(huán)境
矩形操作是我們?cè)?OpenCV 里最常用的操作,其中最為常見(jiàn)的就是包圍框( Bounding Box )和旋轉(zhuǎn)矩形( Rotated Box )。 其中包圍框是最為常見(jiàn)的,對(duì)應(yīng) OpenCV 中的 boundingRect() ,使用正矩形框處物體,一般多用在目標(biāo)檢測(cè)中。使用包圍框框柱目標(biāo)物體,這種操作比較簡(jiǎn)單,但是通??蛑幸矔?huì)有一些其他的區(qū)域。其次就是使用旋轉(zhuǎn)矩形,也叫最小外接矩形,對(duì)應(yīng) OpenCV 中的 minAreaRect() ,用來(lái)使用旋轉(zhuǎn)矩形最大限度的框出目標(biāo)物體,減小背景干擾,在 OCR 任務(wù)中較為常用。
minAreaRect() 返回了所需區(qū)域的最小斜矩形的參數(shù),與包圍框直接返回四個(gè)頂點(diǎn)的坐標(biāo)不同,最小外接矩形返回的是矩形的 ((x, y), (w, h), angle) ,對(duì)應(yīng)了矩形的中心,寬度,高度和旋轉(zhuǎn)角度。
旋轉(zhuǎn)角度 angle 是水平軸( x 軸)逆時(shí)針旋轉(zhuǎn),與碰到的矩形的第一條邊的夾角。并且這個(gè)邊的邊長(zhǎng)是 width ,另一條邊邊長(zhǎng)是 height 。也就是說(shuō),在這里 width 與 height 不是按照長(zhǎng)短來(lái)定義的。
在 OpenCV 中,坐標(biāo)系原點(diǎn)在左上角,相對(duì)于 x 軸,逆時(shí)針旋轉(zhuǎn)角度為負(fù),順時(shí)針旋轉(zhuǎn)角度為正,所以函數(shù) minAreaRect() 返回的角度范圍時(shí) [-90~0) 。想象一個(gè)平放的長(zhǎng)矩形,調(diào)用 minAreaRect() 返回的角度為 -90 度。如果我們旋轉(zhuǎn)圖像,直到矩形樹(shù)立起來(lái),這是調(diào)用 minAreaRect() 得到的角度依然是 -90 度。
第一種裁剪旋轉(zhuǎn)矩形的方法是通過(guò)仿射變換旋轉(zhuǎn)圖像的方式。
仿射變換( Affine Transformation ) 是一種二維坐標(biāo)到二維坐標(biāo)之間的線性變換,保持二維圖形的“平直性”( straightness ,即變換后直線還是直線不會(huì)打彎,圓弧還是圓?。┖汀捌叫行浴保?parallelness ,其實(shí)是指保二維圖形間的相對(duì)位置關(guān)系不變,平行線還是平行線,相交直線的交角不變。)。
計(jì)算過(guò)程:
如果不做邊長(zhǎng)和角度的判斷,則只會(huì)沿著 x 軸的順時(shí)針?lè)较蜃鱿嗤笮〗嵌鹊男D(zhuǎn),不能保證旋轉(zhuǎn)后的視角是正確的視角:
根據(jù)任務(wù)目標(biāo)的類型,做邊長(zhǎng)和角度的判斷并進(jìn)行相應(yīng)的調(diào)整,可以保證旋轉(zhuǎn)后的視角是正確的視角:
第二種裁剪旋轉(zhuǎn)矩形的方法是通過(guò)透視變換直接將旋轉(zhuǎn)矩形的四個(gè)頂點(diǎn)映射到正矩形的四個(gè)頂點(diǎn)。
透視變換( Perspective Transformation )是將圖片投影到一個(gè)新的視平面( Viewing Plane ),也稱作投影映射( Projective Mapping )。
計(jì)算過(guò)程:
以上兩種方法都可以用來(lái)?yè)溉⌒D(zhuǎn)矩形的內(nèi)容。仿射變換方法需要預(yù)先對(duì)整張圖進(jìn)行旋轉(zhuǎn),通過(guò)觀察旋轉(zhuǎn)后的圖像可以發(fā)現(xiàn),有一部分圖像被旋轉(zhuǎn)出了圖像邊界,如果你要摳取的目標(biāo)正好在圖像邊緣附近,那么很容易出界導(dǎo)致圖像摳取的缺失。同時(shí)我們需要對(duì)寬、高和角度做出動(dòng)態(tài)的調(diào)整;透視變換的方法直接對(duì)摳取區(qū)域進(jìn)行了映射,這種方法可以省略旋轉(zhuǎn)的步驟,并且不會(huì)出現(xiàn)摳取內(nèi)容的缺失。同時(shí)我們只需要對(duì)4個(gè)頂點(diǎn)之間的映射關(guān)系做好定義即可,不需要考慮角度的問(wèn)題。相對(duì)的,透視變換相對(duì)于仿射變換計(jì)算量更大一些,不過(guò)這在 c++ 的底層實(shí)現(xiàn)上帶來(lái)的時(shí)延差距小于 ms 。
PIL (Python Imaging Library)
Python圖像處理庫(kù),該庫(kù)支持多種文件格式,提供強(qiáng)大的圖像處理功能。
PIL中最重要的類是Image類,該類在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類的實(shí)例,你就可以用該類定義的方法操作圖像。比如:顯示
( 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支持多種圖像格式。從磁盤中讀取文件,只需使用 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ì)受文件大小和壓縮算法類型的影響。
** 獲得圖像信息 **
Image 類提供了某些方法,可以操作圖像的子區(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 模塊中的類。
可以調(diào)整圖像對(duì)比度、亮度、色彩平衡、銳度等。
** 增強(qiáng)圖像 **
PIL庫(kù)包含對(duì)圖像序列(動(dòng)畫格式)的基本支持。支持的序列格式包括 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)圖像。
以下迭代器類允許在for語(yǔ)句中循環(huán)遍歷序列:
** 一個(gè)序列迭代器類 **
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類:
** 從字符串中讀取 **
如果圖像文件內(nèi)嵌在一個(gè)大文件里,比如 tar 文件中。可以使用ContainerIO或TarIO模塊來(lái)訪問(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 **
輸出類似以下內(nèi)容:
注意結(jié)果圖像可能不會(huì)和請(qǐng)求的模式和大小匹配。如果要確保圖像不大于指定的大小,請(qǐng)使用 thumbnail 函數(shù)。
Python2.7 教程 PIL
Python 之 使用 PIL 庫(kù)做圖像處理
來(lái)自
名稱欄目:python旋轉(zhuǎn)圖形函數(shù) python旋轉(zhuǎn)坐標(biāo)系
本文地址:http://aaarwkj.com/article12/hhpjgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、面包屑導(dǎo)航、網(wǎng)頁(yè)設(shè)計(jì)公司、全網(wǎng)營(yíng)銷推廣、網(wǎng)站導(dǎo)航、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)