opencv的图像分割与融合技术

opencv的图像分割与融合技术,第1张

  图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。

  图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域不具有这种一致属性。这样的划分可以通过从灰度级出发选取一个或多个阈值来实现。

  基本原理

  基本原理是:通过设定不同的特征阈值,把图像象素点分为若干类。

  常用的特征包括:直接来自原始图像的灰度或彩色特征;由原始灰度或彩色值变换得到的特征。

  设原始图像为f(x,y),按照一定的准则f(x,y)中找到特征值T,将图像分割为两个部分,分割后的图像为:

  若取:b0=0(黑),b1=1(白),即为我们通常所说的图像二值化。

  图像分割的意义:

  在一幅图像中,人们常常只对其中的部分目标感兴趣,这些目标通常占据一定的区域,并且在某些特性(如灰度、轮廓、颜色和纹理等)上和临近的图像有差别。这些特性差别可能非常明显,也可能很细微,以至肉眼察觉不出来。随着计算机图像处理技术的发展,使得人们可以通过计算机来获取和处理图像信息。图像识别的基础是图像分割,其作用是把反映物体真实情况的、占据不同区域的、具有不同特性的目标区分开来,并形成数字特征。图像分割是图像识别和图像理解的基本前提步骤,图像分割质量的好坏直接影响后续图像处理的效果,甚至决定其成败,因此,图像分割的作用是至关重要的。

  函数原型

  1、opencv官方介绍:opencv官方grabcut介绍

  2、网上童鞋翻译解释:学习OpenCV——学习grabcut算法

  3、大致内容如下:

  函数原型:

  void grabCut(InputArray img, InputOutputArray mask, Rect rect,

  InputOutputArray bgdModel, InputOutputArray fgdModel,

  int iterCount, int mode=GC_EVAL )

  img:待分割的源图像,必须是8位3通道(CV_8UC3)图像,在处理的过程中不会被修改;

  mask:掩码图像,大小和原图像一致。可以有如下几种取值:

  GC_BGD(=0),背景;

  GC_FGD(=1),前景;

  GC_PR_BGD(=2),可能的背景;

  GC_PR_FGD(=3),可能的前景。

  rect:用于限定需要进行分割的图像范围,只有该矩形窗口内的图像部分才被处理;

  bgdModel:背景模型,如果为null,函数内部会自动创建一个bgdModel;

  fgdModel:前景模型,如果为null,函数内部会自动创建一个fgdModel;

  iterCount:迭代次数,必须大于0;

  mode:用于指示grabCut函数进行什么 *** 作。可以有如下几种选择:

  GC_INIT_WITH_RECT(=0),用矩形窗初始化GrabCut;

  GC_INIT_WITH_MASK(=1),用掩码图像初始化GrabCut;

  GC_EVAL(=2),执行分割。

  基本原理:

  首先用户在图片上画一个方框,grabCut默认方框内部为前景,设置掩码为2,方框外部都是背景,设置掩码为0。然后根据算法,

  将方框内部检查出来是背景的位置,掩码由2改为0。最后,经过算法处理,方框中掩码依然为2的,就是检查出来的前景,其他为背景。

  实例讲解1

  这些例子都主要是根据opencv自带的例子:opencvsamplescppgrabcut.cpp 简化修改而来。

  源代码

  代码如下:

  #include “opencv2/highgui/highgui.hpp”

  #include “opencv2/imgproc/imgproc.hpp”

  #include 《iostream》

  using namespace std;

  using namespace cv;

  string filename;

  Mat image;

  string winName = “show”;

  Rect rect;

  Mat mask;

  const Scalar GREEN = Scalar(0,255,0);

  Mat bgdModel, fgdModel;

  void setRecTInMask(){

  rect.x = 110;

  rect.y = 220;

  rect.width = 100;

  rect.height = 100;

  }

  staTIc void getBinMask( const Mat& comMask, Mat& binMask ){

  binMask.create( comMask.size(), CV_8UC1 );

  binMask = comMask & 1;

  }

  int main(int argc, char* argv[]){

  Mat binMask, res;

  filename = argv[1];

  image = imread( filename, 1 );

  mask.create(image.size(), CV_8UC1);

  mask.setTo(GC_BGD);

  setRecTInMask();

  (mask(rect)).setTo(Scalar(GC_PR_FGD));

  rectangle(image, Point(rect.x, rect.y), Point(rect.x + rect.width, rect.y + rect.height ), GREEN, 2);

  imshow(winName, image);

  image = imread( filename, 1 );

  grabCut(image, mask, rect, bgdModel, fgdModel, 1, GC_INIT_WITH_RECT);

  getBinMask(mask, binMask);

  image.copyTo(res, binMask);

  imshow(“result”, res);

  waitKey(0);

  return 0;

  }.

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2717702.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存