OpenCV学习笔记14 OpenCV图像处理模块ImgProc Module. Image Processing(七)

3.18 反向投影 - Back Projection


反向投影 是一种记录方式,记录了给定图像的像素在直方图模型中像素分布的匹配程度。
简单的讲,反向投影就是计算一个特征的直方图模型。然后可以使用该特征的直方图模型在一幅图像中找到该特征。
例如,如果你有一个皮肤颜色的直方图(色调 - 饱和度 直方图),然后你可以在一幅图像中找出其中的肤色区域。

  /// 读取图像
  src = imread( argv[1], 1 );
  /// 转换到 HSV 空间
  cvtColor( src, hsv, CV_BGR2HSV );
  Mat hue;
  /// 分离 色调(Hue) 通道
  hue.create( hsv.size(), hsv.depth() );
  int ch[] = { 0, 0 };
  mixChannels( &hsv, 1, &hue, 1, ch, 1 );
  Mat hist;
  int histSize = MAX( bins, 2 );
  float hue_range[] = { 0, 180 };
  const float* ranges = { hue_range };

  /// 计算直方图并归一化
  calcHist( &hue, 1, 0, Mat(), hist, 1, &histSize, &ranges, true, false );
  normalize( hist, hist, 0, 255, NORM_MINMAX, -1, Mat() );

  /// 计算反向投影
  Mat backproj;
  calcBackProject( &hue, 1, 0, hist, backproj, &ranges, 1, true );
mixChannels 函数用于抽取HSV图像的0通道(Hue)。
&hsv:一系列输入图像的数组,被拷贝的通道的来源。
1:输入数组中图像的数目。
&hue:一系列目标图像的数组,储存拷贝的通道。
ch[ ] = {0,0}:通道索引对的数组,指示如何将输入图像的哪一通道拷贝到目标图标图像的哪一通道,这里是把&hsv图像的0通道(Hue)拷贝到&hue图像(单通道)的0通道。
1:通道索引对的数目。 

calcBackProject 函数用于计算一张图像的反向投影。
&hue:输入图像的数组。
1:输入图像的数目。
0:计算反向投影的通道列表。
hist:输入的直方图。
backproj:输出的反向投影图像。
&ranges:直方图的bin界限。
1:输出反向投影的比例因子。
ture:直方图是否是均匀分布的(bin大小相同)。


3.19 模板匹配 - Template Matching


概念:模板匹配是一项在图像中寻找一块与模板图像匹配(相似)区域的技术。
进行模板匹配需要两幅图像:原图像和模板图像。将模板图像在原图像上滑动(从左往右,从上往下),一次移动一个像素。每移动一次都进行一次度量,从而得到一个匹配值,表示匹配程度。将匹配值存储在结果图像矩阵中,则该矩阵的每个位置(x,y)都包含了相应的匹配度量值。确定结果图像矩阵其中的最大值(或最小值)点,以该点为顶点,长宽和模板图像相同,在原图像中得到的图像区域就是匹配区域。
使用 matchTemplate 函数在模板块和输入图像之间寻找匹配,获得匹配结果图像。
使用 minMaxLoc 函数在给定的矩阵中寻找最大值和最小值(包括它们的位置)。
  /// 创建输出结果的矩阵,img是原图像,templ是模板图像
  int result_cols =  img.cols - templ.cols + 1;
  int result_rows = img.rows - templ.rows + 1;
  result.create( result_cols, result_rows, CV_32FC1 );

  /// 进行匹配和标准化
  matchTemplate( img, templ, result, match_method );
  normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );

  /// 通过函数 minMaxLoc 定位最匹配的位置
  double minVal; double maxVal; Point minLoc; Point maxLoc;
  Point matchLoc;

  minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );

  /// 对于方法 SQDIFF 和 SQDIFF_NORMED, 越小的数值代表更高的匹配结果. 而对于其他方法, 数值越大匹配越好
  if( match_method  == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED )
    { matchLoc = minLoc; }
  else
    { matchLoc = maxLoc; }
matchTemplate 函数参数说明:
img:原图像,必须是8位或32位浮点数据类型。
templ:模板图像,必须和原图像具有相同的数据类型并且比原图像小。
result:匹配结果矩阵,必定是单通道32位浮点数据类型。如果原图像大小是W×H,模板图像大小是w×h,则结果矩阵大小是(W-w+1)×(H-h+1)。
match_method:匹配方法,有6种参数:平方差匹配 - CV_TM_SQDIFF,标准平方差匹配 - CV_TM_SQDIFF_NORMED,相关匹配 - CV_TM_CCORR,标准相关匹配 - CV_TM_CCORR_NORMED,相关匹配 - CV_TM_CCOEFF,标准相关匹配 - CV_TM_CCOEFF_NORMED。

minMaxLoc 函数参数说明:
result:匹配结果矩阵。
&minVal:在result中存储的最小值。
&maxVal:在result中存储的最大值。
&minLoc:在result中最小值的坐标。
&maxLoc:在result中最大值的坐标。
Mat():可选的掩码矩阵。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值