相位相关法图像配准

小结:本文主要介绍基于相位相关法的图像配准。

1. 相位相关法

        在时域中信号的平移运动可以通过在频域中相位的变化表现出来(这是傅里叶变换的特性,见下图)。平移不影响傅氏变换的幅值(谱),对应的幅值谱和原图像是一样的。旋转在傅氏变换中是小变量。根据傅氏变换的旋转特性,旋转一幅图,在频域相当于对这幅图的傅氏变换做相同的旋转。使用频域方法的好处是计算简单,速度快(可使用MIT的fftw库),同时傅立叶变换可以采用方法提高执行的速度。因此,傅氏变换是图像配准中常用的方法之一。下面我们就具体分析当图像发生平移、旋转和缩放时,图像信号在频域中的表现。

2. 相位相关法原理解析

        通过求取互功率谱的傅立叶反变换,得到一个狄拉克函数(脉冲函数),再寻找函数峰值点对应的坐标,即可得到我们所要求得的配准点。实际上,在计算机处理中,连续域要用离散域代替,这使得狄拉克函数转化为离散时间单位冲击函数序列的形式。在实际运算中,两幅图像互功率谱相位的反变换,总是含有一个相关峰值代表两幅图像的配准点,和一些非相关峰值,相关峰值直接反映两幅图像间的一致程度。更精确的讲,相关峰的能量对应重叠区域的所占百分比,非相关峰对应非重叠区域所占百分比。由此我们可以看出,当两幅图像重叠区域较小时,采用本方法就不能检测出两幅图像的平移量。

3. 合理的配准情况

        当图像间仅存在平移时,正确的配准图像如图a所示(中心平移化了),最大峰的位置就是两图像的相对平移量,反之若不存在单纯的平移,则会出现如b所示的情况(多脉冲林立)。

 4. 配准样例(拼接)

输入图像:(注意:输入图像的大小需一致)

srcImg1
srcImg2

  结果(错误):

OpneCV库函数实现 :
        X方向的偏移 : -1.23519, Y方向的偏移 : 56.5204

若进行裁剪后进行配准

裁剪后图像:

roiImg1
roiImg2

结果:

OpneCV库函数实现 :
        X方向的偏移 : -0.931136,        Y方向的偏移 : -12.9924

 配准后的图像:

        

	cv::Mat srcImg = cv::imread("D:\\Data\\ITKData\\BrainProtonDensitySlice.png", 0);

	cv::Mat srcImg1 = imread("D:\\Data\\ITKData\\1.png", 0);
	cv::Mat srcImg2 = imread("D:\\Data\\ITKData\\2.png", 0);

	int roiHeight = srcImg1.rows / 2.;
	int roiWidth = srcImg1.cols - 1;

	cv::Mat roiImg1 = srcImg1(cv::Rect(0, srcImg1.rows - roiHeight, roiWidth, roiHeight));
	std::cout << "roiImg1 " << roiImg1.rows << " , " << roiImg1.cols << std::endl;
	cv::imwrite("D:\\roiImg1.png", roiImg1);

	cv::Mat roiImg2 = srcImg2(cv::Rect(0, 0, roiWidth, roiHeight));
	std::cout << "roiImg2 " << roiImg2.rows << " , " << roiImg2.cols << std::endl;
	cv::imwrite("D:\\roiImg2.png", roiImg2);

	cv::Mat dst1, dst2;
	roiImg1.convertTo(dst1, CV_32FC1);
	roiImg2.convertTo(dst2, CV_32FC1);

	Point2d phase_shift;
	phase_shift = phaseCorrelate(dst1, dst2);
	cout << "OpneCV库函数实现 :" << endl << "\tX方向的偏移 : " << phase_shift.x << ",\tY方向的偏移 : " << phase_shift.y << endl;

	cv::Mat dstImg;
	cv::copyMakeBorder(roiImg1, dstImg, 0, roiImg2.rows, 0, roiImg2.cols, cv::BORDER_ISOLATED, cv::Scalar(0));
	cv::imshow("dstImg", dstImg);

	roiImg2.copyTo(dstImg(cv::Rect(1, 13, roiImg2.cols, roiImg2.rows)));
	cv::imwrite("D:\\dstImg2.png", dstImg);

	waitKey(0);

              
参考链接:https://blog.csdn.net/ebowtang/article/details/51287309

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪易

给我来点鼓励吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值