欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

OpenCV-Python實現(xiàn)輪廓的特征值

 更新時間:2021年06月09日 15:34:36   作者:一天一篇Python庫  
輪廓自身的一些屬性特征及輪廓所包圍對象的特征對于描述圖像具有重要意義。本篇博文將介紹幾個輪廓自身的屬性特征及輪廓包圍對象的特征,感興趣的可以了解一下

前言

輪廓自身的一些屬性特征及輪廓所包圍對象的特征對于描述圖像具有重要意義。本篇博文將介紹幾個輪廓自身的屬性特征及輪廓包圍對象的特征。

寬高比

在輪廓中,我們可以通過寬高比來描述輪廓,例如矩形的輪廓寬高比為:

寬高比=寬度/高度

下面,我們來計算矩形輪廓的寬高比,代碼如下:

import cv2

img = cv2.imread("26_1.jpg")
cv2.imshow("img", img)

# 轉換為灰度圖像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

x, y, w, h = cv2.boundingRect(contours[0])
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 3)
cv2.imshow("img1", img)

aspectRatio=float(w)/h
print(aspectRatio)

cv2.waitKey()
cv2.destroyAllWindows()

運行之后,我們可以得到輪廓的寬高比約為3:

寬高比

Extend

我們還可以使用輪廓面積與矩形邊界面積之比Extend來描述圖像及其輪廓特征,數(shù)學計算公式圖下:

Extend=輪廓面積/矩形邊界面積

下面,我們來計算Extend,代碼如下:

import cv2

img = cv2.imread("26_1.jpg")
cv2.imshow("img", img)

# 轉換為灰度圖像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

x, y, w, h = cv2.boundingRect(contours[0])
rectArea=w*h#矩形邊界面積
cntArea=cv2.contourArea(contours[0])#輪廓面積
extend=float(cntArea)/rectArea
print(extend)

本例中,輪廓面積與矩形邊界面積的比值Extend大約為0.8:

0.7

Solidity

我們還可以使用輪廓面積與凸包面積之比Solidity來衡量圖像,輪廓以及凸包的特征。其數(shù)學計算公式為:

Slidity=輪廓面積/凸包面積

下面,我們來計算Slidity,代碼如下:

import cv2

img = cv2.imread("26_1.jpg")
cv2.imshow("img", img)

# 轉換為灰度圖像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

x, y, w, h = cv2.boundingRect(contours[0])
cntArea=cv2.contourArea(contours[0])#輪廓面積
hull=cv2.convexHull(contours[0])
hullArea=cv2.contourArea(hull)#凸包面積
solidity=float(cntArea)/hullArea
print(solidity)

運行之后,本例輪廓面積與凸包面積的比值solidity約為1:

比例

等效直徑

在OpenCV中,我們還可以使用等效直徑來衡量輪廓的特征值,該值是與輪廓面積相等的圓形的直徑。其數(shù)學計算公式為:

等效直徑

下面,我們來計算與輪廓面積相等的圓形直徑,代碼如下:

import cv2
import numpy as np

img = cv2.imread("26_1.jpg")
cv2.imshow("img", img)

# 轉換為灰度圖像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

x, y, w, h = cv2.boundingRect(contours[0])
cntArea=cv2.contourArea(contours[0])#輪廓面積
equiDiameter=np.sqrt(4*cntArea/np.pi)
print(equiDiameter)
cv2.circle(img,(100,100),int(equiDiameter/2),(0,255,0),3)
cv2.imshow("img1",img)
cv2.waitKey()
cv2.destroyAllWindows()

運行之后,我們得到其等效直徑約為145:

等效直徑

方向

在OpenCV中,函數(shù)cv2.fitEllipse()可以用來構建最優(yōu)擬合橢圓,還可以在返回值內分別返回橢圓的中心點,軸長,旋轉角度信息。使用這種形式,能夠直觀地獲取橢圓的方向等信息。

函數(shù)cv2.fitEllipse()返回值為:

