精华内容
下载资源
问答
  • 连通区域检测

    万次阅读 2011-09-26 22:16:33
    连通区域检测是图像处理、模式识别中常用的一个基本方法。在目标分割,边缘检测,区域检测中有着广泛的应用。这里,我介绍一种连通区域的检测方法,参考文献是《基于递归的二值图像连通区域像素标记算法》,徐正光、...

    连通区域检测是图像处理、模式识别中常用的一个基本方法。在目标分割,边缘检测,区域检测中有着广泛的应用。这里,我介绍一种连通区域的检测方法,参考文献是《基于递归的二值图像连通区域像素标记算法》,徐正光、鲍东来、张利欣,计算机工程,2006年。(该文章可以在这里下载:http://cvchina.net/forum.php?mod=viewthread&tid=852#lastpost

    这里,我把论文中提到的连通区域检测算法的关键部分,摘抄整理出来。

    首先,连通区域是对二值图像进行处理的,即,该图像,只有黑(0)和白(255)两种颜色,这里,假设目标为白色,背景为黑色。标记算法首先对二值图像进行一次完整的扫描,标记所有目标像素点的同时,得到并记录等价标记对。等价标记对(以下简称等价对)的产生是由于扫描次序的不同,导致开始时认为是两个不同的连通区域,后来随着扫描的深入,又发现这两个区域是连通的。所以,需要记录等价对,以表明它们隶属于同一个连通区域,以便第一次扫描结束后进行修正。标记算法首先对二值图像的每一个像素进行8连通区域的标记,即:对任意一个像素的上、下、左、右、左上、右上、右下、左下,共8个相邻像素进行比较。由于不是每个像素都有8个相邻像素,对于一些特殊位置的像素点需要特殊考虑,其中包括:

    (1)二值图像左上角的像素,由于是第一个要扫描的像素,无需进行8连通区域的检测,也无需考虑记录等价对的问题。

    (2)二值图像第一行的像素,只需要考虑左边相邻像素的连通性,无需考虑记录等价对。

    (3)二值图像第一列的像素,只需要考虑上和右上2个相邻像素的连通性。

    (4)二值图像最后一列的像素,只需要考虑左、左上、上3个相邻像素的连通性。

    除了以上4种情况,其它像素,都需要考虑其8个相邻像素的连通性,如果出现不同连通标记的相邻像素,还需要考虑记录等价对的问题。

    连通算法中的二值图像扫描步骤归纳如下:

    (1)标记图像左上角,即,第一行第一列的像素。如果其像素值为255,则标记该点的值为1,否则,开始扫描第一行第二列的像素。

    (2)标记第一行的其它像素,此时,不会产生等价对的情况,不必考虑记录等价对。对该行的每一个像素,如果其值为255,检测左边像素是否为255,若是,则该点标记为左边像素点的标记;否则,该点的标记为前一个标记值加一;若该点的像素值为0,继续扫描下一个像素。

    (3)对除了第一行以外的像素行进行标记,此时会出现等价对的情况,需要进行记录。

       (3.1)首先对第一列进行处理,若该点像素值为0,则扫描该行下一个像素,否则,检测上、右上两个像素位置的像素值。若上被标记过,该点标记为上像素点的标记值。这时,再看右上是否被标记过,若也被标记过,比较上和右上的标记值是否相等,如果不相等,则记录上和右上为一个等价对,并将其记录在等价对记录表中。若上没有被标记,而右上被标记了,则该点标记为右上的标记值。如果上和右上都没有被标记,该点的标记值为上一个标记值加一。

       (3.2)对中间列进行处理,若该像素的像素值为255,则检测左、左上、上、右上位置的像素值。若上述四个位置的像素值都为0,则该点的标记值为上一个标记值加一。如果上述四个位置中只有一个的像素值为255,则该点就标记为那个像素点的标记值。如果其中有mm大于1,小于等于4)个像素点的像素值为255,则按照左、左上、上、右上的优先顺序来确定该点的标记值,然后对这m个像素位置的标记值进行等价对的分析,并进行相应的记录。

       (3.3)对最后一列进行处理,步骤同上。

    3.4)依次扫描,直到所有像素值都被扫描。

    4)对等价记录表中的所有等价对进行处理,得到最终的连通区域标记。

    展开全文
  • 图片连通区域检测 1.原图 2.连通区域结果 3.编码实现 #coding=utf-8 from skimage import measure, color import cv2 import numpy as np import matplotlib.pyplot as plt def detect(image): label_img, num ...

    图片连通区域检测(Label connected regions of an integer array)

    更多关注:

    1.原图

    在这里插入图片描述

    2.连通区域结果

    在这里插入图片描述

    3.编码实现

    #coding=utf-8
    from skimage import measure, color
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    def detect(image):
    
        label_img, num = measure.label(image, neighbors=8, background=0, return_num=True, connectivity=2)
        return label_img, num
    
    
    if __name__=='__main__':
    
        in_image_path  = 'binary.bmp'
        out_image_path = 'labeled.bmp'
    
        img = cv2.imread(in_image_path, 0)
        assert img is not None
        ret, thresh = cv2.threshold(img, 170, 255, cv2.THRESH_BINARY)
    
        label_img, num = detect(thresh)
    
        dst = color.label2rgb(label_img)
        # plt.imshow(dst)
    
        # print('for_debug: thresh.dtype={}, shape={}'.format(thresh.dtype, thresh.shape))
        # cv2.imshow('1', label_img.astype(np.uint8))
        cv2.imshow('1', dst)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
        # cv2.imwrite(out_image_path, label_img.astype(np.uint8))
    

    PS: (有一个比较关键的问题)保存用作显示效果的图片最好是采用bmp格式,而jpg格式会对图片进行灰度值的差值,查看时会出现很多小杂点。

    4.去除小连通区域

    函数格式:skimage.morphology.remove_small_objects(ar, min_size=64, connectivity=1, in_place=False)

    参数:
    ar: 待操作的bool型数组
    min_size: 最小连通区域尺寸,小于该尺寸的都将被删除。默认为64
    connectivity: 邻接模式,1表示4邻接,2表示8邻接
    in_place: bool型值,如果为True,表示直接在输入图像中删除小块区域,否则进行复制后再删除。默认为False
    返回删除了小块区域的二值图像。

    展开全文
  • ITK: 连通区域检测和分析

    千次阅读 2016-07-13 21:08:54
    最近做实验需要对二维图像进行连通区域分析,在翻阅资料后发现ITk提供了相应的功能。十分好用。在这里总结一下。  实现连通区域分析细分为两个步骤 1、寻找连通区域 2、连通区域分析。 ITK中使用下面的类寻找标记...

        最近做实验需要对二维图像进行连通区域分析,在翻阅资料后发现ITk提供了相应的功能。十分好用。在这里总结一下。

     实现连通区域分析细分为两个步骤 1、寻找连通区域   2、连通区域分析。

    ITK中使用下面的类寻找标记连通区域

    #include "itkConnectedComponentImageFilter.h"
    该类输出一个对各连通区域标记过的图像,称之为LabelImage.

    连通区域分析使用到的类:

    #include "itkLabelImageToShapeLabelMapFilter.h"

    看名字就大概知道意思这是一个映射:把LabelImage映射到ShapeLabelImage.它的输出类型为

    itk::LabelMap< ShapeLabelObjectType >

    ITK文档里找到一副图很好解释LabelMap:

    Collaboration graph

    ShapeLabelObject这个类很厉害,ITK中的描述

    A Label object to store the common attributes related to the shape of the object.

    提供了很多形状相关的属性描述,例如面积 周长 质心 等效圆半径等等。下面给出一个ITK WiKI提供的例子:

    连通区域分析

    由于ITK没有提供可视化功能,我们可以使用VTK将寻找到的连通区域画出来

    ShapeLabelObject提供了一个函数接口GetBoundingBox, 可以获取连通区域的包围盒。该函数的返回类型是

    InputImageType::RegionType region
    结合VTK中的vtkPolyData类画出一个包围盒

    主要代码如下:

    CreateBoundingBox(InputImageType::RegionType region)
    {
        InputImageType::IndexType start=region.GetIndex();
        InputImageType::SizeType size=region.GetSize();
    
        vtkSmartPointer<vtkPoints> points=
                vtkSmartPointer<vtkPoints>::New();
        points->InsertNextPoint(start[0],start[1],0.0);//points of left bottom
        points->InsertNextPoint(start[0]+size[0],start[1],0.0);//points of right bottom
        points->InsertNextPoint(start[0]+size[0],start[1]+size[1],0.0);//points of right up
        points->InsertNextPoint(start[0],start[1]+size[1],0.0);//points of left up
    
        vtkSmartPointer<vtkLine> Bottomline=
                vtkSmartPointer<vtkLine>::New();  //Bottom
        Bottomline->GetPointIds()->SetId(0,0);
        Bottomline->GetPointIds()->SetId(1,1);
    
        vtkSmartPointer<vtkLine> Rightline=
                vtkSmartPointer<vtkLine>::New();  //Right
        Rightline->GetPointIds()->SetId(0,1);
        Rightline->GetPointIds()->SetId(1,2);
    
        vtkSmartPointer<vtkLine> Upline=
                vtkSmartPointer<vtkLine>::New();  //Up
        Upline->GetPointIds()->SetId(0,2);
        Upline->GetPointIds()->SetId(1,3);
    
        vtkSmartPointer<vtkLine> Leftline=
                vtkSmartPointer<vtkLine>::New();  //Left
        Leftline->GetPointIds()->SetId(0,3);
        Leftline->GetPointIds()->SetId(1,0);
    
        vtkSmartPointer<vtkLine> Maindiagonal=
                vtkSmartPointer<vtkLine>::New();  //主对角线
        Maindiagonal->GetPointIds()->SetId(0,3);
        Maindiagonal->GetPointIds()->SetId(1,1);
    
        vtkSmartPointer<vtkLine> Deputydiagonal=
                vtkSmartPointer<vtkLine>::New();  //副对角线
        Deputydiagonal->GetPointIds()->SetId(0,2);
        Deputydiagonal->GetPointIds()->SetId(1,0);
    
        //draw bounding box
        vtkSmartPointer<vtkCellArray> Lines=
                vtkSmartPointer<vtkCellArray>::New();
        Lines->InsertNextCell(Bottomline);
        Lines->InsertNextCell(Rightline);
        Lines->InsertNextCell(Upline);
        Lines->InsertNextCell(Leftline);
        Lines->InsertNextCell(Maindiagonal);
        Lines->InsertNextCell(Deputydiagonal);
    
        polyData->SetPoints(points);
        polyData->SetLines(Lines);
    
        vtkSmartPointer<vtkPolyDataMapper> mapper=
                vtkSmartPointer<vtkPolyDataMapper>::New();
        mapper->SetInputData(polyData);
    
        actor->SetMapper(mapper);
        actor->PickableOff();
        actor->SetVisibility(false);
        actor->GetProperty()->SetColor(1.0,0.0,0.0);
        actor->GetProperty()->SetLineWidth(2);
    
    }

          结果:

                                 


    补充: 

        在获取连通区域的包围盒的时候,其返回类型为InputImageType::RegionType region  被称为图像区域类

        ITK文档中这样描述这个region:

     A region is defined by two classes: the itk::Indexand itk::Size classes. The origin of the region within the image is defined by theIndex. The extent, or size, of the region is defined by the Size. When an image is created manually, the user is responsible for defining the image size and the index at which the image grid starts. These two parameters make it possible to process selected regions.
    The
    Index is represented by a n-dimensional array where each component is an integer indicating—in topological image coordinates—the initial pixel of the image.

    The region size is represented by an array of the same dimension as the image (using theitk::Size class). The components of the array are unsigned integers indicating the extent in pixels of the image along every dimension.

     index:表示图像区域起始位置

     size:表示图像区域的大小

     但没有留意到他们的单位是什么。原文中说:Index——the initial pixel of the image  图像的初始像素。size——the extent in pixels of the image along every dimension 每个维度上像素个数的扩展。

     因为不考虑像素间隔(spacing)这样一来其反映的不是实际的物理尺寸size,而只是表示当前维度下像素的个数。

     在实际操作时发现,当spacing小于1的时候获得的包围盒位置都向左上角偏移。如图:

         

    spacing=0.3134108

    所以在实际计算包围盒的start和size参数时候要乘以一个spacing:

    InputImageType::IndexType start1=region.GetIndex();
        InputImageType::SizeType size1=region.GetSize();
      double start[2],size[2];
      for(int i=0;i<2;i++)
      {
          start[i]=start1[i]*spacing[i];
          size[i]=size1[i]*spacing[i];
      }

    补充 2016-12-5

       ShapeLabelObject这个类中有一个成员函数 GetPrincipalAxes();返回值类型是一个变换矩阵(Matrix<double,imageDimession,imagedimession>)。itk中有一个很粗略的解释大概意思是说:获得主轴到物理轴坐标的仿射变换。对仿射变换的概念了解不清。这里做一个小结:

      

    仿射变换

    仿射变换(Affine Transformation或 Affine Map),又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间的过程。它保持了二维图形的“平直性”(即:直线经过变换之后依然是直线)和“平行性”(即:二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。

    一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)的形式。

    那么, 我们能够用仿射变换来表示如下三种常见的变换形式:

    • 旋转,rotation (线性变换)
    • 平移,translation(向量加)
    • 缩放,scale(线性变换)

    如果进行更深层次的理解,仿射变换代表的是两幅图之间的一种映射关系。

    而我们通常使用2 x 3的矩阵来表示仿射变换。


     

     

    考虑到我们要使用矩阵 A 和 B 对二维向量 做变换, 所以也能表示为下列形式:


      或者     


     

    即:       


        回归正题,    对于一副二维图像,GetPrincipalAxes()返回值是Matrix<double,2,2>类型,是一个2*2的矩阵。也就是对应于前面的A矩阵。其只能表示旋转变换而不能表示平移变换。在实际使用过程本人用该函数再加上求质心点的函数(GetCentroid())来获取连通区域等效椭圆的长短轴的端点坐标。代码如下:

    /*!
     * \brief ConnectedRegion::GetShortAxesPoints
     *        获取等效椭圆长轴的两个端点坐标
     *        itk中短轴方向与连通区域坐标系(主轴坐标)的x轴平行
     * \param i 连通区域索引号
     * \param pt QPointF数组 保存了短轴的两个端点坐标
     */
    void ConnectedRegion::GetShortAxesPoints(const int i, QPointF pt[]) const
    {
        //主轴坐标系==》物理坐标系的变换矩阵
        const ShapeLabelObjectType::MatrixType matrix=GetPrincipalAxes(i);
        //短轴的一半长度
        const double halfLenngth=GetEquivalentEllipsoidDiameter(i)[0]/2.0;
        //连通区域质心
        const ShapeLabelObjectType::CentroidType center=GetCentroid(i);
    
        pt[0].setX(center[0]-halfLenngth*matrix[0][0]);
        pt[0].setY(center[1]-halfLenngth*matrix[0][1]);
        pt[1].setX(center[0]+halfLenngth*matrix[0][0]);
        pt[1].setY(center[1]+halfLenngth*matrix[0][1]);
    }


       



    展开全文
  • 轮廓追踪与连通区域检测

    千次阅读 2011-10-31 11:42:17
    在二值图像或灰度图像中检测并标记连通区域,统计连通区域的信息如面积、周长、重心、区域形状参数(形状因子、矩、直方图、其他)等。   步骤 轮廓追踪(追踪原理+链码)-->链码表转换为第一类或第二类线段表--...

    用途

    在二值图像或灰度图像中检测并标记连通区域,统计连通区域的信息如面积、周长、重心、区域形状参数(形状因子、矩、直方图、其他)等。

     

    步骤

    轮廓追踪(追踪原理+链码)-->链码表转换为第一类或第二类线段表-->检测并标记连通区域,统计连通区域的信息。

     

    原理

    参看资料《C与C++图像处理编程》第八章轮廓跟踪。

    展开全文
  • 连通区域轮廓检测

    2016-11-18 21:27:08
    // 用Canny算子检测边缘 Canny(src_gray, canny_output, thresh, thresh * 2, 3); // 寻找轮廓 findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); /// ...
  • 今天小编就为大家分享一篇python skimage 连通区域检测方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 检测图片连通区域,计算物体个数

    热门讨论 2009-03-22 12:23:22
    检测图片连通区域,计算物体个数,采用标签传递算法,matlab实现
  • matlab 连通区域 显示
  • 主要介绍了浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • ITK 连通区域分析

    2019-08-20 16:20:59
    讲解ITK关于连通区域检测和分析用到的函数: https://blog.csdn.net/cfqcfqcfqcfqcfq/article/details/51901330?locationNum=5 这个例子是ITK得到连通区域后,逐个进行分析的例子: ...
  • Matlab形态学图像处理:二值图像分割 标记连通区域和重心位置 删除连通区域 Matlab中可以使用graythresh(Img)函数设置二值化的阈值,再用im2bw转化为二值图像。在Matlab中,可以使用bwlabel()和bwlabeln()函数来...
  • 步骤如下: 1.图片灰化; 2.中值滤波 去噪 3.求图片的光影(自动光学检测) 4.除法去光影 5.阈值操作 6.实现了三种目标检测方法 主要分两种连通区域和findContours ...下面是连通区域的结果
  • 针对传统Hough变换进行圆检测,计算量过大、检测同心圆精度不高、自动化程度低等缺点,提出一种基于连通区域标记算法的圆检测算法。该算法首先通过连通区域标记算法对图像进行处理得到一个圆,解决了传统Hough变换...
  • opencv2.4.9+VS2010,使用帧间差分法或背景差分法检测出运动目标,对不同的连通区域做标记,并得出每个连通区域的直方图,通过直方图比较来跟踪特定目标,也可以用在车流量统计,参数可调,算法简单,耗时小,具有...
  • halcon边缘检测-取背景的连通区域

    千次阅读 2019-01-14 11:10:28
    去背景连通区域 填孔 * Determine the connected components of the background of given regions *  read_image (Image, 'fabrik') * Detect edges sobel_amp (Image, EdgeAmplitude, 'thin_s...
  • 此案例位于CXCORE中cvDrawContours函数介绍部分给出...接着使用cvFindContours找到轮廓,然后使用填充方式绘制轮廓线内部区域,由此得到的彩色区域便是联连通区域。其中,黑色是0值区域,彩色区域便是连通区域。...
  • 行业分类-物理装置-一种基于连通区域标记的细粒度图像拼接检测方法.zip
  • 检测到的边缘,这些边缘大多还不是连通区域.可以通过3*3的模板将一些相近的边缘连接起来.也可以用cvDilate进行处理一下.一些图象重要信息就体现出来了.这样可以再找连通区域. cvSmooth(lpImage,lpImage);cvCanny
  • opencv 连通区域标记

    热门讨论 2009-07-14 13:15:23
    c++连通区域标记算法2,功能和matlab 中的 bwlabel相似,用opencv 编写
  • python skimage 连通区域检测

    万次阅读 2017-12-08 17:31:22
    涉及到的函数为 import matplotlib.pyplot as plt from skimage ...labels = measure.label(img4[:,:, ...为整个灰度图像的坐标的类别标签,值为[0, max_label], 一个连通区域为一个 lable .
  • 首先使用背景减除法提取运动目标,然后使用基于连通区域的面积阀值精确地提取疑似区域和其轮廓,再依据早期火灾的视觉特征, 抽取四个特征量, 即:相邻帧红色比重平均增长率、面积变化率、形状的平均相似度和圆形度...
  • OpenCV_连通区域分析

    2021-02-09 13:54:13
    连通区域分析(Connected Component Analysis,Connected Component Labeling)是指将图像中的各个连通区域找出并标记。 连通区域分析是一种在图像分析处理的众多应用领域中较为基本的方法。例如:OCR识别中字符分割...
  • 基于opencv,通过对二值图片的两次扫描并对其标记,实现连通区域的着色
  • 二维ITK连通区域提取

    2021-01-07 16:18:38
    ITK连通区域提取说明主要函数介绍细节分析背景色编号顺序完整代码 说明 本文介绍2维ITK图像连通区域的提取,对如下图所示的二维图像,进行连通区域提取,并打上...该filter值检测连通区域,不编号,不排序。 itk::Label

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,240
精华内容 5,296
关键字:

联通区域检测