图像的旋转和尺度缩放在对数极坐标系下的研究
首先來看一張特殊的同心圓圖像及其極坐標變換:
這是我自己在opencv下用cvLogPolar函數做的實驗:
極坐標原點選擇在同心圓圓心時,同一個圓上的點到圓心的距離相等,所以映射在極坐標中應該是一組垂直于極軸的平行線。在自己的實驗中因為確定圓心的過程中有誤差,所以得到的結果有點扭曲。一組同心圓之間就是尺度縮放的關系,對應在極坐標系中是水平方向的壓縮和拉伸。
一開始因為平行線的關系,我認為尺度變換在極坐標系中對應的是水平方向的平移,后來在使用相位相關法計算極坐標系中的位移量時發現并不是這樣。下面是以lena圖像作為輸入圖像的例子:
第一行是原圖和對應的極坐標系下的轉換圖。為了使圖像在旋轉之后也能完全顯示,這里將圖像用全0填充為了原來的四倍。
第二行是順時針旋轉50度(參數-50.0)和縮放0.6的結果和對應的極坐標轉換圖。
可以看到旋轉和縮放在極坐標系中都轉化為了垂直和水平方向上的平移。
這里利用OpenCV函數phaseCorrelate實現相位相關,計算極坐標中的平移量。得到的是:
我們知道在計算機坐標系中x軸正向是水平向右的,Y軸垂直向下。在極坐標系中水平方向是極軸取對數的結果,豎直是角度。所以可以看到在圖像旋轉和縮小后,在極坐標系中的圖在水平和豎直方向進行了左移和下移。但是這里得到的兩個平移量和旋轉縮放的參數有什么數學關系呢。極坐標下的圖大小為1024x1024,360度分布在y軸的0~512區域,所以y軸平移量y對應的角度變化應該是(y/1024)*360.
這里有兩個誤區:
一是getRotationMatrix2D中的角度參數的單位是度,不必再轉化為弧度。在cvLogPolar函數得到的圖中垂直方向的坐標軸的單位也是度。
第二點還只是根據實驗結果的猜想。對數極坐標按道理要對極軸長度取了對數,但是觀察極坐標系下的轉換圖的寬度,在cvLogPolar函數中好像沒有取對數。利用相位相關法目的是得到極坐標系下的平移量從而得到旋轉角度和縮放系數。但其實縮放之后在極坐標系下表現出的不是平移,而是水平方向的成比例縮放。既然不再是平移,就不能再使用相位相關法進行平移量的計算。除非只有旋轉變換。
在編程的過程中,我特意把極坐標原點、圖像中心、旋轉中心重合,這樣可以使得得到的極坐標系下的圖盡量分布均勻,但是圖像中心容易得到,而在實際情況中我們一般都無法確定圖像的旋轉中心。下面實驗一下原點的選擇的關系。
旋轉中心點和極坐標原點不在圖像中心,但依然重合
旋轉中心點和極坐標原點不再重合。
可以從圖中看到,當旋轉中心坐標和極坐標原點不重合時,旋轉、縮放在極坐標系下對應的變化不再是平移。其實,旋轉中心和極坐標原點不重合可以理解為圖像還經過了平移變換,而平移變換在極坐標系下不再有特殊的性質。這時候可以用傅里葉變換的性質,信號的平移在頻譜中表現為相移,利用相位相關法得到平移量。
其實以上這一套利用極坐標變換和傅里葉變換解決RST問題的方法就是Fourier-mellin算法。
Reference:
1.??????趙春江https://blog.csdn.net/zhaocj/article/details/50157801#commentsedit
2.??????曉響雷電https://blog.csdn.net/agrapier/article/details/50297289
3.????? 同心圓https://blog.csdn.net/u012566751/article/details/61200404
總結
以上是生活随笔為你收集整理的图像的旋转和尺度缩放在对数极坐标系下的研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pycharm下安装Tensorflow
- 下一篇: 【每日SQL打卡】