(x,y):橢圓的中心點

(MA,ma):橢圓水平方向軸與垂直方向軸的長度

angle:橢圓的旋轉角度

import cv2

img = cv2.imread("26_1.jpg")
cv2.imshow("img", img)

# 轉換為灰度圖像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

ellipsis=cv2.fitEllipse(contours[0])

(x, y), (MA, ma), angle = cv2.fitEllipse(contours[0])

print((x, y), (MA, ma), angle)

cv2.ellipse(img, ellipsis, (0, 255, 0), 2)
cv2.imshow("img1", img)
cv2.waitKey()
cv2.destroyAllWindows()

本來就是橢圓圖,下面擬合后正好也是橢圓:

橢圓

掩摸和像素點

有時候,我們還像獲取某對象的掩摸圖像及其對應的點。在OpenCV中,它還提供了cv2.findNonZero()函數(shù)用于獲取一個圖像內的輪廓點位置,其完整定義如下:

def findNonZero(src, idx=None): 

src:要查找非零元素的圖像

idx:返回值,表示非0元素的索引位置。具體格式為(行號,列號)

下面,我們實測該函數(shù),代碼如下:

import cv2
import numpy as np

img = cv2.imread("26_1.jpg")

cv2.imshow("img", img)

# 轉換為灰度圖像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

mask=np.zeros(gray.shape,np.uint8)
cv2.drawContours(mask,[contours[0]],0,255,2)
pixelpoints=cv2.findNonZero(mask)
print(pixelpoints)

cv2.imshow("img1", mask)
cv2.waitKey()
cv2.destroyAllWindows()

運行之后,我們會得到輪廓點位置:

輪廓點位置

最大值,最小值以及它們的位置

在OpenCV中,它提供cv2.minMaxLoc()函數(shù)獲取指定對象內最大值,最小值以及位置等信息,其完整定義如下:

def minMaxLoc(src, mask=None): 

src:單通道圖像

mask:掩摸,通過使用掩摸圖像,得到掩膜指定區(qū)域內的最值信息

該函數(shù)返回4個值:最小值,最大值,最小值位置,最大值位置。

下面,我們來獲取這些值,代碼如下:

import cv2
import numpy as np

img = cv2.imread("26_1.jpg")

cv2.imshow("img", img)

# 轉換為灰度圖像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

mask = np.zeros(gray.shape, np.uint8)
cv2.drawContours(mask, [contours[0]], 0, 255, 2)

min, max, min_loc, max_loc = cv2.minMaxLoc(gray, mask)
print(min, max, min_loc, max_loc)

運行之后,控制臺輸出4個值:

最小值

平均顏色及平均灰度

在OpenCV中,它給我們提供cv2.mean()函數(shù)計算一個對象的平均顏色與平均灰度。其完整定義如下:

def mean(src, mask=None):

參數(shù)與上面兩個小節(jié)一樣,這里不在贅述。下面,我們來使用這個函數(shù),代碼如下:

import cv2
import numpy as np

img = cv2.imread("26_1.jpg")


cv2.imshow("img", img)

# 轉換為灰度圖像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

mask=np.zeros(gray.shape,np.uint8)
cv2.drawContours(mask,[contours[0]],0,255,2)

mean=cv2.mean(img,mask)

運行之后,輸出4個值:RGB以及A通道的均值:

顏色平均值

極點

有時候,我們希望獲取某個對象內的極點,比如最左,最右,最上,最下等。在OpenCV中,它給我們提供了以下方法進行獲?。?/p>

left=tuple(cnt[cnt[:,:,0].argmin()][0])
right=tuple(cnt[cnt[:,:,0].argmax()][0])
top=tuple(cnt[cnt[:,:,1].argmin()][0])
bottom=tuple(cnt[cnt[:,:,1].argmax()][0])

下面,我們來通過這些方法獲取,代碼如下:

import cv2
import numpy as np

img = cv2.imread("26_1.jpg")

cv2.imshow("img", img)

