本文目錄一覽:
- 1、Python表示矩陣的方法分析
- 2、OpenCV-Python教程:22.輪廓層級
- 3、OpenCV-Python教程:19.輪廓屬性
- 4、Python解決矩陣問題
- 5、python怎麼識別圖片中每個線的基本形狀
Python表示矩陣的方法分析
Python表示矩陣的方法分析
本文實例講述了Python表示矩陣的方法。分享給大家供大家參考,具體如下:
在c語言中,表示個“整型3行4列”的矩陣,可以這樣聲明:int a[3][4];在python中一不能聲明變量int,二不能列出維數。可以利用列表中夾帶列表形式表示。例如:
表示矩陣 ,可以這樣:
count = 1
a = []
for i in range(0, 3):
tmp = []
for j in range(0, 3):
tmp.append(count)
count += 1
a.append(tmp)
print a
結果:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
但是注意一點:初始化(賦值全部為0時),下面是錯誤的!!
tmp = []
for j in range(0, 3):
tmp.append(0)
a = []
for i in range(0, 3):
a.append(tmp)
print a
結果:
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
原因:這樣的列表tmp為同一個,改變任意行,其他行都會給隨着改變,千萬注意!!,下面正確:
a = []
for i in range(0, 3):
tmp = []
for j in range(0, 3):
tmp.append(0)
a.append(tmp)
print a
OpenCV-Python教程:22.輪廓層級
理論
在前面的關於輪廓的幾節里,我們介紹了輪廓相關的一些函數。但當我們用cv2.findContours()函數來找輪廓的時候,我們傳入了一個參數,Contour Retrieval Mode。我們一般傳的是cv2.RETR_LIST或者cv2.RETR_TREE這樣就可以了。但是這個參數實際是什麼意思呢?
並且在輸出時我們得到了三個數組,第一個是圖像,第二個是我們的輪廓,第三個輸出名字是hierarchy。但是我們一直沒用這個。
什麼是層級?
一般來說我們用cv2.findContours()函數來檢測圖像里的目標,有時候目標在不同的地方,但是在有些情況下,有些圖形在別的圖形裡面,就像圖形嵌套,在這種情況下,我們把外面那層圖形叫做parent,裡面的叫child。這樣圖形里的輪廓之間就有了關係。我們可以指定一個輪廓和其他之間的是如何連接的,這種關係就是層級。
看下面的例子:
在這個圖像里,不同的圖形我標註了0-5,2和2a表示了最外層盒子的外部和內部輪廓。
這裡輪廓0,1,2是外部的。我們可以說他們是hierarchy-0,或者他們是同層級的。
接下來是contour-2a,可以認為是輪廓-2的孩子,或者反過來,contour-2是contour-2a的父親,所以它在hierarchy-1里。類似的contour-3是contour-2的孩子,在下一層級。最後contour4,5是contour-3a的孩子,它們在最後的層級。
OpenCV里的層級表示
每個輪廓有他自己的關於層級的信息,誰是他的孩子,誰是他的父親等。OpenCV用一個包含四個值得數組來表示:[Next, Previous, First_Child, Parent]
“Next表明同一層級的下一個輪廓”
比如,在我們的圖片里的contour-0,水上hi他相同層級的下一個輪廓?是contour-1,所以Next=1,對於Contour-1,下一個是contour-2,所以Next=2
那對於contour-2呢?沒有同層級的下一個輪廓,所以Next=-1。那麼對於contour-4呢?同層級的下一個是contour-5,所以下一個輪廓是contour-5.Next=5
“Previous指同層級的前一個輪廓”
和上面一樣,contour-1的前一個是contour-0.contour-2的前一個contour-1.對於contour-0沒有前序,所以-1
“First_Child指它的第一個孩子輪廓”
不用解釋,對於contour-2,孩子是contour-2a,所以這裡是contour-2a的索引,contour-3a有兩個孩子,但我們只取第一個,是contour-4,所以First_Child=4.
“Parent指它的父輪廓索引”
和First_Child相反,contour-4和contour-5的parent都是contour-3a,對於contour-3a,是contour-3
注意:
如果沒有孩子或者父親,就為-1
我們知道了層級,現在來看OpenCV里的輪廓獲取模式,四個標誌cv2.RETR_LIST, cv2.RETR_TREE, cv2.RETR_CCOMP, cv2.RETR_EXTERNAL表示啥?
輪廓獲取模式
1.RETR_LIST
這是最簡單的一個,它獲取所有輪廓,但是不建立父子關係,他們都是一個層級。
所以,層級屬性第三個和第四個字段(父子)都是-1,但是Next和Previous還是有對應值。
下面是結果,每行是對應輪廓的層級信息。
hierarchy
2.RETR_EXTERNAL
如果用這個模式,它返回最外層的。所有孩子輪廓都不要,我們可以說在這種情況下,只有家族裡最老的會被照顧,其他都不管。
所以在我們的圖像里,有多少最外層的輪廓呢,有3個,contours 0,1,2
3.RETR_CCOMP
這個模式獲取所有輪廓並且把他們組織到一個2層結構里,對象的輪廓外邊界在等級1里,輪廓內沿(如果有的話)放在層級2里。如果別的對象在它裡面,裡面的對象輪廓還是放在層級1里,它的內沿在層級2.
看下面的例子,輪廓的順序為紅色,他們的層級是綠色,
看第一個輪廓,contour-0,他的層級是1,他有兩個洞,contours1和2,他們都屬於層級2,所以對於contour-0,Next是contour-3,沒有前序,他的第一個孩子是contour-1,沒有parent,所以層級數組是[3,-1,1,-1]
看contour-1,他在層級2里,Next是contour-2,沒有前序,沒有孩子,parent是contour-0,所以數組是[2,-1,-1,0]
同樣對於contour-2,也在層級2里,沒有next,前序是contour-1,沒有孩子,parent是contour-0,所以[-1,1,-1,0]。
contour-3:next是contour-5,Previous是contour-0,Child是contour-4,沒有parent,所以[5,0,4,-1]
contour-4:在層級2里,沒有兄弟,所以沒有Next,沒有Previous,沒有孩子,parent是contour-3,[-1,-1,-1,3]
4.RETR_TREE
最後,Mr.Perfect。它取回所有的輪廓並且創建完整的家族層級列表,它甚至能告訴你誰是祖父,父親,兒子,孫子。。
比如把上面的圖形用cv2.RETR_TREE,
對於contour-0:層級是0,Next是contour-7,沒有previous,孩子是contour-1,沒有parent,所以[7,-1,1,-1]
contour-1:在層級1里,沒有同級的其他輪廓,沒有previous,孩子是contour-2,所以[-1,-1,2,0]
OpenCV里的直方圖
OpenCV-Python教程:19.輪廓屬性
1圖像矩
幫你計算一些屬性,比如重心,面積等。
函數cv2.moments()會給你一個字典,包含所有矩值
你可以從這個裡面得到有用的數據比如面積,重心等。重心可以用下面的式子得到:
2.輪廓面積
輪廓面積由函數cv2.contourArea()得到或者從矩里得到M[‘m00’]
3.輪廓周長
可以用cv2.arcLength()函數得到。第二個參數指定形狀是否是閉合的輪廓(如果傳True)。或者只是一個曲線。
4.輪廓近似
這會把輪廓形狀近似成別的邊數少的形狀,邊數由我們指定的精確度決定。這是Douglas-Peucker算法的實現。
要理解這個,假設你試圖找一個圖像里的方塊,但是由於圖像里的一些問題,你得不到一個完美的方塊,只能得到一個“壞方塊”。現在你可以使用這個函數來近似,第二個參數叫epsilon,是從輪廓到近似輪廓的最大距離。是一個準確率參數,好的epsilon的選擇可以得到正確的輸出。
在下面第二個圖像里,綠線顯示了epsilon = 10% of arc length 的近似曲線。第三個圖像顯示了epsilon = 1% of the arc length。第三個參數指定曲線是否閉合。
5.凸形外殼
凸形外殼和輪廓近似類似,但是還不一樣(某些情況下兩個甚至提供了同樣的結果)。這兒,cv2.convexHull()函數檢查凸面曲線缺陷並修復它。一般來說,凸面曲線總是外凸的,至少是平的,如果它內凹了,這就叫凸面缺陷。比如下面這張圖,紅線顯示了手的凸形外殼。雙向箭頭顯示了凸面缺陷,是輪廓外殼的最大偏差。
參數詳情:
·points 是我們傳入的輪廓
·hull 是輸出,一般我們不用傳
·clockwise: 方向標示,如果是True,輸出凸形外殼是順時針方向的。否則,是逆時針的。
·returnPoints:默認是True。然後會返回外殼的點的坐標。如果為False,它會返回輪廓對應外殼點的索引。
所以要獲得凸形外殼,下面
但是如果你想找到凸面缺陷,你需要傳入returnPoints = False。我們拿上面的矩形圖形來說,首先我找到他的輪廓cnt,現在用returnPoints = True來找他的凸形外殼,我得到下面的值:[[[234 202]], [[51 202]], [51 79]], [[234 79]]] 是四個角的點。如果你用returnPoints = False,我會得到下面的結果:[[129], [67], [0], [142]]. 這是輪廓里對應點的索引,比如cnt[129] = [234, 202]],這和前面結果一樣。
6.檢查凸面
有一個函數用來檢查是否曲線是凸面, cv2.isContourConvex().它返回True或False。
7.邊界矩形
有兩種邊界矩形
7.a.正邊界矩形
這個矩形不考慮對象的旋轉,所以邊界矩形的面積不是最小的,函數是cv2.boundingRect()。
假設矩形左上角的坐標是(x,y), (w, h)是它的寬和高
7.b.渲染矩形
這個邊界矩形是用最小面積畫出來的,所以要考慮旋轉。函數是cv2.minAreaRect()。它返回一個Box2D結構,包含了(左上角(x,y),(width, height),旋轉角度)。但是要畫這個矩形我們需要4個角。這四個角用函數cv2.boxPoints()得到
8.最小閉包圓
我們找一個目標的外接圓可以用函數cv2.minEnclosingCircle().這個圓用最小面積完全包圍目標。
9.橢圓
用一個橢圓來匹配目標。它返回一個旋轉了的矩形的內接橢圓
10. 直線
類似的我們可以匹配一根直線,下面的圖像包含一系列的白色點,我們可以給它一條近似的直線。
END
Python解決矩陣問題
下面是基於python3.4的數組矩陣輸入方法:
1.import numpy as np
2.arr = [1,2,3,4,5,6,7,8,9]
3.matrix_a = np.array(arr)2.
4.手動定義一個空數組:arr =[],鏈表數組:a = [1,2,[1,2,3]]。
Python, 是一種面向對象的解釋型計算機程序設計語言,由荷蘭人Guido van Rossum於1989年發明,第一個公開發行版發行於1991年。
Python是純粹的自由軟件, 源代碼和解釋器CPython遵循 GPL(GNU General Public License)協議[2] 。Python語法簡潔清晰,特色之一是強制用空白符(white space)作為語句縮進。
Python具有豐富和強大的庫。它常被昵稱為膠水語言,能夠把用其他語言製作的各種模塊(尤其是C/C++)很輕鬆地聯結在一起。常見的一種應用情形是,使用Python快速生成程序的原型(有時甚至是程序的最終界面),然後對其中[3] 有特別要求的部分,用更合適的語言改寫,比如3D遊戲中的圖形渲染模塊,性能要求特別高,就可以用C/C++重寫,而後封裝為Python可以調用的擴展類庫。需要注意的是在您使用擴展類庫時可能需要考慮平台問題,某些可能不提供跨平台的實現。
7月20日,IEEE發布2017年編程語言排行榜:Python高居首位。
python怎麼識別圖片中每個線的基本形狀
輪廓搜索
Cv2的方法。findContours用於查找輪廓。代碼示例如下:
Cr、t = cv2。cv2 findContours (b。retr_tree cv2.chain_approx_simple) #
第三個參數定義了輪廓的近似方式
在上述函數的參數中,第一個參數是二值化矩陣,第二個參數是獲得輪廓的方式,第三個參數是定義輪廓的近似方式。
搜索大綱
Cv2方法。FindContours用於查找contours。代碼示例如下:
Cr t等於cv2。Cv2 findContours (b. retr_tree Cv2 .chain_approx_simple) #
第三個參數定義了輪廓的近似方式
上述函數的參數中,第一個參數是二值化矩陣,第二個參數是獲取輪廓的方式,第三個參數是定義輪廓的近似方式。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/283474.html