荐 【图像处理】——实现二值图像的轮廓边界跟踪以及轮廓面积周长的求解(connectedComponentsWithStats()函数和connectedComponents()函数)
目录
二、cv2.connectedComponentsWithStats()
对于一个二值化图像的后续处理方式有两种方式,一种是利用cv2.findcontours()函数和cv2.ContourArea()函数对图像轮廓进行跟踪,可以得到图像轮廓的点集合,以及得到各个轮廓的面积值具体可见:
《【图像处理】——Python+opencv实现二值图像的轮廓边界跟踪以及轮廓面积周长的求解(findcontours函数和contourArea函数)》
另外一种方式就是用函数cv2.connectedComponentsWithStats()和函数cv2.connectedComponents()函数,可以得到轮廓的相关信息
一、cv2.connectedComponents()
函数原型:
retval, labels = connectedComponents(image, labels=None, connectivity=None, ltype=None)
输入参数解析:
一般指定需要进行标记的目标图像就行
image:用于标记的8位单通道图像
labels:标记的目标图像
connectivity:连通方式:4连通或8连通
Itype:输出图像的标记类型,当前只支持CV_32U和CV_16U
返回参数解析:
retval:不知道,反正用不上
labels:输出的是标记图像,所谓标记图像就是图像中每一个连通域都拥有一个标签(背景的标签是0),该标签即代表了此连通域的灰度值。例如,一幅图像中存在3个连通域(背景除外),那么他们的标签分别是1、2、3,他们的灰度值分别是1、2、3
二、cv2.connectedComponentsWithStats()
函数原型:
retval, labels, stats, centroids =
connectedComponentsWithStats(image, labels=None, stats=None, centroids=None, connectivity=None, ltype=None)
输入参数解析:
一般指定需要进行标记的目标图像就行
image:用于标记的8位单通道图像
labels:标记的目标图像
stats:含有各个轮廓的外接矩信息和面积的一个参数
centroids:质心
connectivity:连通方式:4连通或8连通
Itype:输出图像的标记类型,当前只支持CV_32U和CV_16U
输出参数解析:
retval:不知道
labels:输出的标记图像
stats:这个参数是最有用的,含有一些轮廓的统计信息,一个numpy数组
centroids:每一个轮廓的质心,返回一个numpy数组,计算公式为:
stats参数解析
stats参数是一个numpy数组,每一行代表一个轮廓,每一行固定为5个参数,依次是:
-
CC_STAT_LEFT 组件的左上角点像素点坐标的X位置
-
CC_STAT_TOP 组件的左上角点像素点坐标的Y位置
-
CC_STAT_WIDTH 组件外接矩形的宽度,计算方式为用每一个轮廓中最右边的点的x坐标减去最左边的点的x坐标
-
CC_STAT_HEIGHT 组件外接矩形的高度,计算方式为用每一个轮廓中最下边的点的y坐标减去最上边的点的y坐标
-
CC_STAT_AREA 当前连通组件的面积(像素单位),这里统计的是轮廓所包含的像素点的个数,不是外接矩形的面积
所以stats的shape为:mx5,m是轮廓的个数,第一个轮廓是背景轮廓,前两个参数为0,0
注:这里的矩形不一定是最小外接矩形,通过外接矩形我们就可以得到图像的几何特征——细长值
最小外接矩形可旋转图像得到,在90°范围内以3°为单位增量恒距离地旋转图像,每一次旋转都计算它的外接矩形的面积值。外接矩形面积达到最小值事,就得到了我们想要的最小外接矩形。即按照3度进行图像旋转得到新的图像,对新的图像再次进行轮廓的检测跟踪以及矩形的绘制,旋转一周后,取面积最小的矩形即为最小外接矩形
根据以上的stats参数,我们可以绘制的外接矩形,具体如下:
cv2.rectangle()函数
img = rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
img:进行绘制矩形的图像
pt1:矩形左上角角点坐标,是一个元组
pt2:矩形右下角角点坐标,是一个元组
color:绘制矩形的颜色,一般通过RGB的表示方式(R.G,B)
thickness:绘制矩形的线宽,如果是负数,则将轮廓区域进行填充
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 np
img_=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)
本文地址:https://blog.csdn.net/qq_45769063/article/details/107361960
上一篇: Python中列表元组字典集合的区别
下一篇: HQL查询