前言

图像配准是图像处理的基本任务之一,用于将不同时间、不同传感器、不同视角及不同拍摄条件下获取的关于同一目标或场景的两幅或多幅图像进行主要是几何意义上的匹配套和的过程。在对图像配准的研究过程中,大量技术被应用于针对不同数据和问题的图像配准工作,产生了多种不同形式的图像配准技术。

图像配准的基本问题是找出一种图像转换方法,用以纠正图像的形变。造成图像形变的原因多种多样,例如对于遥感图像而言,传感器噪声、由传感器视点变化或平台不稳定造成的透视变化、被拍摄物体的移动、变形或生长等变化、闪电和大气变化,以及阴影和云层遮盖都使图像产生不同形式的形变。正是图像形变原因和形式的不同决定了多种多样的图像配准技术。

目前对两幅图像间是否“配准”尚没有一个明确的标准,这使得对于图像配准技术的分类和比较评判很困难。在当前图像配准技术的研究中,通常每一种配准技术都是针对某一具体应用而设计的,没有哪一种技术是广泛适用于各种图像配准问题的,同时对某特定问题也没有哪一个技术是必须和唯一的。图像配准问题概括来说都是以在变换空间中寻找一种特定的最优的变换,达到使两幅图像在某种意义上匹配为目的,但对于不同图像和不同应用,则要具体问题具体分析。

迄今已报道了多种图像配准方法,主要有互相关法、傅立叶变换法、点映射法口脚外和弹性模型法。

其中傅立叶变换法基于傅立叶变换的相位匹配是利用傅立叶变换的性质而出现的一种图像配准方法。图像经过傅立叶变换,由空域变换到频率缘则两组数据在空何上的相关运算可以变为频谱的复数乘法运算,同时图像在变换域中还能获得在空域中很难获得的特征。

一,基于相位相关的图像配准方法

在时域中信号的平移运动可以通过在频域中相位的变化表现出来。同理,图像的旋转、平移和比例变化也能在傅里叶变换的频域中反映出来。而且使用频域方法的好处是计算简单,同时傅立叶变换可以采用方法提高执行的速度。因此,傅氏变换是图像配准中常用的方法之一。下面我们就具体分析当图像发生平移、旋转和缩放时,图像信号在频域中的

表现。

1,平移量的估计

假设图像八相对于人存在,办的平移,即

对其进行傅立叶变换,反映到频域上具有如下形式:

从上式中我们可以看出,两幅具有平移量的图像变换到频域中有相同的幅值。但有一个相位差,而这个相位差与图像间的平移量(dx,dy),有直接的关系。我们

将式一等式左边除以等式右边得到式三:

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

参考代码:

#include "string"

#include "vector"

#include "math.h"

#include

#include "fftw3.h"

#define height 8

#define width 16

#define TinyNum 0.0001

void PhaseCorrelation2D(const double *signal,//原信号

const double *pattern,//带配准信号

int &height_offset,//高的偏移量

int &width_offset);//宽的偏移量

using namespace std;

int main()

