參考論文中的文字:圖像配準是圖像處理的基本任務之一,用于將不同時間、不同傳感器、不同視角及不同拍攝條件下獲取的關于同一目標或場景的兩幅或多幅圖像進行主要是幾何意義上的匹配套和的過程。在對圖像配準的研究過程中,大量技術被應用于針對不同數據和問題的圖像配準工作,產生了多種不同形式的圖像配準技術。
圖像配準的基本問題是找出一種圖像轉換方法,用以糾正圖像的形變。造成圖像形變的原因多種多樣,例如對于遙感圖像而言,傳感器噪聲、由傳感器視點變化或平臺不穩定造成的透視變化、被拍攝物體的移動、變形或生長等變化、閃電和大氣變化,以及陰影和云層遮蓋都使圖像產生不同形式的形變。正是圖像形變原因和形式的不同決定了多種多樣的圖像配準技術。
迄今已報道了多種圖像配準方法,主要有互相關法、傅立葉變換法、點映射法口腳外和彈性模型法。其中傅立葉變換法基于傅立葉變換的相位匹配是利用傅立葉變換的性質而出現的一種圖像配準方法。圖像經過傅立葉變換,由空域變換到頻率緣則兩組數據在空何上的相關運算可以變為頻譜的復數乘法運算,同時圖像在變換域中還能獲得在空域中很難獲得的特征。
# 一,基于相位相關的圖像配準方法
在時域中信號的平移運動可以通過在頻域中相位的變化表現出來(這是傅里葉變換的特性)。同理,圖像的旋轉、平移和比例變化也能在傅里葉變換的頻域中反映出來。而且使用頻域方法的好處是計算簡單,同時傅立葉變換可以采用方法提高執行的速度。因此,傅氏變換是圖像配準中常用的方法之一。下面我們就具體分析當圖像發生平移、旋轉和縮放時,圖像信號在頻域中的表現。
###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://my.csdn.net/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.