【图像处理】——实现二值图像的轮廓边界跟踪以及轮廓面积周长的求解(connectedComponentsWithStats()函数和connectedComponents()函数)

目录

一、cv2.connectedComponents()

函数原型:

输入参数解析:

返回参数解析:

二、cv2.connectedComponentsWithStats()

函数原型:

输入参数解析:

输出参数解析:

stats参数解析

cv2.rectangle()函数

三、实例


对于一个二值化图像的后续处理方式有两种方式,一种是利用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数组,计算公式为:

【图像处理】——实现二值图像的轮廓边界跟踪以及轮廓面积周长的求解(connectedComponentsWithStats()函数和connectedComponents()函数)_第1张图片

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.

三、实例

【图像处理】——实现二值图像的轮廓边界跟踪以及轮廓面积周长的求解(connectedComponentsWithStats()函数和connectedComponents()函数)_第2张图片

【图像处理】——实现二值图像的轮廓边界跟踪以及轮廓面积周长的求解(connectedComponentsWithStats()函数和connectedComponents()函数)_第3张图片

代码:

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)

 

 

 

你可能感兴趣的:(图像处理)