【图像处理】——实现二值图像的轮廓边界跟踪以及轮廓面积周长的求解(connectedComponentsWithStats()函数和connectedComponents()函数)
目錄
一、cv2.connectedComponents()
函數(shù)原型:
輸入?yún)?shù)解析:
返回參數(shù)解析:
二、cv2.connectedComponentsWithStats()
函數(shù)原型:
輸入?yún)?shù)解析:
輸出參數(shù)解析:
stats參數(shù)解析
cv2.rectangle()函數(shù)
三、實例
對于一個二值化圖像的后續(xù)處理方式有兩種方式,一種是利用cv2.findcontours()函數(shù)和cv2.ContourArea()函數(shù)對圖像輪廓進行跟蹤,可以得到圖像輪廓的點集合,以及得到各個輪廓的面積值具體可見:
《【圖像處理】——Python+opencv實現(xiàn)二值圖像的輪廓邊界跟蹤以及輪廓面積周長的求解(findcontours函數(shù)和contourArea函數(shù))》
????? 另外一種方式就是用函數(shù)cv2.connectedComponentsWithStats()和函數(shù)cv2.connectedComponents()函數(shù),可以得到輪廓的相關(guān)信息
一、cv2.connectedComponents()
函數(shù)原型:
retval, labels = connectedComponents(image, labels=None, connectivity=None, ltype=None)輸入?yún)?shù)解析:
一般指定需要進行標記的目標圖像就行
image:用于標記的8位單通道圖像
labels:標記的目標圖像
connectivity:連通方式:4連通或8連通
Itype:輸出圖像的標記類型,當前只支持CV_32U和CV_16U
?
返回參數(shù)解析:
retval:不知道,反正用不上
labels:輸出的是標記圖像,所謂標記圖像就是圖像中每一個連通域都擁有一個標簽(背景的標簽是0),該標簽即代表了此連通域的灰度值。例如,一幅圖像中存在3個連通域(背景除外),那么他們的標簽分別是1、2、3,他們的灰度值分別是1、2、3
二、cv2.connectedComponentsWithStats()
函數(shù)原型:
retval, labels, stats, centroids = connectedComponentsWithStats(image, labels=None, stats=None, centroids=None, connectivity=None, ltype=None)輸入?yún)?shù)解析:
一般指定需要進行標記的目標圖像就行
image:用于標記的8位單通道圖像
labels:標記的目標圖像
stats:含有各個輪廓的外接矩信息和面積的一個參數(shù)
centroids:質(zhì)心
connectivity:連通方式:4連通或8連通
Itype:輸出圖像的標記類型,當前只支持CV_32U和CV_16U
輸出參數(shù)解析:
retval:不知道
labels:輸出的標記圖像
stats:這個參數(shù)是最有用的,含有一些輪廓的統(tǒng)計信息,一個numpy數(shù)組
centroids:每一個輪廓的質(zhì)心,返回一個numpy數(shù)組,計算公式為:
stats參數(shù)解析
stats參數(shù)是一個numpy數(shù)組,每一行代表一個輪廓,每一行固定為5個參數(shù),依次是:
-
CC_STAT_LEFT 組件的左上角點像素點坐標的X位置
-
CC_STAT_TOP 組件的左上角點像素點坐標的Y位置
-
CC_STAT_WIDTH 組件外接矩形的寬度,計算方式為用每一個輪廓中最右邊的點的x坐標減去最左邊的點的x坐標
-
CC_STAT_HEIGHT 組件外接矩形的高度,計算方式為用每一個輪廓中最下邊的點的y坐標減去最上邊的點的y坐標
-
CC_STAT_AREA 當前連通組件的面積(像素單位),這里統(tǒng)計的是輪廓所包含的像素點的個數(shù),不是外接矩形的面積
所以stats的shape為:mx5,m是輪廓的個數(shù),第一個輪廓是背景輪廓,前兩個參數(shù)為0,0
注:這里的矩形不一定是最小外接矩形,通過外接矩形我們就可以得到圖像的幾何特征——細長值
最小外接矩形可旋轉(zhuǎn)圖像得到,在90°范圍內(nèi)以3°為單位增量恒距離地旋轉(zhuǎn)圖像,每一次旋轉(zhuǎn)都計算它的外接矩形的面積值。外接矩形面積達到最小值事,就得到了我們想要的最小外接矩形。即按照3度進行圖像旋轉(zhuǎn)得到新的圖像,對新的圖像再次進行輪廓的檢測跟蹤以及矩形的繪制,旋轉(zhuǎn)一周后,取面積最小的矩形即為最小外接矩形
根據(jù)以上的stats參數(shù),我們可以繪制的外接矩形,具體如下:
cv2.rectangle()函數(shù)
img = rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)img:進行繪制矩形的圖像
pt1:矩形左上角角點坐標,是一個元組
pt2:矩形右下角角點坐標,是一個元組
color:繪制矩形的顏色,一般通過RGB的表示方式(R.G,B)
thickness:繪制矩形的線寬,如果是負數(shù),則將輪廓區(qū)域進行填充
linetype:線型
返回的是:繪制后的圖像
. @brief Draws a simple, thick, or filled up-right rectangle.. . The function cv::rectangle draws a rectangle outline or a filled rectangle whose two opposite corners. are pt1 and pt2.. . @param img Image.. @param pt1 Vertex of the rectangle.. @param pt2 Vertex of the rectangle opposite to pt1 .. @param color Rectangle color or brightness (grayscale image).. @param thickness Thickness of lines that make up the rectangle. Negative values, like #FILLED,. mean that the function has to draw a filled rectangle.. @param lineType Type of the line. See #LineTypes. @param shift Number of fractional bits in the point coordinates.三、實例
代碼:
import cv2 import numpy as npimg_=cv2.imread('rice.png') img=cv2.cvtColor(img_,cv2.COLOR_BGR2GRAY)_, labels, stats, centroids = cv2.connectedComponentsWithStats(img,ltype=cv2.CV_16U)for istat in stats:if istat[3] > istat[4]:r = istat[3]else:r = istat[4]cv2.rectangle(img_, tuple(istat[0:2]), tuple(istat[0:2] + istat[2:4]), (0, 0, 255), thickness=2)cv2.imshow('',img_) cv2.waitKey(0)?
??
總結(jié)
以上是生活随笔為你收集整理的【图像处理】——实现二值图像的轮廓边界跟踪以及轮廓面积周长的求解(connectedComponentsWithStats()函数和connectedComponents()函数)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《React Native跨平台移动应用
- 下一篇: 算法笔记和上机实战训练指南(附下载)