画像の極座標変換


画像の極座標変換と逆極座標変換を行い、結果画像を保存するサンプルコードです。

import math

import pyfie

# PyFIE 関数が返すエラーコードに応じて例外を発生させる機能を有効化
pyfie.ctrl.enable_f_err_exception(True)

# 極座標変換しないボーダー部分のサイズ
# 濃度補間時に画像範囲外となり画像が欠けないようにするために必要な定数です。
# 条件によってより大きな値にする必要があります。
BORDER_SIZE = 1

# 入力画像読み込み
hsrc = pyfie.imread("polar_src.png", layered=True)

# 1. 順変換
# 出力画像生成。半径を入力画像の高さに合わせる
hdst_polar = pyfie.fnFIE_img_root_alloc(
    hsrc.f_type, hsrc.ch, hsrc.height * 2, hsrc.height * 2)
radius = hsrc.height

# 入力画像の左下を基準に
coord_mode = pyfie.F_PT_LOWER
origin_in = pyfie.DPNT_T(BORDER_SIZE, hsrc.height - 1 - BORDER_SIZE)
# 出力画像の画像中心が回転中心
origin_out = pyfie.DPNT_T(hdst_polar.height / 2, hdst_polar.height / 2)
# X軸負方向から時計回りに1周するように出力
start_angle = math.pi
range_angle = 2.0 * math.pi

# 順変換実行
pyfie.fnFIE_polar_trans_img(
    hsrc, hdst_polar, origin_in, hsrc.width -
    BORDER_SIZE * 2, hsrc.height - BORDER_SIZE * 2,
    origin_out, radius, start_angle, range_angle,
    coord_mode, True, pyfie.F_SAMPLING_BILINEAR
)

# 結果出力
pyfie.imwrite("polar_dst.png", hdst_polar)

# 2. 逆変換
# 画像確保。入力画像と同じ型とサイズ
hdst_polar_inv = hsrc.empty_like()

# 逆変換では基準座標の入力・出力が逆になる
origin_in_inv, origin_out_inv = origin_out, origin_in

# 逆変換実行
pyfie.fnFIE_polar_trans_img_inv(
    hdst_polar, hdst_polar_inv, origin_in_inv, radius, start_angle, range_angle,
    origin_out_inv, hsrc.width - BORDER_SIZE * 2, hsrc.height - BORDER_SIZE * 2,
    pyfie.F_PT_LOWER, True, pyfie.F_SAMPLING_BILINEAR
)

# 結果出力
# 元の画像とほとんど等しい画像が得られる。
# 0クリアされた画素の影響などで、周辺部数画素は上手く復元されない。
pyfie.imwrite("polar_dst_inv.png", hdst_polar_inv)

処理結果例

入力画像

../../_images/polar_src.png

極座標変換結果画像

../../_images/polar_dst.png

極座標変換結果画像に逆変換を実施して得られた画像

../../_images/polar_dst_inv.png

備考

FIE ライブラリにおける極座標変換では、極座標系から直交座標系への変換を順方向と定義します。 これは OpenCV の cv2.warpPolar 関数や scikit-image の skimage.transform.warp_polar 関数とは逆の定義であることにご注意ください。

ダウンロード