# 轉換為灰度圖像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

mask = np.zeros(img.shape, np.uint8)
cnt = contours[0]
left = tuple(cnt[cnt[:, :, 0].argmin()][0])
right = tuple(cnt[cnt[:, :, 0].argmax()][0])
top = tuple(cnt[cnt[:, :, 1].argmin()][0])
bottom = tuple(cnt[cnt[:, :, 1].argmax()][0])

print(left, right, top, bottom)

font = cv2.FONT_HERSHEY_SIMPLEX

cv2.putText(img, "left", left, font, 1, (0, 255, 0), 2)
cv2.putText(img, "right", right, font, 1, (0, 255, 0), 2)
cv2.putText(img, "top", top, font, 1, (0, 255, 0), 2)
cv2.putText(img, "bottom", bottom, font, 1, (0, 255, 0), 2)

cv2.imshow("result",img)
cv2.waitKey()
cv2.destroyAllWindows()

運行之后,值與效果如下:

上下左右

到此這篇關于OpenCV-Python實現(xiàn)輪廓的特征值的文章就介紹到這了,更多相關OpenCV 輪廓的特征值內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Django使用詳解:ORM 的反向查找(related_name)

    Django使用詳解:ORM 的反向查找(related_name)

    今天小編就為大家分享一篇Django使用詳解:ORM 的反向查找(related_name),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 如何將自己寫的模塊上傳到pypi

    如何將自己寫的模塊上傳到pypi

    這篇文章主要介紹了如何將自己寫的模塊上傳到pypi,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下
    2021-03-03
  • Python requests接口測試實現(xiàn)代碼

    Python requests接口測試實現(xiàn)代碼

    這篇文章主要介紹了Python requests接口測試實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • python 實現(xiàn)在tkinter中動態(tài)顯示label圖片的方法

    python 實現(xiàn)在tkinter中動態(tài)顯示label圖片的方法

    今天小編就為大家分享一篇python 實現(xiàn)在tkinter中動態(tài)顯示label圖片的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • Python中xml和json格式相互轉換操作示例

    Python中xml和json格式相互轉換操作示例

    這篇文章主要介紹了Python中xml和json格式相互轉換操作,結合實例形式分析了xmltodict庫的安裝及xml格式與json格式數(shù)據相互轉換操作技巧,需要的朋友可以參考下
    2018-12-12
  • 利用python在大量數(shù)據文件下刪除某一行的例子

    利用python在大量數(shù)據文件下刪除某一行的例子

    今天小編就為大家分享一篇利用python在大量數(shù)據文件下刪除某一行的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • PyInstaller?完美打包?Python?腳本

    PyInstaller?完美打包?Python?腳本

    PyInstaller?是一個用于將?Python?腳本打包成可執(zhí)行文件的工具,支持?Windows、Linux?和?macOS?等多個平臺。它可以將?Python?腳本及其依賴項打包成一個獨立的可執(zhí)行文件,方便用戶在沒有?Python?環(huán)境的機器上運行程序。
    2023-06-06
  • python庫lxml在linux和WIN系統(tǒng)下的安裝

    python庫lxml在linux和WIN系統(tǒng)下的安裝

    這篇內容我們給大家分享了lxml在WIN和LINUX系統(tǒng)下的簡單快速安裝過程,有興趣的朋友參考學習下。
    2018-06-06
  • Python實現(xiàn)隨機游走的詳細解釋

    Python實現(xiàn)隨機游走的詳細解釋

    這篇文章主要介紹了Python實現(xiàn)隨機游走的詳細解釋,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Python 類中引用其他類的實現(xiàn)示例

    Python 類中引用其他類的實現(xiàn)示例

    在Python中,類的引用是通過屬性或方法與其他類實例關聯(lián),實現(xiàn)復雜邏輯,本文介紹了關聯(lián)、組合等類之間的引用方式,具有一定的參考價值,感興趣的可以了解一下
    2024-09-09

最新評論