{

system("color 0A");

double src[height][width] = { 0 }, sftSrc[height][width] = { 0 };

//原信号,并初始化

cout << "原始图像信号:" << endl;

double step = 0.0;

for (int i = 0; i < height; i++)

{

for (int j = 0; j < width; j++)

{

src[i][j] = step++;

cout << src[i][j]<

}

cout << endl;

}

//预定偏移量

int hoffset = -2;//举例:hoffset = 1,意思即是,图像每一行往下(循环)移动1

int woffset = 3;//举例:woffset = 1,意思即是,图像每一列往右(循环)移动1

cout << "请输入指定偏移量:" << endl;

cin >> hoffset >> woffset;

//偏移信号,按照偏移量移动

cout << "/**************************偏移的图像信号:****************************/" << endl;

int x_index, y_index;

for (int i = 0; i < height; i++)

{

for (int j = 0; j < width; j++)

{

if (i - hoffset < 0)

x_index = i - hoffset + height;

else if (i - hoffset >= height)

x_index = i - hoffset - height;

else

x_index = i - hoffset;

if (j - woffset < 0)

y_index = j - woffset + width;

else if (j - woffset >= width)

y_index = j - woffset - width;

else

y_index = j - woffset;

sftSrc[i][j] = src[x_index][y_index];

}

}

//输出被位移的图像

for (int i = 0; i < height; i++)

{

for (int j = 0; j < width; j++)

cout << sftSrc[i][j] << " ";

cout << endl;

}

//准备配准,转换成一维信号(行优先存储)

double signal[ height * width ] = { 0.0 };

for (int i = 0; i < height; i++)

{

for (int j = 0; j < width; j++)

signal[i * width + j] = src[i][j];//一行一行的放在signal这个一位数组中

}

double sftsignal[height * width] = { 0.0 };

for (int i = 0; i < height; i++)

{

for (int j = 0; j < width; j++)

sftsignal[i * width + j] = sftSrc[i][j];//一行一行的放在sftsignal这个一位数组中

}

//进行配准,获取偏移量

int height_offset = 0;

int width_offset = 0;

PhaseCorrelation2D(signal, sftsignal, height_offset, width_offset);//宽的偏移量

if (height_offset == (-1 * hoffset) && width_offset == (-1 * woffset))

{

cout << "/************************************************/" << endl;

cout << "正确!!!符合预先设定!您应该重新按照以下参数移动图像: " << endl;

cout << "高度上的偏移量应为:" << height_offset << endl;

cout << "宽度上的偏移量应为:" << width_offset << endl;

cout << "/************************************************/" << endl;

}

else

{

cout << "/************************************************/" << endl;

cout << "很遗憾,偏移量参数有误!!!" << endl;

cout << "/************************************************/" << endl;

system("pause");

}

double tempsft[height][width];

for (int i = 0; i < height;i++)

{

for (int j = 0; j < width;j++)

{

tempsft[i][j] = sftSrc[i][j];

}

}

//根据偏移量进行校准

for (int i = 0; i < height; i++)

{

for (int j = 0; j < width; j++)

{

if (i - height_offset < 0)

x_index = i - height_offset + height;

else if (i - height_offset >= height)

x_index = i - height_offset - height;

else

x_index = i - height_offset;

if (j - width_offset < 0)

y_index = j - width_offset + width;

else if (j - width_offset >= width)

y_index = j - width_offset - width;

else

y_index = j - width_offset;

sftSrc[i][j] = tempsft[x_index][y_index];

}

}

//输出配准后的图像

cout << "/********************************输出配准后的图像************************/" << endl;

for (int i = 0; i < height; i++)

{

for (int j = 0; j < width; j++)

cout << sftSrc[i][j] << " ";

cout << endl;

}

bool flag = true;

for (int i = 0; i < height;i++)

{

for (int j = 0; j < width;j++)

{

if (sftSrc[i][j] != src[i][j])

{

flag = false;

break;

}

}

if (flag==false)

break;

}

if (flag == true)

{

cout << "/************************************************/" << endl;

cout << "恭喜你,配准已完成,偏移的图像信号已经与原图完全一致!" << endl;

cout << "/************************************************/" << endl;

}

else

{

cout << "/************************************************/" << endl;

cout << "很遗憾,配准未成功!" << endl;

cout << "/************************************************/" << endl;

system("pause");

}

/*

cout << "其他测试,傅里叶变换测试,查看是否与matlab一致" << endl;

//对原信号进行二维傅里叶变换,看是否与matlab一致

fftw_complex *signal_img = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)* height * width);

for (int i = 0; i < height; i++)

{

for (int j = 0; j < width; j++)

{

signal_img[i * width + j][0] = src[i][j];//一行一行的放在signal_img这个一位数组中

signal_img[i * width + j][1] = 0;

}

}

//

fftw_plan signal_forward_plan = fftw_plan_dft_2d(height, width, signal_img, signal_img,

FFTW_FORWARD, FFTW_ESTIMATE);

fftw_execute(signal_forward_plan);

*/

//cout << "/***************************原信号做傅里叶变换的结果:***************************/" << endl;

/*for (int i = 0; i < height*width; i++)

{

if (signal_img[i][1]>0)

cout << signal_img[i][0] << "+" << signal_img[i][1] << "i ";

else

cout << signal_img[i][0] << signal_img[i][1] << "i ";

if ((i + 1) % width == 0)

cout << endl;

}

*/

system("pause");

return 0;

}

void PhaseCorrelation2D( const double *signal,//原信号

const double *pattern,//带配准信号

int &height_offset,//高的偏移量

int &width_offset)//宽的偏移量

{

//未公布......

}

参考资源:

【1】西北工业大学,吕海霞,《自动图像配准技术研究》,2007.3

【2】MIT,FFTW库

