数字图像处理,相位相关图像配准算法的C++实现
参考论文中的文字:图像配准是图像处理的基本任务之一,用于将不同时间、不同传感器、不同视角及不同拍摄条件下获取的关于同一目标或场景的两幅或多幅图像进行主要是几何意义上的匹配套和的过程。在对图像配准的研究过程中,大量技术被应用于针对不同数据和问题的图像配准工作,产生了多种不同形式的图像配准技术。
图像配准的基本问题是找出一种图像转换方法,用以纠正图像的形变。造成图像形变的原因多种多样,例如对于遥感图像而言,传感器噪声、由传感器视点变化或平台不稳定造成的透视变化、被拍摄物体的移动、变形或生长等变化、闪电和大气变化,以及阴影和云层遮盖都使图像产生不同形式的形变。正是图像形变原因和形式的不同决定了多种多样的图像配准技术。
迄今已报道了多种图像配准方法,主要有互相关法、傅立叶变换法、点映射法口脚外和弹性模型法。其中傅立叶变换法基于傅立叶变换的相位匹配是利用傅立叶变换的性质而出现的一种图像配准方法。图像经过傅立叶变换,由空域变换到频率缘则两组数据在空何上的相关运算可以变为频谱的复数乘法运算,同时图像在变换域中还能获得在空域中很难获得的特征。
一,基于相位相关的图像配准方法
在时域中信号的平移运动可以通过在频域中相位的变化表现出来(这是傅里叶变换的特性)。同理,图像的旋转、平移和比例变化也能在傅里叶变换的频域中反映出来。而且使用频域方法的好处是计算简单,同时傅立叶变换可以采用方法提高执行的速度。因此,傅氏变换是图像配准中常用的方法之一。下面我们就具体分析当图像发生平移、旋转和缩放时,图像信号在频域中的表现。
1,原理阐述
通过求取互功率谱的傅立叶反变换,得到一个狄拉克函数(脉冲函数),再寻找函数峰值点对应的坐标,即可得到我们所要求得的配准点。实际上,在计算机处理中,连续域要用离散域代替,这使得狄拉克函数转化为离散时间单位冲击函数序列的形式。在实际运算中,两幅图像互功率谱相位的反变换,总是含有一个相关峰值代表两幅图像的配准点,和一些非相关峰值,相关峰值直接反映两幅图像间的一致程度。更精确的讲,相关峰的能量对应重叠区域的所占百分比,非相关峰对应非重叠区域所占百分比。由此我们可以看出,当两幅图像重叠区域较小时,采用本方法就不能检测出两幅图像的平移量。
2,配准情况
当图像间仅存在平移时,正确的配准图像如图a所示(中心平移化了),最大峰的位置就是两图像的相对平移量,反之若不存在单纯的平移,则会出现如b所示的情况(多脉冲林立)
3,算法流程
二,程序实现
1,核心函数的实现:
- void PhaseCorrelation2D(const BYTE *signal,//原信号
- const BYTE *pattern,//带配准信号
- int &height_offset,//高的偏移量
- int &width_offset)//宽的偏移量
- {
- fftw_complex *signal_img = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*nRow*nCol);
- fftw_complex *pattern_img = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*nRow*nCol);
- for (int i = 0; i < nRow*nCol; i++)
- {
- signal_img[i][0] = signal[i];
- signal_img[i][1] = 0;
- }
- for (int j = 0; j < nRow*nCol; j++)
- {
- pattern_img[j][0] = pattern[j];
- pattern_img[j][1] = 0;
- }
- // 对两幅图像傅里叶变换
- fftw_plan signal_forward_plan = fftw_plan_dft_2d(nRow, nCol, signal_img, signal_img,
- FFTW_FORWARD, FFTW_ESTIMATE);
- fftw_plan pattern_forward_plan = fftw_plan_dft_2d(nRow, nCol, pattern_img, pattern_img,
- FFTW_FORWARD, FFTW_ESTIMATE);
- fftw_execute(signal_forward_plan);
- fftw_execute(pattern_forward_plan);
- // 求互功率谱
- fftw_complex *cross_img = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*nRow*nCol);
- double temp;
- for (int i = 0; i < nRow*nCol; i++)
- {
- cross_img[i][0] = (signal_img[i][0] * pattern_img[i][0]) -
- (signal_img[i][1] * (-1.0*pattern_img[i][1]));
- cross_img[i][1] = (signal_img[i][0] * (-1.0*pattern_img[i][1])) +
- (signal_img[i][1] * pattern_img[i][0]);
- temp = sqrt(cross_img[i][0] * cross_img[i][0] + cross_img[i][1] * cross_img[i][1]) + 0.001;
- cross_img[i][0] /= temp;
- cross_img[i][1] /= temp;
- }
- //对互功率谱求反变换
- fftw_plan cross_backward_plan = fftw_plan_dft_2d(nRow, nCol, cross_img, cross_img,
- FFTW_BACKWARD, FFTW_ESTIMATE);
- fftw_execute(cross_backward_plan);
- // 释放内存
- fftw_destroy_plan(signal_forward_plan);
- fftw_destroy_plan(pattern_forward_plan);
- fftw_destroy_plan(cross_backward_plan);
- fftw_free(signal_img);
- fftw_free(pattern_img);
- double *cross_real=new double[nRow*nCol];
- for (int i = 0; i < nRow*nCol; i++)
- cross_real[i] = cross_img[i][0];
- int max_loc = 0;//准备存放最大值的位置坐标(注意,只有一个值)
- double max_vlaue = 0.0;
- for (int i = 0; i < nRow*nCol; i++)
- {
- if (max_vlaue<cross_real[i])
- {
- max_vlaue = cross_real[i];
- max_loc = i;
- }
- }
- height_offset = floor(((int)max_loc) / nCol);
- width_offset = (int)max_loc - nCol*height_offset;
- if (height_offset > 0.5*nRow)
- height_offset = height_offset - nRow;
- if (width_offset > 0.5*nCol)
- width_offset = width_offset - nCol;
- delete[] cross_real;
- cross_real = NULL;
- }
2,配准模拟结果:
3,实际的图像配准效果
注:下面这张图是单帧图像效果,有大量的椒盐噪声和散斑噪声
注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/47816245
原作者博客:http://blog.csdn.net/ebowtang
参考资源:
【1】西北工业大学,吕海霞,硕士论文,《自动图像配准技术研究》,2007.3
【2】MIT,FFTW库
【3】Joseph L. Horner and Peter D. Gianino. Phase-only matched ltering. Applied Optics, 23(6):812-816, 1984.
【4】复旦大学,宋智礼,博士论文,《图像配准技术及其应用的研究》,2010,4
【5】中国科学技术大学信号统计处理研究院,郑志彬,叶中付,《基于相位相关的图像配准算法》,2006,12
【6】(美)冈萨雷斯著; 阮秋琦译. 数字图像处理(MATLAB 版) [M]. 北京:电子工业出版社, 2005.
【7】(美)冈萨雷斯著; 阮秋琦等译. 数字图像处理(第二版) [M]. 北京:电子工业出版社, 2003.
数字图像处理,相位相关图像配准算法的C++实现相关推荐
- matlab相位相关图像配准,数字图像处理,相位相关图像配准
前言 图像配准是图像处理的基本任务之一,用于将不同时间.不同传感器.不同视角及不同拍摄条件下获取的关于同一目标或场景的两幅或多幅图像进行主要是几何意义上的匹配套和的过程.在对图像配准的研究过程中,大量 ...
- Win8Metro(C#)数字图像处理--2.32图像曝光算法
[函数名称] 图像曝光函数ExposureProcess(WriteableBitmap src,int exposureValue) [函数代码] /// <summary> // ...
- C# GDAL 数字图像处理Part7 仿射变换图像配准
大家注意,采点采的是Bitmap的像素坐标,不用转换到地理坐标!大家一定注意!舍友de了一天bug刚刚de出来快哭晕了~ ...
- globalmapper如何选取图像上的点_图像配准算法
[导读]图像配准与相关[1]是图像处理研究领域中的一个典型问题和技术难点,其目的在于比较或融合针对同一对象在不同条件下获取的图像,例如图像会来自不同的采集设备,取自不同的时间,不同的拍摄视角等等,有时 ...
- 有效的亚像素图像配准算法
比较了采用非线性优化和矩阵乘离散傅里叶变换的三种二维图像配准算法.这些算法的精度与传统的快速算法相当.傅里叶变换上采样方法在一小部分的计算时间和与大大减少内存要求.比较它们的精度和计算时间,以评估平移 ...
- Win8Metro(C#)数字图像处理--2.3图像反色
原文:Win8Metro(C#)数字图像处理--2.3图像反色 [函数名称] 图像反色函数ContraryProcess(WriteableBitmap src) [算法说明] 反色公式如下: ...
- Win8Metro(C#)数字图像处理--2.31灰度拉伸算法
Win8Metro(C#)数字图像处理--2.31灰度拉伸算法 原文:Win8Metro(C#)数字图像处理--2.31灰度拉伸算法 [函数名称] 灰度拉伸函数GrayStretchProces ...
- Win8Metro(C#)数字图像处理--2.7图像伪彩色
Win8Metro(C#)数字图像处理--2.7图像伪彩色 原文:Win8Metro(C#)数字图像处理--2.7图像伪彩色 2.7图像伪彩色函数 [函数名称] 图像伪彩色函数PseudoCol ...
- Apap图像配准算法
图像配准 图像配准是将两张场景相关的图像进行映射,寻找其中的关系,多用在医学图像配准.图像拼接.不同摄像机的几何标定等方面,其研究也较为成熟.OpenCv中的stitching类就是使用了2007年的 ...
- Win8 Metro(C#)数字图像处理--2.52图像K均值聚类
原文:Win8 Metro(C#)数字图像处理--2.52图像K均值聚类 [函数名称] 图像KMeans聚类 KMeansCluster(WriteableBitmap src,int ...
最新文章
- 你还不知道mysql中空值和null值的区别吗?
- php yield 导出文件,PHP yield 读取大文件
- ProtoBuf开发者指南
- STM32的时钟系统RCC详细整理(转)
- Centos7搭建Kubernetes集群
- MyBatis 实际使用案例-一级标签
- 【进阶3-5期】深度解析 new 原理及模拟实现
- linux用户类型分类,信息安全技术题库:SELinux安全上下文主要包括用户、角色、类型、层次和分类字段。( )...
- GBaseDataStudio管理工具
- 用java实现学生成绩管理系统(附有详细代码)
- QQ2010登录协议分析-目前可取得sessionkey
- java打印输出万年历_用Java编程输出万年历的功能实现
- Worthington胰蛋白酶解决方案
- halcon面阵相机标定矫正
- 鸿蒙系统和安卓有哪些区别?鸿蒙会取代安卓吗?
- 苹果5完美越狱_A12A13全新越狱工具发布,不需要电脑引导的半完美越狱
- 详解设计模式之策略模式
- KubeCon China 2021 阿里云专场来了!这些首日亮点不容错过
- (附源码)计算机毕业设计ssm服装销售商城系统
- 学生计算机测评安排,计算机系学生综合测评细则
热门文章
- 物联网毕业设计 单片机指纹识别考勤系统设计与实现
- hbuilder git 新建共享项目
- 普及ERP不靠低价风暴(转)
- 多元线性回归及虚拟变量(哑变量)设置
- nandflash驱动分析 针对K9GAG08U0D uboot1.1.6(上)
- hls协议视频(.m3u8)在浏览器播放
- 【渝粤题库】陕西师范大学163107饭店管理 作业【高起专】
- 刚刚!马云泪洒现场:青山不改,绿水长流,我要换个江湖了!后会有期!
- 腾讯云服务器搭建鸿蒙Hi3861开发板开发环境
- “大众摄影”“北外亚非学院”等网站被挂马