图像拼接和图像融合技术(基于Opencv)

图像拼接和图像融合技术(基于Opencv)
图像拼接在实际的应⽤场景很⼴,⽐如⽆⼈机航拍,遥感图像等等,图像拼接是进⼀步做图像理解基础步骤,拼接效果的好坏直接影响接下来的⼯作,所以⼀个好的图像拼接算法⾮常重要。内外网切换器
再举⼀个⾝边的例⼦吧,你⽤你的⼿机对某⼀场景拍照,但是你没有办法⼀次将所有你要拍的景物全部拍下来,所以你对该场景从左往右依次拍了好⼏张图,来把你要拍的所有景物记录下来。那么我们能不能把这些图像拼接成⼀个⼤图呢?我们利⽤opencv就可以做到图像拼接的效果!
⽐如我们有对这两张图进⾏拼接:
从上⾯两张图可以看出,这两张图有⽐较多的重叠部分,这也是拼接的基本要求。
那么要实现图像拼接需要那⼏步呢?简单来说有以下⼏步:
1. 对每幅图进⾏特征点提取
2. 对对特征点进⾏匹配
3. 进⾏图像配准
4. 把图像拷贝到另⼀幅图像的特定位置
5. 对重叠边界进⾏特殊处理
好吧,那就开始正式实现图像配准。
第⼀步就是特征点提取。现在CV领域有很多特征点的定义,⽐如sift、surf、harris⾓点、ORB都是很有名的特征因⼦,都可以⽤来做图像拼接的⼯作,他们各有优势。本⽂将使⽤ORB和SURF进⾏图像拼接,⽤其他⽅法进⾏拼接也是类似的。
基于SURF的图像拼接
⽤SIFT算法来实现图像拼接是很常⽤的⽅法,但是因为SIFT计算量很⼤,所以在速度要求很⾼的场合下不再适⽤。所以,它的改进⽅法SURF因为在速度⽅⾯有了明显的提⾼(速度是SIFT的3倍),所以在图像拼接领域还是⼤有作为。虽说SURF精确度和稳定性不及SIFT,但是其综合能⼒还是优越⼀些。下⾯将详细介绍拼接的主要步骤。
1.特征点提取和匹配
特征点提取和匹配的⽅法我在另⼀篇博客⽂章中做了详细的介绍,在这⾥直接使⽤上⽂所总结的SURF特征提取和特征匹配的⽅法。
//提取特征点
SurfFeatureDetector Detector(2000);
vector<KeyPoint> keyPoint1, keyPoint2;
Detector.detect(image1, keyPoint1);
Detector.detect(image2, keyPoint2);HDPE多孔加筋缠绕波纹管
//特征点描述,为下边的特征点匹配做准备
SurfDescriptorExtractor Descriptor;
Mat imageDesc1, imageDesc2;
Descriptorpute(image1, keyPoint1, imageDesc1);
Descriptorpute(image2, keyPoint2, imageDesc2);
三体船
FlannBasedMatcher matcher;
vector<vector<DMatch> > matchePoints;
vector<DMatch> GoodMatchePoints;
vector<Mat> train_desc(1, imageDesc1);
matcher.add(train_desc);
matcher.knnMatch(imageDesc2, matchePoints, 2);
cout << "total match points: " << matchePoints.size() << endl;
// Lowe's algorithm,获取优秀匹配点
for (int i = 0; i < matchePoints.size(); i++)
{
if (matchePoints[i][0].distance < 0.4 * matchePoints[i][1].distance)
tomgro{
GoodMatchePoints.push_back(matchePoints[i][0]);
}
}
360历史
Mat first_match;
drawMatches(image02, keyPoint2, image01, keyPoint1, GoodMatchePoints, first_match);
imshow("first_match ", first_match);
2.图像配准
这样⼦我们就可以得到了两幅待拼接图的匹配点集,接下来我们进⾏图像的配准,即将两张图像转换为同⼀坐标下,这⾥我们需要使⽤findHomography函数来求得变换矩阵。但是需要注意的是,findHomography函数所要⽤到的点集是Point2f类型的,所有我们需要对我们刚得到的点集GoodMatchePoints再做⼀次处理,使其转换为Point2f类型的点集。
vector<Point2f> imagePoints1, imagePoints2;
for (int i = 0; i<GoodMatchePoints.size(); i++)
{
imagePoints2.push_back(keyPoint2[GoodMatchePoints[i].queryIdx].pt);
imagePoints1.push_back(keyPoint1[GoodMatchePoints[i].trainIdx].pt);
}
这样⼦,我们就可以拿着imagePoints1, imagePoints2去求变换矩阵了,并且实现图像配准。值得注意的是findHomography函数的参数中我们选泽了CV_RANSAC,这表明我们选择RANSAC算法继续筛选可靠地匹配点,这使得匹配点解更为精确。物联网电池
//获取图像1到图像2的投影映射矩阵尺⼨为3*3
Mat homo = findHomography(imagePoints1, imagePoints2, CV_RANSAC);
也可以使⽤getPerspectiveTransform⽅法获得透视变换矩阵,不过要求只能有4个点,效果稍差
//Mat  homo=getPerspectiveTransform(imagePoints1,imagePoints2);
cout << "变换矩阵为:\n" << homo << endl << endl; //输出映射矩阵
//图像配准
Mat imageTransform1, imageTransform2;
warpPerspective(image01, imageTransform1, homo, Size(MAX(corners.right_top.x, corners.right_bottom.x), ws));
/
/warpPerspective(image01, imageTransform2, adjustMat*homo, ls*1.3, ws*1.8));
imshow("直接经过透视矩阵变换", imageTransform1);
imwrite("trans1.jpg", imageTransform1);
3. 图像拷贝
拷贝的思路很简单,就是将左图直接拷贝到配准图上就可以了。
//创建拼接后的图,需提前计算图的⼤⼩
int dst_width = ls;  //取最右点的长度为拼接图的长度
int dst_height = ws;
Mat dst(dst_height, dst_width, CV_8UC3);
dst.setTo(0);
imshow("b_dst", dst);
4.图像融合(去裂缝处理)
从上图可以看出,两图的拼接并不⾃然,原因就在于拼接图的交界处,两图因为光照⾊泽的原因使得两图交界处的过渡很糟糕,所以需要特定的处理解决这种不⾃然。这⾥的处理思路是加权融合,在重叠部分由前⼀幅图像慢慢过渡到第⼆幅图像,即将图像的重叠区域的像素值按⼀定的权值相加合成新的图像。
//优化两图的连接处,使得拼接⾃然
void OptimizeSeam(Mat& img1, Mat& trans, Mat& dst)
{
int start = MIN(corners.left_top.x, corners.left_bottom.x);//开始位置,即重叠区域的左边界
double processWidth = ls - start;//重叠区域的宽度
int rows = ws;
int cols = ls; //注意,是列数*通道数
double alpha = 1;//img1中像素的权重
for (int i = 0; i < rows; i++)
{
uchar* p = img1.ptr<uchar>(i);  //获取第i⾏的⾸地址
uchar* t = trans.ptr<uchar>(i);
uchar* d = dst.ptr<uchar>(i);
for (int j = start; j < cols; j++)
{
//如果遇到图像trans中⽆像素的⿊点,则完全拷贝img1中的数据
if (t[j * 3] == 0 && t[j * 3 + 1] == 0 && t[j * 3 + 2] == 0)
{
alpha = 1;
}
else
{
//img1中像素的权重,与当前处理点距重叠区域左边界的距离成正⽐,实验证明,这种⽅法确实好
alpha = (processWidth - (j - start)) / processWidth;
}
d[j * 3] = p[j * 3] * alpha + t[j * 3] * (1 - alpha);
d[j * 3 + 1] = p[j * 3 + 1] * alpha + t[j * 3 + 1] * (1 - alpha);
d[j * 3 + 2] = p[j * 3 + 2] * alpha + t[j * 3 + 2] * (1 - alpha);
}
}
}
多尝试⼏张,验证拼接效果:
测试⼀:

本文发布于:2024-09-22 04:00:11,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/228148.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:图像   拼接   矩阵   匹配   重叠   特征
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议