【OpenCV】【Python】warpPolar()を使用して画像の極座標変換を行う

## はじめに
画像を極座標変換したい時（アナログメータを解析したい時とか）のメモです。
下の例は時計ですが、、、🦔
![m08sf-wztf9.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140207/7ced7dc0-c8b7-54fc-bca9-97efc7d6492d.gif)

どうやら、OpenCV3系にあったlinearPolar()やlogPolar()は非推奨となったようなので、warpPolar()を使用しています。


## ソースコード
ソースコード全文は以下リポジトリを参照ください。
本投稿には抜粋したものを記載しています。

<TABLE ALIGN=CENTER>
  <TR>
    <TD WIDTH=400px>
      <A HREF="https://github.com/Kazuhito00/cv-warpPolar-example" TARGET="_blank"><strong>Kazuhito00/cv-warpPolar-example</strong></a>
      <BR>
      cv-warpPolar-exampleは、OpenCVでの極座標変換/逆変換の実行例です。
    </TD>
  </TR>
</TABLE>

#### 極座標への線形変換
```python:
# キュービック補間 + 外れ値塗りつぶし + 極座標へリニアマッピング
flags = cv2.INTER_CUBIC + cv2.WARP_FILL_OUTLIERS + cv2.WARP_POLAR_LINEAR
# 引き数：画像, 変換後サイズ(幅、高さ)、中心座標(X座標、Y座標)、半径、変換フラグ
linear_polar_image = cv2.warpPolar(image, (300, 1000), (480, 270), 220, flags) 
```
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140207/c5e4aab2-d25f-9adf-737e-9c88468472bc.png)![arrow2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140207/4769725a-ba40-3e9f-43b9-fd610948d143.png)![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140207/c47da705-6738-2a51-639b-124e8ae4ec9c.png)


#### 極座標からの逆変換
```python:
# 逆変換(リニア)
flags = cv2.INTER_CUBIC + cv2.WARP_FILL_OUTLIERS + cv2.WARP_POLAR_LINEAR + cv2.WARP_INVERSE_MAP
linear_polar_inverse_image = cv2.warpPolar(linear_polar_image, (960, 540), (480, 270), 220, flags)
```
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140207/228501cb-7e02-e231-d9e7-72bafaee6874.png)![arrow2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140207/4769725a-ba40-3e9f-43b9-fd610948d143.png)![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140207/46553683-94c5-40d5-68e3-edf3e60ec056.png)


#### 対数極座標への線形変換
```python:
# キュービック補間 + 外れ値塗りつぶし + 対数極座標へリニアマッピング
flags = cv2.INTER_CUBIC + cv2.WARP_FILL_OUTLIERS + cv2.WARP_POLAR_LOG
# 引き数：画像, 変換後サイズ(幅、高さ)、中心座標(X座標、Y座標)、半径、変換フラグ
log_polar_image = cv2.warpPolar(image, (300, 1000), (480, 270), 220, flags)
```
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140207/ee848ad9-4d75-e81b-7e15-e8516906aa4b.png)![arrow2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140207/4769725a-ba40-3e9f-43b9-fd610948d143.png)![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140207/4e0da9c4-1ee2-14a6-d4a5-df8692c3827d.png)


#### 極座標からの逆変換
```python:
# 逆変換(対数)
flags = cv2.INTER_CUBIC + cv2.WARP_FILL_OUTLIERS + cv2.WARP_POLAR_LOG + cv2.WARP_INVERSE_MAP
log_polar_inverse_image = cv2.warpPolar(log_polar_image, (960, 540), (480, 270), 220, flags)
```
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140207/20ff5063-f14e-a4b9-1aef-dac4538b1b67.png)![arrow2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140207/4769725a-ba40-3e9f-43b9-fd610948d143.png)![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140207/3ece4ac4-d39e-3ec6-67ca-5ede8937aaf3.png)


## 参考
[OpenCV Geometric Image Transformations](https://docs.opencv2.org/4.0.1/da/d54/group__imgproc__transform.html#ga49481ab24fdaa0ffa4d3e63d14c0d5e4)

以上。