欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-10-04 10:23:13
对于一个二值化图像的后续处理方式有两种方式,一种是利用cv2.findcontours()函数和cv2.ContourArea()函数对图像轮廓进行跟踪,可以得到图像轮廓的点集合,以及得到各个轮廓的面积值具体可见:《【图像处理】——Python+opencv实现二值图像的轮廓边界跟踪以及轮廓面积周长的求解(findcontours函数和contourArea函数)》 另外一种方式就是用函数cv2.connectedComponentsWithStats()和函数cv2.connectedC...

目录

一、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()函数)

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()函数)

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

代码:

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