精华内容
下载资源
问答
  • http://woshicver.com/FifthSection/4_16_交互式前景提取使用GrabCut算法/ http://woshicver.com/FifthSection/4_15_图像分割与分水岭算法/

    http://woshicver.com/FifthSection/4_16_交互式前景提取使用GrabCut算法/
    http://woshicver.com/FifthSection/4_15_图像分割与分水岭算法/

    展开全文
  • Opencv 图像分割: 阈值化分割 区域分割 边缘分割 卷积 就是两个函数之间的相互关系,然后得出一个新的值,在连续空间做积分计算,然后在离散空间内求和的过程。 在计算机视觉里面,可以把卷积当做一个抽象的过程...

    Opencv 图像分割: 阈值化分割 区域分割 边缘分割

    卷积
    就是两个函数之间的相互关系,然后得出一个新的值,在连续空间做积分计算,然后在离散空间内求和的过程。
    在计算机视觉里面,可以把卷积当做一个抽象的过程,就是把小区域内的信息统计抽象出来

    图像阈值化分割
    按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,
    各个区域内部具有一致的属性,而相邻区域不具有这种一致属性。
    它是一种传统的最常用的图像分割方法,因计算简单、运算效率较高、速度快、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。
    它特别适用于目标和背景占据不同灰度级范围的图像,在极大的压缩数据量的同时也大大简化了分析和处理步骤,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。
    它有全局阈值、自适应阈值、最佳阈值等

    二值化cvThreshold

    /* Applies fixed-level threshold to grayscale image.
       This is a basic operation applied before retrieving contours */
    CVAPI(double)  cvThreshold( const CvArr*  src, CvArr*  dst,
                                double  threshold, double  max_value,
                                int threshold_type );

    src输入图像,须为单通道灰度图。
    dst输出的边缘图像,为单通道黑白图。
    threshold表示阈值
    max_value表示最大值。
    threshold_type表示二值化类型(即对图像取阈值的方法)

    /* Threshold types */
    enum
    {
        CV_THRESH_BINARY      =0,  /* value = value > threshold ? max_value : 0       */
        //if src(x,y)>threshold dst(x,y) = max_value, 
        //otherwise  dst(x,y) = 0,
    
        CV_THRESH_BINARY_INV  =1,  /* value = value > threshold ? 0 : max_value       */
        //if src(x,y)>threshold dst(x,y) = 0, 
        //otherwise  dst(x,y) = max_value,
    
        CV_THRESH_TRUNC       =2,  /* value = value > threshold ? threshold : value   */
        //if src(x,y)>threshold dst(x,y) = threshold, 
        //otherwise  dst(x,y) = src(x,y),
    
        CV_THRESH_TOZERO      =3,  /* value = value > threshold ? value : 0           */
         //if src(x,y)>threshold dst(x,y) = src(x,y), 
        //otherwise  dst(x,y) = 0,
    
        CV_THRESH_TOZERO_INV  =4,  /* value = value > threshold ? 0 : value           */
         //if src(x,y)>threshold dst(x,y) = 0, 
        //otherwise  dst(x,y) = src(x,y),
    
        CV_THRESH_MASK        =7,
        CV_THRESH_OTSU        =8  /* use Otsu algorithm to choose the optimal threshold value;
                                     combine the flag with one of the above CV_THRESH_* values */
        //threshold_type使用CV_THRESH_OTSU,则cvThreshold()将使用大律法OTSU得到的全局自适应阈值来进行二值化图像,而参数中的threshold不再起作用
    };
    如:cvThreshold(grayImg, binaryImg, 145, 255, CV_THRESH_BINARY); //二值图

    自适应二值化cvAdaptiveThreshold
    函数使用Otsu算法(大律法或最大类间方差法)来计算出一个全局阈值,然后根据这个阈值进行二值化
    Otsu实现思路
    1、计算0~255各灰阶对应的像素个数,保存至一个数组中,该数组下标是灰度值,保存内容是当前灰度值对应像素数
    2、计算背景图像的平均灰度、背景图像像素数所占比例
    3、计算前景图像的平均灰度、前景图像像素数所占比例
    4、遍历0~255各灰阶,计算并寻找类间方差极大值,此时对应的阈值就是大津法(OTSU算法)所求的阈值

    /* Applies adaptive threshold to grayscale image.
       The two parameters for methods CV_ADAPTIVE_THRESH_MEAN_C and
       CV_ADAPTIVE_THRESH_GAUSSIAN_C are:
       neighborhood size (3, 5, 7 etc.),
    */
    
    CVAPI(void)  cvAdaptiveThreshold( const CvArr* src, CvArr* dst, double max_value,
                                      int adaptive_method CV_DEFAULT(CV_ADAPTIVE_THRESH_MEAN_C),
                                      int threshold_type CV_DEFAULT(CV_THRESH_BINARY),
                                      int block_size CV_DEFAULT(3),
                                      double param1 CV_DEFAULT(5));

    src输入图像
    dst输出图像
    max_value表示最大值
    adaptive_method
    自适应阈值算法使用:CV_ADAPTIVE_THRESH_MEAN_C 或 CV_ADAPTIVE_THRESH_GAUSSIAN_C .
    threshold_type
    阈值类型:必须是CV_THRESH_BINARY或者CV_THRESH_BINARY_INV.
    block_size
    用来计算阈值的象素邻域大小: 3, 5, 7, …,block_size比较小的时候,相当于提取边缘
    param1
    与方法有关的参数,它是一个从均值或加权均值提取的常数,它可以是负数。
    对方法 CV_ADAPTIVE_THRESH_MEAN_C,先求出块中的均值,再减掉param1。
    对方法 CV_ADAPTIVE_THRESH_GAUSSIAN_C ,先求出块中的加权和(gaussian),再减掉param1。

    区域分割
    图像按照相似性准则分成不同的区域,主要包括区域增长,区域分裂合并和分水岭等几种类型

    边缘分割
    通过边缘检测,即检测灰度级或者结构具有突变的地方,表明一个区域的终结,也是另一个区域开始的地方。
    这种不连续性称为边缘。不同的图像灰度不同,边界处一般有明显的边缘,利用此特征可以分割图像

    图像中边缘处像素的灰度值不连续,这种不连续性可通过求导数来检测到。
    对于阶跃状边缘,其位置对应一阶导数的极值点,对应二阶导数的过零点(零交叉点)。
    因此常用微分算子进行边缘检测。常用的:
    一阶微分算子有Roberts算子、Prewitt算子和Sobel算子、LoG算子,
    二阶微分算子有Laplace算子和Kirsh算子、Canny算子等。
    在实际中各种微分算子常用小区域模板来表示,微分运算是利用模板和图像卷积来实现。这些算子对噪声敏感,只适合于噪声较小不太复杂的图像。

    由于边缘和噪声都是灰度不连续点,在频域均为高频分量,直接采用微分运算难以克服噪声的影响。因此用微分算子检测边缘前要对图像进行平滑滤波。LoG算子和Canny算子是具有平滑功能的二阶和一阶微分算子,边缘检测效果较好

    边缘检测算法:
    滤波:边缘检测算法主要是基于图像强度的一阶和二阶导数,但导数的计算对噪声很敏感,因此必须使用滤波器来改善与噪声有关的边缘检测器的性能.
    增强:将邻域(或局部)强度值有显著变化的点突显出来.边缘增强一般是通过计算梯度幅值来完成的.
    检测:确定边缘,最简单的边缘检测判据是梯度幅值阈值判据.
    定位:边缘的位置、方位可在子像素分辨率上估计出来.

    CV_EXPORTS_W void Canny( InputArray image, OutputArray edges,
                             double threshold1, double threshold2,
                             int apertureSize=3, bool L2gradient=false );

    1、高斯平滑滤波器卷积降噪,默然采用size = 5的高斯内核
    2、运用一对卷积阵列 (分别作用于x和y方向)求导,Sobel内核大小3 X 3,计算梯度幅值和方向
    3、根据阀值、梯度幅值得出边缘

    Canny边缘检测算法
    一个多级边缘检测算法,普遍认为是边缘检测的最优算法,Canny使用滞后阈值,滞后阈值需要两个阈值(高阈值和低阈值)
    Canny使用两种不同的阈值分别检测强边缘和弱边缘,并且仅当弱边缘和强边缘相连时,才将边缘包含在输出图像中。因此不容易被噪声“填充”,更容易检测出真正的弱边缘

    原灰度图像: image single-channel 8-bit input image.
    输出图像 (支持原地计算,可为输入图像): edges output edge map; it has the same size and type as image
    低阈值的: threshold1 first threshold for the hysteresis procedure.
    高阈值的3倍 (Canny 推荐的 高:低 阈值比在 2:1 到3:1之间): threshold2 second threshold for the hysteresis procedure.

    //! applies generalized Sobel operator to the image
    CV_EXPORTS_W void Sobel( InputArray src, OutputArray dst, int ddepth,
                             int dx, int dy, int ksize=3,
                             double scale=1, double delta=0,
                             int borderType=BORDER_DEFAULT );

    Sobel算子
    (对灰度渐变和噪声较多的图像处理效果较好。Sobel算子对于边缘定位比较准确)
    是一个离散微分算子 (discrete differentiation operator), 它用来计算图像灰度函数的近似梯度。
    通过像素点空间邻域内上下,左右相邻点的灰度加权运算,求取物体边缘(边缘是指一个物体与另一个物体的分界处,一般边缘内外处都会有灰度值上的差异)
    Sobel 算子结合了高斯平滑和微分求导, Scharr更准确地计算 3 X 3 核(Gx、Gy卷积因子)的导数
    X\Y两个方向求导(输入图像与卷积核Gx和Gy进行卷积)-> 图像的每一点,结合以上两个结果求出近似梯度 -> 定位梯度值大于邻域的相素,作为边缘
    ddepth: value as below
    CV_8U = 0,
    CV_8S = 1,
    CV_16U = 2,
    CV_16S = 3,
    CV_32S = 4,
    CV_32F = 5,
    CV_64F = 6,
    CV_USRTYPE1 = 7;

    展开全文
  • opencv阈值分割

    2020-04-29 23:04:19
    从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大。 它被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的...

    1 最大类间方差法(大津阈值法)

    大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出。从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大。

    它被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。它是按图像的灰度特性,将图像分成背景和前景两部分。因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。

    应用: 是求图像全局阈值的最佳方法,应用不言而喻,适用于大部分需要求图像全局阈值的场合。

    优点: 计算简单快速,不受图像亮度和对比度的影响。

    缺点: 对图像噪声敏感;只能针对单一目标分割;当目标和背景大小比例悬殊、类间方差函数可能呈现双峰或者多峰,这个时候效果不好。

    原理非常简单,涉及的知识点就是均值、方差等概念和一些公式推导。为了便于理解,我们从目的入手,反推一下这著名的OTSU算法。

    求类间方差:

    OTSU算法的假设是存在阈值TH将图像所有像素分为两类C1(小于TH)和C2(大于TH),则这两类像素各自的均值就为m1、m2,图像全局均值为mG。同时像素被分为C1和C2类的概率分别为p1、p2。因此就有:

    根据原文,式(4)还可以进一步变形:

    分割:

    这个分割就是二值化,OpenCV给了以下几种方式,很简单,可以参考:

    !

    2 自适应阈值

    前面介绍了OTSU算法,但这算法属于全局阈值法,所以对于某些光照不均的图像,这种全局阈值分割的方法会显得苍白无力,如下图:

    显然,这样的阈值处理结果不是我们想要的,那么就需要一种方法来应对这样的情况。

    这种办法就是自适应阈值法(adaptiveThreshold),它的思想不是计算全局图像的阈值,而是根据图像不同区域亮度分布,计算其局部阈值,所以对于图像不同区域,能够自适应计算不同的阈值,因此被称为自适应阈值法。(其实就是局部阈值法)

    如何确定局部阈值呢?可以计算某个邻域(局部)的均值、中值、高斯加权平均(高斯滤波)来确定阈值。值得说明的是:如果用局部的均值作为局部的阈值,就是常说的移动平均法。

    展开全文
  • Opencv背景分割

    2018-08-25 18:03:48
    Opencv提供了一个称为BackgroundSubtractor的类,在分割前景和背景时很方便。下面我们直接上代码,看一下它的使用方式。 这里提供Python和C++两种版本的code。 Python实现 1、导入包 import numpy as np impport...

    Opencv背景分割器

    转载请注明出处:https://blog.csdn.net/qq_41007606/article/details/82053828

    Opencv提供了一个称为BackgroundSubtractor的类,在分割前景和背景时很方便。下面我们直接上代码,看一下它的使用方式。
    这里提供Python和C++两种版本的code。
    Python实现
    1、导入包

    import numpy as np
    impport cv2

    2、打开视频或摄像头

    cap = cv2.Videocapture()

    3、创建背景分割器,这里支持KNN,MOG2,GMG三种,根据自己的需要选择

    mog = cv2.createBackgroundSubtractorMOG2()

    4、传入图像并检测

    while1(1)
        frame = cap.read()[1]
        mask = mog.apply(frame)
    
        cv2.imshow('frame',mask)
        cv2.waitKey(30)
    cap.release()
    cv2.destoryAllWindows()

    c++实现
    1、引入opencv头文件
    2、打开摄像设备或视频

    VideoCapture capture();

    3、创建背景分割器

    pBackgroundKnn = createBackgroundSubtractorMOG2();
    

    4、传入图像并检测

    Mat frame;
    Mat mask;
    
    capture>>frame;
    pBackgroundKnn->apply(frame, mask);
    imshow("frame",mask);
    waitKey(30);
    
    展开全文
  • 前言在OpenCV中的图像分割中GrabCut分割算法,该算法可以方便的分割前景图像,操作简单,而且分割的效果很好。在前我们刚用学了OpenCV中的鼠标回调函数,也是为了这章用Grab...
  • 这篇博客将介绍如何使用OpenCV和GrabCut算法执行前景分段和提取。Grabcut算法通过CV2.GRabcut实现,可以通过以下任一方法初始化: 1)前景边界框,屏蔽近似图像中对象的像素的位置 2)使用近似前景掩码; 然后迭代地...
  • 一、OpenCv Grabcut算法:前景提取与分割(Foreground segmentation and extraction) (一)算法工作原理 (二)opencv函数cv2.grabCut (三)实现opencv的带有边框的GrabCut初始化算法 (四)输出结果显示 ...
  • OpenCV 传统分割测试

    2019-01-09 15:25:00
    github官网源文件:https://github.com/opencv/opencv/tree/master/samples/python 最好是先克隆整个仓库下来,再测试里面的:floodfill.py、watershed.py、grabcut.py 基本原理: floodfill 输入: 选定点,...
  • OpenCV图像分割与提取

    2021-06-07 09:27:14
    图像分割与提取一.形态学操作(移除噪声)二.代码实现 一.形态学操作(移除噪声) 二.代码实现 一.形态学操作(移除噪声) 形态学一般指生物学中研究动物和植物结构的一个分支。用数学形态学(也称图像代数)表示以...
  • 任何灰度图像都可以看作是一个地形表面,其中高强度表示山峰,低强度表示山谷。当用不同颜色的水 (标签)填充每个孤立的山谷,随着水位的上升,来自不同山谷的水明显...Opencv中实现了一个基于标记的分水岭算法,可以指
  • 其中,segments是利用图像分割算法得到的轮廓序列,而pFrImg则是目标检测算法检测到的前景目标,这样就可以分割图像的结果来对目标检测的区域进行填充。另外,对于如何得到分割图像,也可以采用以下函数来实现: ...
  • Python之opencv 分水岭分割算法

    千次阅读 多人点赞 2017-07-17 17:16:53
    分水岭分割算法 分水岭分割算法的定义网上随便百度一下就可以知道了,我就说一下我的理解,有不对的希望大家也可以帮忙指正。 对于分水岭分割,我的理解是,一幅图像是由不同大小的灰度级像素值构成的,可以把不同...
  • opencv图像分割算法

    千次阅读 2019-11-15 18:56:05
    当我们应用距离变换时,这将有助于我们更轻松地区分前景对象: src [ np . all ( src == 255 , axis = 2 ) ] = 0 cv . imshow ( 'Black Background Image' , src ) 然后,我们将锐化图像以锐化前景...
  • 基于OpenCV 图像分割

    千次阅读 2016-05-19 11:26:40
    一、概述  从图像中将目标或部分目标分割出来,是... 背景减除是在背景模型建立后,将背景模型和当前的图像进行比较,然后减去这些已知的背景信息,则剩下的目标物大致就是所求的前景目标。背景减除法的缺点是假设所
  • opencv图像分割之Grabcut

    2020-02-06 14:25:41
    定义一个单通道的输出掩码,0为背景,1为前景,2为可能的背景,3为可能的前景; grabCut抠图;将输出结果与可能的前景作比较得到可能的前景; 定义三通道的结果图像; 从原图中拷贝可能的前景到结果图像; 相关api...
  • 这里使用一个有关如何使用距离变换和分水岭来分割相互接触的对象的例子来说明分水岭算法的用法。 使用Otsu二值化寻找目标的近似估计 代码示例: from matplotlib import pyplot as plt import numpy as np import ...
  • (三)OpenCV图像分割python版

    千次阅读 2019-01-07 19:03:29
    0 小序 1 基于阈值 1.0 灰度阈值化,简单,速度快,...边缘检测的结果是点,不能作为图像分割结果,需要进一步处理,将边缘点沿着图形边界连接,形成边缘链. 检测算子: Sobel,Laplace, Canny 寻找轮廓: findContou...
  • 文章目录一、backgroundSubtractor类1、backgroundSubtractor的继承图2...该类仅用于为整个背景/前景分割算法系列定义通用接口。 1、backgroundSubtractor的继承图 2、成员函数 1. apply 说明 计算前景蒙版。 ...
  • import cv2 import numpy as np img= cv2.imread('15_13_57_06.jpg') grey=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) retVal,greyimg=cv2.threshold(grey,150,255,cv2.THRESH_BINARY) greyimg=cv2.GaussianBlur...
  • python opencv 图片前景与背景的分割

    万次阅读 2018-09-05 10:57:26
    python opencv 图片前景与背景的分割 kmeans 算法的研究 函数的格式为:kmeans(data, K, bestLabels, criteria, attempts, flags) (1)data: 分类数据,最好是np.float32的数据,每个特征放一列。之所以是...
  • 接受输入图像与任一(1)的边界框,我们想段或(2)所涉及的图像中指定的对象的位置掩模即近似分割 反复执行以下步骤: 步骤1:通过高斯混合模型(GMM)估算前景和背景的颜色分布 步骤#2:在像素标签上构造一个...
  • OpenCV阈值分割_二值化

    2020-04-29 23:33:38
    该部分的学习内容是对经典的阈值分割算法进行回顾,图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景...
  • 在图像处理的过程中, 经常需要从图像中将前景对象作为目标图像提取出来。例如无人驾驶技术, 我们关心的是周围的交通工具, 其他障碍物等, 而对于背景本身并不关注, 故而, 我们需要将这些东西从图片(视频)中提取出来, ...
  • grabCut图像中对象交互抠图 setMouseCallback onMouse(int event, int x, int y, int flags, void*param) 输入图像、矩形输入、初始分类、GMM描述 GMM训练分类、Graph Cut分类...opencv2/opencv.hpp> #include &...
  • opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/opencv.hpp> #include <iostream> #define WATERSHS using namespace std; using namespace cv; class ...
  • kkk,kkkk = threshTwoPeaks(img) print(kkk) cv.imshow('66',kkkk) cv.waitKey(0) 结果如下: 原图: 自适应阈值分割后的二值图: 可见,直方图阈值分割计数法能够较为有效的将背景何前景区分开来,比较完整的分割出...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,984
精华内容 1,593
关键字:

opencv前景分割