平时你听到、见到的金字塔是什么样的?
这样?
还是这样?
实际上除了这些,还有图像金字塔
图像金字塔有什么用?为什么要称作图像金字塔?本文带你研究这些问题。
正如生物视觉系统会处理分层次的尺寸一样,计算机视觉系统实现多分辨率图像处理的基础是图像金字塔。
考虑这样一个场景:输入系统一幅图像来检测人脸。由于事先并不知道人脸在这张图片中可能的尺寸,所以需要根据输入生成一个不同大小图像组成的金字塔(应用时常用向量存储),扫描不同层次来检测可能的人脸。
此外,图像金字塔在保持细节的条件下进行图像融合等多尺度编辑操作非常有用。
图像金字塔分为两种:
前面已经提到,图像金字塔的作用主要有:
下面给出一个基于图像金字塔的图像融合算法。
上面的图可能有点抽象,看看下面的例子。
主函数非常简单易懂
int main()
{
Mat img_1 = imread("1.jpg", 1);
Mat img_2 = imread("2.jpg", 1);
Mat dstImg;
imgFusion(img_1, img_2, dstImg, 0.2);
waitKey(0);
return 0;
}
试试效果
融合效果图
是不是毫无违和感?其中关键的融合函数imgFusion()
具体是如何实现的呢?
void imgFusion(Mat leftImg, Mat rightImg, Mat& dstImg, float threshold)
{
vector<Mat> gaussPyrLeft, gaussPyrRight, laplacePyrLeft, laplacePyrRight; // 声明高斯金字塔数据结构
vector<Mat> maskGaussPyr; // 声明掩码的高斯金字塔
vector<Mat> blendLapPyr; // 声明融合拉普拉斯金字塔
Mat imgHighest; // 声明图像融合的起点图像
Mat mask = Mat::zeros(PYRHEIGHT, PYRWIDTH, CV_32FC1); // 构造掩码,大小与金字塔原图像相同
mask(Range::all(), Range(mask.cols * threshold, mask.cols)) = 1.0;
cvtColor(mask, mask, COLOR_GRAY2BGR); // 将掩码颜色通道拓展,以适配原图像
buildGaussPyr(mask, maskGaussPyr, 3); // 建立掩码的高斯金字塔
resize(leftImg, leftImg, Size(PYRWIDTH, PYRHEIGHT));
resize(rightImg, rightImg, Size(PYRWIDTH, PYRHEIGHT));
leftImg.convertTo(leftImg, CV_32F); //转换成CV_32F, 用于和mask类型匹配,且CV_32F 类型精度高, 有利于计算
rightImg.convertTo(rightImg, CV_32F);
// 建立高斯金字塔与拉普拉斯金字塔
buildGaussPyr(leftImg, gaussPyrLeft, 3);
buildGaussPyr(rightImg, gaussPyrRight, 3);
buildLaplacePyr(gaussPyrLeft, laplacePyrLeft, 3);
buildLaplacePyr(gaussPyrRight, laplacePyrRight, 3);
// 确定起点图像
imgHighest = gaussPyrLeft.back().mul(maskGaussPyr.back()) +
((gaussPyrRight.back()).mul(Scalar(1.0, 1.0, 1.0) - maskGaussPyr.back()));
// 融合拉普拉斯金字塔
blendLaplacePyr(laplacePyrLeft, laplacePyrRight, maskGaussPyr, blendLapPyr);
// 融合图像重建
dstImg = imgLaplaceBlend(imgHighest, blendLapPyr);
dstImg.convertTo(dstImg, CV_8UC3);
imshow("imgProcess::seamOpt_laplace", dstImg);
}
限于篇幅,其中部分函数的实现无法贴完整,全套代码工程文件关注下方公众号回复“CV003”获取,已经给你们打包好了哦~
计算机视觉基础教程说明
章号 内容
0 色彩空间与数字成像
1 计算机几何基础
2 图像增强、滤波、金字塔
3 图像特征提取
4 图像特征描述
5 图像特征匹配
6 立体视觉
7 项目实战
更多精彩专栏: