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():可选的掩码矩阵。