matlab相位相关图像配准,数字图像处理,相位相关图像配准相关推荐

  1. 数字图像几何变化matlab,【新书推荐】数字图像处理——使用MATLAB分析与实现

    原标题:[新书推荐]数字图像处理--使用MATLAB分析与实现 数字图像处理是现代信息处理的研究热点.教材基于大学教学特点.目的编写,介绍数字图像处理的基本原理.算法分析和实现.章节内容由浅入深,层次 ...

  2. 基matlab的水果识别的应用,基于MATLAB的水果识别的数字图像处理

    基于MATLAB的水果识别的数字图像处理 图像处理 ( 报告 ) 题目 基于 MATLAB 的 水果识别的数字图像处理 指导教师 职称 教授 学生姓名 学号 专 业 院(系) 完成时间 2016 年 ...

  3. matlab水果图片,基于MATLAB的水果识别的数字图像处理教程.docx

    基于MATLAB的水果识别的数字图像处理教程 图像处理(报告) 题目: 基于MATLAB的水果识别的数字图像处理 指导教师: 职称: 教授 学生姓名: 学号: 专 业: 院(系): 完成时间: 201 ...

  4. matlab水果图片,基于matlab的水果识别的数字图像处理

    基于matlab的水果识别的数字图像处理 图像处理(报告)题目: 基于 MATLAB 的水果识别的数字图像处理 指导教师: 职称: 教授 学生姓名: 学号:专 业: 院(系): 完成时间: 2016 ...

  5. Win8 Metro(C#)数字图像处理--2.52图像K均值聚类

    原文:Win8 Metro(C#)数字图像处理--2.52图像K均值聚类  [函数名称] 图像KMeans聚类      KMeansCluster(WriteableBitmap src,int ...

  6. Win8Metro(C#)数字图像处理--2.3图像反色

    原文:Win8Metro(C#)数字图像处理--2.3图像反色 [函数名称] 图像反色函数ContraryProcess(WriteableBitmap src) [算法说明] 反色公式如下:     ...

  7. Win8 Metro(C#)数字图像处理--3.3图像直方图计算

    原文:Win8 Metro(C#)数字图像处理--3.3图像直方图计算 /// <summary>/// Get the array of histrgram./// </summa ...

  8. Win8Metro(C#)数字图像处理--2.7图像伪彩色

    Win8Metro(C#)数字图像处理--2.7图像伪彩色 原文:Win8Metro(C#)数字图像处理--2.7图像伪彩色  2.7图像伪彩色函数 [函数名称] 图像伪彩色函数PseudoCol ...

  9. 正交db小波 图像处理 matlab,基于matlab小波工具箱的数字图像处理及小波分析

    基于matlab小波工具箱的数字图像处理及小波分析 基于 Matlab 小波工具箱的数字图像处理摘要:小波分析在图像处理中有非常重要的应用,包括图像压缩.去噪.分解和增强等.运用多分辨率分析可以将信号 ...

最新文章

  1. 实用技巧:使用 jQuery 异步加载 JavaScript 脚本
  2. ap计算机科学4分还要再考吗,CB官方发布2020年AP计算机科学考试(CSA)的细节:考试时间/考试题型/备考资料/评分标准/考前建议...
  3. http --- 混合加密的具体过程
  4. 大数据初探——Hadoop历史
  5. HTMLCSS常见问题整理(四)
  6. Leetcode-1155 Number of Dice Rolls With Target Sum(掷骰子的N种方法)
  7. 马化腾出售腾讯股份,四天套现近20亿港元;朋友圈发红包测试视频红包玩法...
  8. 2013年测试工作总结
  9. Error:Comments are not permitted in JSON
  10. optenstack配置glance
  11. ap_invoice_distributions_all与PO表关联问题
  12. MySQL批量插入(使用mybatis实现mysql数据库的批量插入操作)
  13. PR常见问题:pr导入素材没有音轨怎么办
  14. Excel也能制作电子印章,你见过吗?学会了职场不求人
  15. 华为荣耀所有系列手机,如何安装谷歌应用框架?
  16. color-scheme 属性根据操作系统配色方案调整页面样式
  17. [转]彻底卸载SQL Server2014数据库(也适用于SqlServer2012)
  18. c语言中函数声明的作用
  19. 安装neurokit 的艰难历程
  20. sqlsever2019:控制流全解

热门文章

  1. matlab2c使用c++实现matlab函数系列教程-poisspdf函数
  2. python可以嵌在vba中吗_Jupyter Notebooks嵌入Excel并使用Python替代VBA宏
  3. HTTPS科普扫盲帖【转】
  4. oracle函数listagg的使用说明(分组后连接字段)
  5. Linux FastDFS 分布式文件系统安装
  6. echarts 系列一
  7. error parsing xml:unbound prefix
  8. 用gallery展示图片,实现中间图片稍大,两边较小的效果
  9. Asp.Net细节性问题精萃
  10. 怎样设置HTML上传控件,上传文件的大小