轉(zhuǎn)載:https://blog.csdn.net/zhubaohua_bupt/article/details/83932171
logPolar是把數(shù)據(jù)從笛卡爾轉(zhuǎn)到對數(shù)極坐標(biāo)系,linearPolar把數(shù)據(jù)從笛卡爾坐標(biāo)系轉(zhuǎn)到極坐標(biāo)坐標(biāo)系。
說到笛卡爾坐標(biāo)系到極坐標(biāo)系的轉(zhuǎn)換,大家并不陌生,公式如下:


笛卡爾轉(zhuǎn)到對數(shù)極坐標(biāo)系的轉(zhuǎn)換多了一層對數(shù),可表示如下

這里log以自然數(shù)e為底。
接下來,首先分析一下logPolar和linearPolar輸入輸出參數(shù)的含義以及用法,然后給出一些實(shí)驗(yàn)結(jié)果。
1 logPolar()
這里把imgproc.hpp里的函數(shù)接口粘了過來,從接口說明里我們可以看到,
輸入輸出圖像類型尺寸一致,輸入?yún)?shù)還包括center():轉(zhuǎn)換中心,M: scale 參數(shù)和flags(變換后圖像插值方法)
logPolar()是這樣做的轉(zhuǎn)換:
I = (dx,dy) = (x - center.x,y - center.y) \\
\rho = M \cdot log_e(\texttt{magnitude} (I)) ,\\
\phi = Ky \cdot \texttt{angle} (I)_{0..360 deg} \\
M = src.cols / log_e(maxRadius) \\
Ky = src.rows / 360 \\
上述說明中,除了基本的變換公式外,M和Ky這兩個(gè)參數(shù)需要注意一下,這兩個(gè)參數(shù)決定著變換后半徑[圖片上傳失敗...(image-ca21af-1604301036485)]
和角度[圖片上傳失敗...(image-c1d07e-1604301036485)]
的尺度,也就是說,在變換后的極坐標(biāo)圖像上,x、y方向上單位像素與半徑[圖片上傳失敗...(image-bb889a-1604301036485)]
和角度[圖片上傳失敗...(image-33dad6-1604301036485)]
的關(guān)系。
-
M決定輸出圖像x軸([圖片上傳失敗...(image-cbe3ef-1604301036484)]
)的尺度,Ky決定y軸([圖片上傳失敗...(image-dc4d21-1604301036484)]
)的尺度。
注意到,函數(shù)沒有讓我們手動設(shè)置Ky的值,Ky =
src.rows / 360已經(jīng)寫死,這樣的話,輸出極坐標(biāo)圖像y軸從y=0到y(tǒng)y=row-1的范圍表示角度從0到360度的變化。
參數(shù)M沒有寫死,我們可以通過接口改變,那M = src.cols / log_e(maxRadius), 代表什么意思呢, maxRadius是什么呢?
`回過頭來看笛卡爾向極坐標(biāo)的變換,現(xiàn)在把輸入圖像看作是一個(gè)二維笛卡爾坐標(biāo)系,如下圖我們可以自己設(shè)定center,假設(shè)center為圖像中心,那么maxRadius=[圖片上傳失敗...(image-85e64c-1604301036484)]
,那么我們就可以看出,此時(shí)乘M的作用就是在輸出圖像的x軸上,將log(`[圖片上傳失敗...(image-9479bd-1604301036485)]
)從x=0拉伸到x=col-1。

笛卡爾坐標(biāo)系圖輸入圖像 對數(shù)極坐標(biāo)系下圖像
2 linearPolar()
linearPolar和logPolar類似,比logPolar簡單些,其變換如下圖。
笛卡爾坐標(biāo)系圖輸入圖像 極坐標(biāo)系下圖像
3實(shí)驗(yàn)
下面來看幾個(gè)比較特殊的實(shí)驗(yàn),為了方便,用python實(shí)現(xiàn):
def polar(img):
h, w = img.shape[:2]
maxRadius = math.hypot(w/2,h/2)
m = w / math.log(maxRadius)
log_polar = cv2.logPolar(img, (w/2, h/2), m, cv2.WARP_FILL_OUTLIERS + cv2.INTER_LINEAR)
linear_polar = cv2.linearPolar(img, (w/2, h/2), maxRadius, cv2.WARP_FILL_OUTLIERS + cv2.INTER_LINEAR)
cv2.imshow("log_polar",log_polar)
cv2.imshow("linear_polar",linear_polar)
cv2.waitKey(1000)
第一組: logPolar()
src m = `src.cols / log_e(maxRadius)` /2 m = `src.cols /log_e(maxRadius)`
第二組:

logPolar() linearPolar()
src m = `src.cols /log_e(maxRadius)` `maxRadius`
第三組:


logPolar() linearPolar()
src m = `src.cols /log_e(maxRadius)` `maxRadius`
- 可以想一下在這幾個(gè)例子中,變換后最右側(cè)的尖兒為什有的能連延伸到最右側(cè),有的不能。
- 從笛卡爾坐標(biāo)系來看,這三組的src貌似形狀很完美,但經(jīng)過轉(zhuǎn)換后可以看出后兩組的瑕疵了,如果后兩組也是完美對稱的,那么在極坐標(biāo)系下,第二組縱向應(yīng)該是筆直的,第三組橫行應(yīng)該是平行的。