python矩陣輪廓檢測,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-tw/n/283474.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-22 08:08
下一篇 2024-12-22 08:08

相關推薦

  • 如何在Java中拼接OBJ格式的文件並生成完整的圖像

    OBJ格式是一種用於表示3D對象的標準格式,通常由一組頂點、面和紋理映射坐標組成。在本文中,我們將討論如何將多個OBJ文件拼接在一起,生成一個完整的3D模型。 一、讀取OBJ文件 …

    編程 2025-04-29
  • Python將矩陣存為CSV文件

    CSV文件是一種通用的文件格式,在統計學和計算機科學中非常常見,一些數據分析工具如Microsoft Excel,Google Sheets等都支持讀取CSV文件。Python內置…

    編程 2025-04-29
  • 如何實現圖像粘貼到蒙版

    本文將從多個方面介紹圖像粘貼到蒙版的實現方法。 一、創建蒙版 首先,在HTML中創建一個蒙版元素,用於接收要粘貼的圖片。 <div id=”mask” style=”widt…

    編程 2025-04-29
  • Python雙重循環輸出矩陣

    本文將介紹如何使用Python雙重循環輸出矩陣,並從以下幾個方面詳細闡述。 一、生成矩陣 要輸出矩陣,首先需要生成一個矩陣。我們可以使用Python中的列表(List)來實現。具體…

    編程 2025-04-29
  • 二階快速求逆矩陣

    快速求逆矩陣是數學中的一個重要問題,特別是對於線性代數中的矩陣求逆運算,如果使用普通的求逆矩陣方法,時間複雜度為O(n^3),計算量非常大。因此,在實際應用中需要使用更高效的演算法。…

    編程 2025-04-28
  • Python圖像黑白反轉用法介紹

    本文將從多個方面詳細闡述Python圖像黑白反轉的方法和技巧。 一、Pillow模塊介紹 Pillow是Python的一個圖像處理模塊,可以進行圖片的裁剪、旋轉、縮放等操作。使用P…

    編程 2025-04-28
  • Matlab二值圖像全面解析

    本文將全面介紹Matlab二值圖像的相關知識,包括二值圖像的基本原理、如何對二值圖像進行處理、如何從二值圖像中提取信息等等。通過本文的學習,你將能夠掌握Matlab二值圖像的基本操…

    編程 2025-04-28
  • Python矩陣轉置函數Numpy

    本文將介紹如何使用Python中的Numpy庫實現矩陣轉置。 一、Numpy庫簡介 在介紹矩陣轉置之前,我們需要了解一下Numpy庫。Numpy是Python語言的計算科學領域的基…

    編程 2025-04-28
  • 矩陣歸一化處理軟體

    矩陣歸一化是一種數學處理方法,可以將數據在一定範圍內進行標準化,以達到更好的分析效果。在本文中,我們將詳細介紹矩陣歸一化處理軟體。 一、矩陣歸一化處理的概念 矩陣歸一化是一種將數值…

    編程 2025-04-28
  • 矩陣比較大小的判斷方法

    本文將從以下幾個方面對矩陣比較大小的判斷方法進行詳細闡述: 一、判斷矩陣中心 在比較矩陣大小前,我們需要先確定矩陣中心的位置,一般採用以下兩種方法: 1.行列判斷法 int mid…

    編程 2025-04-28

發表回復

登錄後才能評論