極座標変換
[基本画像操作]


説明

極座標

本ライブラリでの極座標とは、2次元ユークリッド空間での極座標であり、 円座標(Circular Polar Coordinate)です。 Fig1に座標系を示します。

polar_cordinate_system.png

Fig1. 極座標系

ここで、変換式は以下の通りとなります。

\[ \left( \begin{array}{c} x \\ y \\ \end{array} \right) = \left( \begin{array}{c} r\cos \theta \\ r\sin \theta \\ \end{array} \right) \\ \]

\[ \left( \begin{array}{c} r \\ \theta \\ \end{array} \right) = \left( \begin{array}{c} \sqrt{x^2+y^2} \vspace{.5em} \\ \tan^{-1}\left(\dfrac{y}{x}\right) \vspace{.5em} \\ \end{array} \right) \\ \]

極座標変換と逆変換

本ライブラリではFig2に示す左図から右図への変換を極座標変換と定義します。 右図から左図への変換は逆変換となります。

polar_transform.png

Fig2. 極座標変換と逆変換

変換式と回転軸

本節では、各関数で共通となるパラメータの詳細を記述します。 パラメータの意味はすべての関数で共通です。 ただし、本節で記述するパラメータがすべての関数に存在する訳ではありません。 関数によっては必要のないパラメータもあります。

Fig3に回転軸位置の設定について示します。 それぞれ塗りつぶされている部分が、対象領域です。 回転軸位置は coord_mode パラメータとして与えられます。 coord_mode により、左側の座標での回転軸位置を設定します。 回転軸位置は4つのパターンから指定します。 F_PT_LEFT は左辺、 F_PT_RIGHT は右辺、 F_PT_UPPER は上辺, そして F_PT_LOWER は下辺が回転軸となります。 指定されるパターンにより左側と右側の座標では対応する $r\theta$ 座標と xy 座標が異なります。 左側の座標で F_PT_LEFT と F_PT_RIGHT が指定されていれば、 r が x 軸, $\theta$ が y 軸、 F_PT_UPPER と F_PT_LOWER が指定されていれば、 r が y 軸、 $\theta$ が x 軸とそれぞれ対応しています。 そのため、回転中心座標 $M_{0}$ とw、hの位置関係や、座標変換式の符号等が異なります。

Fig3において、 $M_{0}\left(m_{0},n_{0}\right)$$P_{0}\left(p_{0},q_{0}\right)$ がそれぞれの回転中心座標であり、対応関係となります。 以後,本節では coord_mode が F_PT_LEFT を指定した場合を用いて説明をします。 以下に、 $M\left(m,n\right)$ から $P\left(p,q\right)$ への変換式と、その逆変換式を示します。 なお、簡単のため $\theta$ の処理開始角度は0、処理範囲は $2\pi$ とします。 ここで、 $P_{0}\left(p_{0},q_{0}\right)$ を原点とした $P\left(p,q\right)$ での r を r' 、 $\theta$$\theta\acute{}$ とすると、

\[ r\acute{} = \sqrt{\left(p-p_{0}\right)^2+\left(q-q_{0}\right)^2} \]

\[ \theta\acute{} = \tan^{-1} \frac{q-q_{0}}{p-p_{0}} \]

となります。r と w の対応関係より、以下の式が導かれます。

\[ r\ :\ \text{w} = r\acute{}\ :\ \left(m-m_{0}\right) \]

\[ m = \frac{\text{w}}{r}\ r\acute{}+m_{0} \]

続いて、右側の座標での円弧長を L とします。

\[ L = r\theta\acute{} \]

$\theta$ とhの対応関係より、以下の式が導かれます。

\[ 2\pi r\ :\ \text{h} = L\ :\ \left(n-n_{0}\right) \]

\[ n = \frac{\text{h}}{2\pi}\ \theta\acute{}+n_{0} \]

以上より、 $P\left(p,q\right)$ から $M\left(m,n\right)$ への変換式が求められました。

$M\left(m,n\right)$ から $P\left(p,q\right)$ への変換式は、 まず、 r' と $\theta\acute{}$ を求めます。

\[ r\acute{} = \frac{r}{\text{w}}m-\frac{rm_{0}}{\text{w}} \]

\[ \theta\acute{} = \frac{2\pi}{\text{h}}n-\frac{2\pi n_{0}}{\text{h}} \]

続いて、 p と q を求めます。

\[ p = r\acute{}\cos \theta\acute{} \]

\[ q = r\acute{}\sin \theta\acute{} \]

polar_coord_mode.png

Fig3. 回転軸位置の設定

また、Fig3の左図で示されているように、指定された coord_mode により、 x 、 y 軸と r 、 $\theta$ 軸の対応関係と軸方向が異なります。 そのため、処理対象領域を設定されるための基準は以下の通りとなります。 以下に示す各変数は、Fig3に従います。

F_PT_UPPER

F_PT_LOWER F_PT_LEFT F_PT_RIGHT

パラメータの対応関係

Fig4に、パラメータの対応関係を示します。 本図では、左が入力側、右が出力側とします。 coord_mode は F_PT_LEFT を指定しているものとします。 origin_inorigin_out に変換されます。 逆変換も同様です。

Fig.4の塗りつぶされている領域は、処理対象となる領域です。 本領域は、ユーザーが任意に指定するパラメータによって決定されます。 ここでのパラメータとは、 origin_inwidthheightorigin_outradiusstart_angle 、 そして range_angle です。 入力画像、出力画像のサイズには依存しません。 画像領域は、処理対象領域と別に考えなければなりません。 入力側、出力側共に、処理対象領域と画像領域が重なり合う領域が必要です。 どちらか一方でも、重なり合う領域がない場合には、処理がなされません。

polar_transform_param.png

Fig4. パラメータとの対応関係

濃度補間方法

濃度補間法は以下の3つから指定することができます。

使用可能な濃度補間法は、画素タイプにより異なります。 以下の表を参照してください。 各濃度補間方法の詳細については、濃度補間方法 を参照して下さい。

 F_IMG_BINF_IMG_UC8F_IMG_US16F_IMG_DOUBLE
F_SAMPLING_NN
F_SAMPLING_BILINEAR
×
F_SAMPLING_CUBIC
×


列挙型

enum  f_coord_mode {
  F_PT_UPPER = 1, F_PT_LOWER = 2,
  F_PT_LEFT = 3, F_PT_RIGHT = 4
}
 回転軸の位置を指定 [詳細]

関数

INT FVALGAPI fnFIE_polar_trans_img (const FHANDLE hsrc, FHANDLE hdst, DPNT_T origin_in, DOUBLE width, DOUBLE height, DPNT_T origin_out, DOUBLE radius, DOUBLE start_angle, DOUBLE range_angle, enum f_coord_mode coord_mode, INT back_clear, enum f_sampling_mode sampling_mode)
 画像間の極座標変換
INT FVALGAPI fnFIE_polar_trans_img_inv (const FHANDLE hsrc, FHANDLE hdst, DPNT_T origin_in, DOUBLE radius, DOUBLE start_angle, DOUBLE range_angle, DPNT_T origin_out, DOUBLE width, DOUBLE height, enum f_coord_mode coord_mode, INT back_clear, enum f_sampling_mode sampling_mode)
 画像間の逆極座標変換
INT FVALGAPI fnFIE_polar_trans_map (FHANDLE hmap, DPNT_T origin_in, DOUBLE width, DOUBLE height, DPNT_T origin_out, DOUBLE radius, DOUBLE start_angle, DOUBLE range_angle, enum f_coord_mode coord_mode)
 極座標変換マップの作成
INT FVALGAPI fnFIE_polar_trans_map_inv (FHANDLE hmap, DPNT_T origin_in, DOUBLE radius, DOUBLE start_angle, DOUBLE range_angle, DPNT_T origin_out, DOUBLE width, DOUBLE height, enum f_coord_mode coord_mode)
 逆極座標変換マップの作成
INT FVALGAPI fnFIE_polar_trans_pnt (const DPNT_T *psrc, DPNT_T *pdst, INT num_pnt, DPNT_T origin_in, DOUBLE width, DOUBLE height, DPNT_T origin_out, DOUBLE radius, DOUBLE start_angle, DOUBLE range_angle, enum f_coord_mode coord_mode)
 点群間の極座標変換
INT FVALGAPI fnFIE_polar_trans_pnt_inv (const DPNT_T *psrc, DPNT_T *pdst, INT num_pnt, DPNT_T origin_in, DOUBLE radius, DOUBLE start_angle, DOUBLE range_angle, DPNT_T origin_out, DOUBLE width, DOUBLE height, enum f_coord_mode coord_mode)
 点群間の逆極座標変換

列挙型

回転軸の位置を指定

回転軸位置を指定します。

列挙型の値:
F_PT_UPPER  上辺が回転軸
F_PT_LOWER  下辺が回転軸
F_PT_LEFT  左辺が回転軸
F_PT_RIGHT  右辺が回転軸


関数

INT FVALGAPI fnFIE_polar_trans_img ( const FHANDLE  hsrc,
FHANDLE  hdst,
DPNT_T  origin_in,
DOUBLE  width,
DOUBLE  height,
DPNT_T  origin_out,
DOUBLE  radius,
DOUBLE  start_angle,
DOUBLE  range_angle,
enum f_coord_mode  coord_mode,
INT  back_clear,
enum f_sampling_mode  sampling_mode 
)

画像間の極座標変換

画像間の極座標変換をします。

全般

  • 入力画像と出力画像は画素タイプとチャネル数が同じである必要があります。
  • チャネルは、マルチチャネル対応となります。
  • 本関数内で、出力画像のメモリ確保は行いません。 ユーザーが必要なメモリを確保した画像オブジェクトを用意する必要があります。
origin_in
  • coord_mode で指定されたパラメータに基づいて、 入力画像での処理対象領域(四角形)の基準座標を指定します。
  • 指定する座標は、入力画像外でも構いません。
width
  • origin_in で指定された座標からの処理対象領域の幅を指定します。
  • width ≧ 0 の範囲で指定します。
  • width$\theta$ 軸と対応している場合、 y = ( origin_in.y + height ) 軸上での width は、 出力画像での扇形の円弧の長さと対応します。円弧の長さは、 width と | radius * range_angle | の比によって決定します。
  • width が r 軸と対応している場合、 r の長さは、 widthradius の比によって決定します。
height
  • origin_in で指定された座標からの処理対象領域の高さを指定します。
  • height ≧ 0 の範囲で指定します。
  • height$\theta$ 軸と対応している場合、 x = ( origin_in.x + width ) 軸上での height は、 出力画像での円弧の長さと対応します。円弧の長さは、 height と | radius * range_angle | の比によって決定します。
  • height が r 軸と対応している場合、 r の長さは、 heightradius の比によって決定します。
origin_out
  • 出力画像の左上を基準とした回転中心座標を指定します。
  • 指定する座標は、出力画像外でも構いません。
radius
  • 出力画像での扇形の半径を指定します。
  • radius ≧ 0 の範囲で指定します。
start_angle
  • 出力画像での回転開始角度をラジアン単位で指定します。
  • 0 ≦ start_angle$2\pi$ の範囲で指定します。
range_angle
  • 回転開始角度 start_angle からの処理範囲をラジアン単位で指定します。範囲の大きさに指定はありませんが、以下のように処理されます。
    1. range_angle が正ならば時計回り、負ならば反時計回りとして処理をします。
    2. range_angle$2\pi$ の範囲で指定した場合、$2\pi$ を超えた分は出力されません。 range_angle$-2\pi$ の場合も同様に、$-2\pi$ を下回った分は出力されません。
coord_mode
  • 入力側の回転軸の位置を指定します。
    • F_PT_UPPER 上辺が回転軸
    • F_PT_LOWER 下辺が回転軸
    • F_PT_LEFT 左辺が回転軸
    • F_PT_RIGHT 右辺が回転軸

back_clear

  • 結果画像中の領域外になる画素(入力座標系での座標が処理対象画像の外側になる画素) の処理方法の指定です。
    • TRUE 0クリア
    • FALSE 処理なし

sampling_mode

  • 濃度補間方法の指定します。以下の3種類から選択できます。
    • F_SAMPLING_NN 最近傍法
    • F_SAMPLING_BILINEAR 共一次線形補間法
    • F_SAMPLING_CUBIC 三次畳み込み法
  • 処理対象画像の型が 2値(F_IMG_BIN) の場合は、F_SAMPLING_NN のみ使用可能です。

引数:
[in] hsrc 入力画像( type : bin, uc8, us16, double )
[out] hdst 出力画像( type : bin, uc8, us16, double )
[in] origin_in 入力側での処理対象領域の開始座標
[in] width 入力側での処理対象領域の幅
[in] height 入力側での処理対象領域の高さ
[in] origin_out 出力側での円板の回転中心
[in] radius 出力側での円板の半径
[in] start_angle 出力側での処理開始角度
[in] range_angle 出力側での角度の処理範囲
[in] coord_mode 入力側での回転中心位置
  • F_PT_UPPER 処理対象領域の右上座標
  • F_PT_LOWER 処理対象領域の左下座標
  • F_PT_LEFT 処理対象領域の左上座標
  • F_PT_RIGHT 処理対象領域の右下座標
[in] back_clear 出力画像の背景処理方法
  • TRUE 領域外になる画素は0クリア
  • FALSE 領域外になる画素は処理しない
[in] sampling_mode 濃度補間法
  • F_SAMPLING_NN 最近傍法により濃度補間を行う
  • F_SAMPLING_BILINEAR 共一次線形補間法により濃度補間を行う
  • F_SAMPLING_CUBIC 三次畳み込み法により濃度補間を行う
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM 不正なパラメータが渡された
F_ERR_INVALID_IMAGE 不正な画像オブジェクトが渡された
F_ERR_NOMEMORY メモリ不足(F_SAMPLING_CUBICを指定した場合のみ)
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
極座標変換ライブラリの使用例
Fig1に、 coord_mode の指定例を示します。 本例は、左図から右図への変換です。
  • 左図のオレンジの線で囲まれている領域が、 coord_mode 毎の処理対象領域です。
  • 左図の緑色のx印は、基準座標の位置です。 coord_mode 毎に指定する位置が異なります。
  • 右図の赤線が start_angle で指定された角度です。本図では、 0.0 が指定されています。
  • range_angle は、 $2\pi$ が指定されています。
polar_transform_ref.png

Fig1. cood_mode の指定例

start_anglerange_anglewidthheight の各パラメータの設定例を示します。 本図では、例として「FIE Polar Transform Library」の文字列を極座標変換を施しています。 coord_modeF_PT_LEFTsampling_modeF_SAMPLING_NN を指定しているものとします。
  • 入力画像は、幅400、高さ800、origin_in.x = 0、origin_in.y = 0とします。
  • (1)は、基準となる例です。 この際の、 widthheight 、 つまり、入力側の処理対象領域は共に400、800とします。
  • (2)は、 range_angle を(1)の半分で指定した例です。 文字列はすべて含まれていますが、出力領域が半分の角度範囲となります。
  • (3)は、(2)の条件に対して、さらに height を半分で指定した例です。 (1)の結果を半分にした結果なります。
  • (4)は、 height を(1)の半分で指定した例です。文字列が半分しか含まれていません。
  • (5)は、 range_angle を(1)に対して負に指定した例です。文字列が反転しています。
  • (6)は、(5)の条件に対して、 range_angle を半分で指定した例です。 文字列が反転している以外に、(2)と比較して出力領域の位置が反転しています。
  • (7)は、 start_angle に、 $1.5\pi$ を指定しています。 それ以外は(1)の条件と同じです。文字列の開始位置がずれています。
  • (8)は、 width を(1)の0.8倍で指定した例です。文字列が外側にずれています。 また、 r の長さは、 heightradius の比によって決定されるため、 文字の r 方向のサイズも大きくなります。 内側にずらす場合には、 1.0より大きい値を掛けます。文字の r 方向のサイズも小さくなります。 サイズを変更せずに移動させたい場合は、 origin_in を変更してください。
  • (9)は、range_angle$3\pi$ を指定しています。$3\pi$まで出力するという意味になりますが、 表示ができるのが$2\pi$までなので、height の2/3が出力されています。
  • (10)は、range_angle$-3\pi$ を指定しています。(9)を反転した画像が出力されます。
入力画像
polar_src.png
 
(1)start_angle = 0 , range_angle = $2\pi$ ,
width = 400 , height = 800
(2)start_angle = 0 , range_angle = $\pi$ ,
width = 400 , height = 800
polar_s0_r2_w400_h800.png
polar_s0_r1_w400_h800.png
 
(3)start_angle = 0 , range_angle = $\pi$ ,
width = 400 , height = 400
(4)start_angle = 0 , range_angle = $2\pi$ ,
width = 400 , height = 400
polar_s0_r1_w400_h400.png
polar_s0_r2_w400_h400.png
 
(5)start_angle = 0 , range_angle = $-2\pi$ ,
width = 400 , height = 800
(6)start_angle = 0 , range_angle = $-\pi$ ,
width = 400 , height = 800
polar_s0_r-2_w400_h800.png
polar_s0_r-1_w400_h800.png
 
(7)start_angle = $1.5\pi$ , range_angle = $2\pi$ ,
width = 400 , height = 800
(8)start_angle = 0 , range_angle = $2\pi$ ,
width = 320 , height = 800
polar_s1.5_r2_w400_h800.png
polar_s0_r2_w320_h800.png
 
(9)start_angle = 0 , range_angle = $3\pi$ ,
width = 400 , height = 800
(10)start_angle = 0 , range_angle = $-3\pi$ ,
width = 400 , height = 800
polar_s0_r3_w400_h800.png
polar_s0_r-3_w400_h800.png
// エラー処理は省略しているので注意して下さい。
#include "fie.h"

// 左図から右図への変換
VOID polar_transform_img()
{
    FHANDLE hsrc = NULL, hdst = NULL;
    DPNT_T  origin_in, origin_out;
    DOUBLE  width, height, radius, start_angle, range_angle;

    // 入力画像の読み込み
    // width = 256.0, height = 256.0
    fnFIE_load_tiff( "fie_poloar_transform.tif", &hsrc, F_COLOR_IMG_TYPE_UC8 );

    // 出力画像のメモリ確保
    // チャネル数は同じ必要がある
    hdst = fnFIE_img_root_alloc( F_IMG_UC8, 1, 128, 128 );

    origin_out.x = 64.0;
    origin_out.y = 64.0;

    radius = 64.0;

    start_angle = 0.0;
    range_angle = 2.0 * PI;

    // F_PT_UPPER
    // 入力側の対象領域の右上の座標を指定する
    origin_in.x = 178.0;
    origin_in.y = 6.0;

    width = 64.0;
    height = 172.0;

    // 背景は0クリア
    // 濃度補間法は最近傍法
    fnFIE_polar_trans_img( hsrc, hdst, origin_in, width, height, 
                           origin_out, radius, start_angle, range_angle,
                           F_PT_UPPER, TRUE, F_SAMPLING_NN );

    fnFIE_save_tiff( "fie_poloar_transform_upper.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 );

    // F_PT_LOWER
    // 入力側の対象領域の左下の座標を指定する
    origin_in.x = 78.0;
    origin_in.y = 250.0;

    width = 64.0;
    height = 172.0;

    // 背景は0クリア
    // 濃度補間法は共一次線形補間法
    fnFIE_polar_trans_img( hsrc, hdst, origin_in, width, height,
                           origin_out, radius, start_angle, range_angle,
                           F_PT_LOWER, TRUE, F_SAMPLING_BILINEAR );

    fnFIE_save_tiff( "fie_poloar_transform_lower.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 );

    // F_PT_LEFT
    // 入力側の対象領域の左上の座標を指定する
    origin_in.x = 6.0;
    origin_in.y = 78.0;

    width = 172.0;
    height = 64.0;

    // 背景は0クリア
    // 濃度補間法は三次畳み込み法
    fnFIE_polar_trans_img( hsrc, hdst, origin_in, width, height,
                           origin_out, radius, start_angle, range_angle,
                           F_PT_LEFT, TRUE, F_SAMPLING_CUBIC );

    fnFIE_save_tiff( "fie_poloar_transform_left.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 );

    // F_PT_RIGHT
    // 入力側の対象領域の右下の座標を指定する
    origin_in.x = 250.0;
    origin_in.y = 178.0;

    width = 172.0;
    height = 64.0;

    // 背景は0クリア
    // 濃度補間法は三次畳み込み法
    fnFIE_polar_trans_img( hsrc, hdst, origin_in, width, height,
                           origin_out, radius, start_angle, range_angle,
                           F_PT_RIGHT, TRUE, F_SAMPLING_CUBIC );

    fnFIE_save_tiff( "fie_poloar_transform_right.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 );

    fnFIE_free_object( hsrc );
    fnFIE_free_object( hdst );
}

INT main()
{
    // FIEライブラリの初期化処理
    fnFIE_setup();

    polar_transform_img();

    // FIEライブラリの終了処理
    fnFIE_teardown();

    return 0;
}

INT FVALGAPI fnFIE_polar_trans_img_inv ( const FHANDLE  hsrc,
FHANDLE  hdst,
DPNT_T  origin_in,
DOUBLE  radius,
DOUBLE  start_angle,
DOUBLE  range_angle,
DPNT_T  origin_out,
DOUBLE  width,
DOUBLE  height,
enum f_coord_mode  coord_mode,
INT  back_clear,
enum f_sampling_mode  sampling_mode 
)

画像間の逆極座標変換

画像間の逆極座標変換をします。

全般

  • 入力画像と出力画像は画素タイプとチャネル数が同じである必要があります。
  • チャネルは、マルチチャネル対応となります。
  • 本関数内で、出力画像のメモリ確保は行いません。 ユーザーが必要なメモリを確保した画像オブジェクトを用意する必要があります。
origin_in
  • 入力画像の左上を基準とした回転中心座標を指定します。
  • 指定する座標は、出力画像外でも構いません。
radius
  • 入力画像での扇形の半径を指定します。
  • radius ≧ 0 の範囲で指定します。
start_angle
  • 入力画像での回転開始角度をラジアン単位で指定します。
  • 0 ≦ start_angle$2\pi$ の範囲で指定します。
range_angle
  • 回転開始角度 start_angle からの処理範囲をラジアン単位で指定します。範囲の大きさに指定はありませんが、以下のように処理されます。
    1. range_angle が正ならば時計回り、負ならば反時計回りとして処理をします。
    2. range_angle$2\pi$ の範囲で指定した場合、$2\pi$ を超えた分の範囲が繰り返し出力されます。 range_angle$-2\pi$ の場合も同様に、$-2\pi$ を下回った分の範囲が繰り返し出力されます。
origin_out
  • coord_mode で指定されたパラメータに基づいて、 出力画像での処理対象領域(四角形)の基準座標を指定します。
  • 指定する座標は、出力画像外でも構いません。
width
  • origin_out で指定された座標からの処理対象領域の幅を指定します。
  • width ≧ 0 の範囲で指定します。
  • width$\theta$ 軸と対応している場合、 y = ( origin_in.y + height ) 軸上での width は、 入力画像での扇形の円弧の長さと対応します。 円弧の長さは、 width と | radius * range_angle | の比によって決定します。
  • width が r 軸と対応している場合、 r の長さは、 widthradius の比によって決定します。
height
  • origin_out で指定された座標からの処理対象領域の高さを指定します。
  • height ≧ 0 の範囲で指定します。
  • height$\theta$ 軸と対応している場合、 x = ( origin_in.x + width ) 軸上での height は、 入力画像での円弧の長さと対応します。円弧の長さは、 height と | radius * range_angle | の比によって決定します。
  • height が r 軸と対応している場合、 r の長さは、 heightradius の比によって決定します。
coord_mode
  • 出力側の回転軸の位置を指定します。
    • F_PT_UPPER 上辺が回転軸
    • F_PT_LOWER 下辺が回転軸
    • F_PT_LEFT 左辺が回転軸
    • F_PT_RIGHT 右辺が回転軸

back_clear

  • 結果画像中の領域外になる画素(入力座標系での座標が処理対象画像の外側になる画素) の処理方法の指定です。
    • TRUE 0クリア
    • FALSE 処理なし

sampling_mode

  • 濃度補間方法の指定します。以下の3種類から選択できます。
    • F_SAMPLING_NN 最近傍法
    • F_SAMPLING_BILINEAR 共一次線形補間法
    • F_SAMPLING_CUBIC 三次畳み込み法
  • 処理対象画像の型が 2値(F_IMG_BIN) の場合は、F_SAMPLING_NN のみ使用可能です。

引数:
[in] hsrc 入力画像( type : bin, uc8, us16, double )
[out] hdst 出力画像( type : bin, uc8, us16, double )
[in] origin_in 入力側での処理対象領域の開始座標
[in] radius 入力側での円板の半径
[in] start_angle 入力側での処理開始角度
[in] range_angle 入力側での角度の処理範囲
[in] origin_out 出力側での円板の回転中心
[in] width 出力側での処理対象領域の幅
[in] height 出力側での処理対象領域の高さ
[in] coord_mode 出力側での回転中心位置
  • F_PT_UPPER 処理対象領域の右上座標
  • F_PT_LOWER 処理対象領域の左下座標
  • F_PT_LEFT 処理対象領域の左上座標
  • F_PT_RIGHT 処理対象領域の右下座標
[in] back_clear 出力画像の背景処理方法
  • TRUE 領域外になる画素は0クリア
  • FALSE 領域外になる画素は処理しない
[in] sampling_mode 濃度補間法
  • F_SAMPLING_NN 最近傍法により濃度補間を行う
  • F_SAMPLING_BILINEAR 共一次線形補間法により濃度補間を行う
  • F_SAMPLING_CUBIC 三次畳み込み法により濃度補間を行う
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM 不正なパラメータが渡された
F_ERR_INVALID_IMAGE 不正な画像オブジェクトが渡された
F_ERR_NOMEMORY メモリ不足(F_SAMPLING_CUBICを指定した場合のみ)
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
極座標変換ライブラリの使用例
Fig1に、 coord_mode の指定例を示します。 本例は、右図から左図への変換です。
  • 左図のオレンジの線で囲まれている領域が、 coord_mode 毎の処理対象領域です。
  • 左図の緑色のx印は、基準座標の位置です。 coord_mode 毎に指定する位置が異なります。
  • 右図の赤線が start_angle で指定された角度です。本図では、 0.0 が指定されています。
  • range_angle は、 $2\pi$ が指定されています。
polar_transform_ref.png

Fig1. 極座標変換ライブラリの使用例

start_anglerange_anglewidthheight の各パラメータの設定例を示します。 本図では、例として「FIE Polar Transform Library」の文字列を逆極座標変換を施しています。 coord_modeF_PT_LEFTsampling_modeF_SAMPLING_NN を指定しているものとします。
  • 入力画像は、幅500、高さ500、origin_in.x = 250、origin_in.y = 250とします。
  • (1)は、基準となる例です。 この際の、 widthheight 、 つまり、出力側の処理対象領域は共に400、800とします。
  • (2)は、range_angle$4\pi$ を指定しています。$2\pi$ を超えた分の範囲は繰り返し表示されるので、$4\pi$ では2周表示されます。
入力画像
polar_s0_r2_w400_h800.png
 
(1)start_angle = 0 , range_angle = $2\pi$ ,
width = 400 , height = 800
(2)start_angle = 0 , range_angle = $4\pi$ ,
width = 400 , height = 800
polar_inv_s0_r2_w400_h800.png
polar_inv_s0_r4_w400_h800.png
// エラー処理は省略しているので注意して下さい。
#include "fie.h"

// 右図から左図への変換
VOID polar_transform_img_inv()
{
    FHANDLE hsrc = NULL, hdst = NULL;
    DPNT_T  origin_in, origin_out;
    DOUBLE  width, height, radius, start_angle, range_angle;

    // 入力画像の読み込み
    // width = 128.0, height = 128.0
    fnFIE_load_tiff( "fie_poloar_transform_inv.tif", &hsrc, F_COLOR_IMG_TYPE_UC8 );

    // 出力画像のメモリ確保
    // チャネル数は同じ必要がある
    hdst = fnFIE_img_root_alloc( F_IMG_UC8, 1, 256, 256 );

    origin_in.x = 64.0;
    origin_in.y = 64.0;

    radius = 64.0;

    start_angle = 0.0;
    range_angle = 2.0 * PI;

    // F_PT_UPPER
    // 出力側の対象領域の右上の座標を指定する
    origin_out.x = 178.0;
    origin_out.y = 6.0;

    width = 64.0;
    height = 172.0;

    // 背景は処理しない
    // 濃度補間法は最近傍法
    fnFIE_polar_trans_img_inv( hsrc, hdst, origin_in, radius, start_angle, range_angle,
                               origin_out, width, height,
                               F_PT_UPPER, FALSE, F_SAMPLING_NN );

    fnFIE_save_tiff( "fie_poloar_transform_inv_upper.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 );

    // F_PT_LOWER
    // 出力側の対象領域の左下の座標を指定する
    origin_out.x = 78.0;
    origin_out.y = 250.0;

    width = 64.0;
    height = 172.0;

    // 背景は処理しない
    // 濃度補間法は共一次線形補間法
    fnFIE_polar_trans_img_inv( hsrc, hdst, origin_in, radius, start_angle, range_angle,
                               origin_out, width, height,
                               F_PT_LOWER, FALSE, F_SAMPLING_BILINEAR );

    fnFIE_save_tiff( "fie_poloar_transform_inv_lower.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 );

    // F_PT_LEFT
    // 出力側の対象領域の左上の座標を指定する
    origin_out.x = 6.0;
    origin_out.y = 78.0;

    width = 172.0;
    height = 64.0;

    // 背景は処理しない
    // 濃度補間法は三次畳み込み法
    fnFIE_polar_trans_img_inv( hsrc, hdst, origin_in, radius, start_angle, range_angle,
                               origin_out, width, height,
                               F_PT_LEFT, FALSE, F_SAMPLING_CUBIC );

    fnFIE_save_tiff( "fie_poloar_transform_inv_left.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 );

    // F_PT_RIGHT
    // 出力側の対象領域の右下の座標を指定する
    origin_out.x = 250.0;
    origin_out.y = 178.0;

    width = 172.0;
    height = 64.0;

    // 背景は処理しない
    // 濃度補間法は三次畳み込み法
    fnFIE_polar_trans_img_inv( hsrc, hdst, origin_in, radius, start_angle, range_angle,
                               origin_out, width, height,
                               F_PT_RIGHT, FALSE, F_SAMPLING_CUBIC );

    fnFIE_save_tiff( "fie_poloar_transform_inv_right.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 );

    fnFIE_free_object( hsrc );
    fnFIE_free_object( hdst );
}

INT main()
{
    // FIEライブラリの初期化処理
    fnFIE_setup();

    polar_transform_img_inv();

    // FIEライブラリの終了処理
    fnFIE_teardown();

    return 0;
}

INT FVALGAPI fnFIE_polar_trans_map ( FHANDLE  hmap,
DPNT_T  origin_in,
DOUBLE  width,
DOUBLE  height,
DPNT_T  origin_out,
DOUBLE  radius,
DOUBLE  start_angle,
DOUBLE  range_angle,
enum f_coord_mode  coord_mode 
)

極座標変換マップの作成

極座標変換マップを作成します。極座標変換マップは、 fnFIE_geotrans_warpping で利用されます。

全般

  • 画素タイプが F_IMG_DOUBLE または F_IMG_FLOAT 、チャネル数が2の画像オブジェクトを指定します。 マップ画像の各画素値は結果画像の変換前の座標値として使用されますので、 結果画像の変換前の x 座標を hmap のチャネル0、 y 座標はチャネル1に入力します。
  • fnFIE_geotrans_warpping 実行時において、 hmap に入力されている座標値が処理対象画像の外側を示す場合は、無効画素として処理されます。 また、処理対象画像のチャネル数が複数である場合には、 すべてのチャネルに同じ座標変換マップを使用します。
  • 本関数内で、出力画像のメモリ確保は行いません。 ユーザーが必要なメモリを確保した画像オブジェクトを用意する必要があります。
origin_in
  • coord_mode で指定されたパラメータに基づいて、 原点 $O\left(0,0\right)$ からの基準座標を指定します。
width
  • origin_in で指定された座標からの処理対象領域の幅を指定します。
  • width ≧ 0 の範囲で指定します。
  • width$\theta$ 軸と対応している場合、 y = ( origin_in.y + height ) 軸上での width は、 出力画像での扇形の円弧の長さと対応します。円弧の長さは、 width と | radius * range_angle | の比によって決定します。
  • width が r 軸と対応している場合、 r の長さは、 widthradius の比によって決定します。
height
  • origin_in で指定された座標からの処理対象領域の高さを指定します。
  • height ≧ 0 の範囲で指定します。
  • height$\theta$ 軸と対応している場合、 x = ( origin_in.x + width ) 軸上での height は、 出力画像での円弧の長さと対応します。円弧の長さは、 height と | radius * range_angle | の比によって決定します。
  • height が r 軸と対応している場合、 r の長さは、 heightradius の比によって決定します。
origin_out
  • 出力画像の左上を基準とした回転中心座標を指定します。
  • 指定する座標は、出力画像外でも構いません。
radius
  • 出力画像での扇形の半径を指定します。
  • radius ≧ 0 の範囲で指定します。
start_angle
  • 出力画像での回転開始角度をラジアン単位で指定します。
  • 0 ≦ start_angle$2\pi$ の範囲で指定します。
range_angle
  • 回転開始角度 start_angle からの処理範囲をラジアン単位で指定します。範囲の大きさに指定はありませんが、以下のように処理されます。
    1. range_angle が正ならば時計回り、負ならば反時計回りとして処理をします。
    2. range_angle$2\pi$ の範囲で指定した場合、$2\pi$ を超えた分は出力されません。 range_angle$-2\pi$ の場合も同様に、$-2\pi$ を下回った分は出力されません。
coord_mode
  • 入力側の回転軸の位置を指定します。
    • F_PT_UPPER 上辺が回転軸
    • F_PT_LOWER 下辺が回転軸
    • F_PT_LEFT 左辺が回転軸
    • F_PT_RIGHT 右辺が回転軸

引数:
[out] hmap 変換マップ( type : double, float / channel : 2 )
[in] origin_in 入力側での処理対象領域の開始座標
[in] width 入力側での処理対象領域の幅
[in] height 入力側での処理対象領域の高さ
[in] origin_out 出力側での円板の回転中心
[in] radius 出力側での円板の半径
[in] start_angle 出力側での処理開始角度
[in] range_angle 出力側での角度の処理範囲
[in] coord_mode 入力側での回転中心位置
  • F_PT_UPPER 処理対象領域の右上座標
  • F_PT_LOWER 処理対象領域の左下座標
  • F_PT_LEFT 処理対象領域の左上座標
  • F_PT_RIGHT 処理対象領域の右下座標
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM 不正なパラメータが渡された
F_ERR_INVALID_IMAGE 不正な画像オブジェクトが渡された
F_ERR_NOMEMORY メモリ不足
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
極座標変換ライブラリの使用例
Fig1に、 coord_mode の指定例を示します。 本例は、左図から右図への変換です。
  • 左図のオレンジの線で囲まれている領域が、 coord_mode 毎の処理対象領域です。
  • 左図の緑色のx印は、基準座標の位置です。 coord_mode 毎に指定する位置が異なります。
  • 右図の赤線が start_angle で指定された角度です。本図では、 0.0 が指定されています。
  • range_angle は、 $2\pi$ が指定されています。
polar_transform_ref.png

Fig1. 極座標変換ライブラリの使用例

// エラー処理は省略しているので注意して下さい。
#include "fie.h"

// 左図から右図への変換
VOID polar_transform_map()
{
    FHANDLE hsrc = NULL, hdst = NULL, hmap = NULL;
    DPNT_T  origin_in, origin_out;
    DOUBLE  width, height, radius, start_angle, range_angle;

    // 入力画像の読み込み
    // width = 256.0, height = 256.0
    fnFIE_load_tiff( "fie_poloar_transform.tif", &hsrc, F_COLOR_IMG_TYPE_UC8 );

    // 座標マップと出力画像のメモリ確保
    // チャネル数は同じ必要がある
    hdst = fnFIE_img_root_alloc( F_IMG_UC8, 1, 128, 128 );
    hmap = fnFIE_img_root_alloc( F_IMG_DOUBLE, 2, 128, 128 );

    origin_out.x = 64.0;
    origin_out.y = 64.0;

    radius = 64.0;

    start_angle = 0.0;
    range_angle = 2.0 * PI;

    // F_PT_UPPER
    // 入力側の対象領域の右上の座標を指定する
    origin_in.x = 178.0;
    origin_in.y = 6.0;

    width = 64.0;
    height = 172.0;

    fnFIE_polar_trans_map( hmap, origin_in, width, height,
                           origin_out, radius, start_angle, range_angle, F_PT_UPPER );

    // 幾何変換ライブラリの fnFIE_geotrans_warpping() を使用して画像にする
    fnFIE_geotrans_warpping( hsrc, hmap, hdst, NULL, FALSE, F_SAMPLING_CUBIC );

    fnFIE_save_tiff( "fie_poloar_transform_upper.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 );

    // F_PT_LOWER
    // 入力側の対象領域の左下の座標を指定する
    origin_in.x = 78.0;
    origin_in.y = 250.0;

    width = 64.0;
    height = 172.0;

    fnFIE_polar_trans_map( hmap, origin_in, width, height,
                           origin_out, radius, start_angle, range_angle, F_PT_LOWER );

    // 幾何変換ライブラリの fnFIE_geotrans_warpping() を使用して画像にする
    fnFIE_geotrans_warpping( hsrc, hmap, hdst, NULL, FALSE, F_SAMPLING_CUBIC );

    fnFIE_save_tiff( "fie_poloar_transform_lower.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 );

    // F_PT_LEFT
    // 入力側の対象領域の左上の座標を指定する
    origin_in.x = 6.0;
    origin_in.y = 78.0;

    width = 172.0;
    height = 64.0;

    fnFIE_polar_trans_map( hmap, origin_in, width, height,
                           origin_out, radius, start_angle, range_angle, F_PT_LEFT );

    // 幾何変換ライブラリの fnFIE_geotrans_warpping() を使用して画像にする
    fnFIE_geotrans_warpping( hsrc, hmap, hdst, NULL, FALSE, F_SAMPLING_CUBIC );

    fnFIE_save_tiff( "fie_poloar_transform_left.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 );

    // F_PT_RIGHT
    // 入力側の対象領域の右下の座標を指定する
    origin_in.x = 250.0;
    origin_in.y = 178.0;

    width = 172.0;
    height = 64.0;

    fnFIE_polar_trans_map( hmap, origin_in, width, height,
                           origin_out, radius, start_angle, range_angle, F_PT_RIGHT );

    // 幾何変換ライブラリの fnFIE_geotrans_warpping() を使用して画像にする
    fnFIE_geotrans_warpping( hsrc, hmap, hdst, NULL, FALSE, F_SAMPLING_CUBIC );

    fnFIE_save_tiff( "fie_poloar_transform_right.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 );

    fnFIE_free_object( hsrc );
    fnFIE_free_object( hdst );
    fnFIE_free_object( hmap );
}

INT main()
{
    // FIEライブラリの初期化処理
    fnFIE_setup();

    polar_transform_map();

    // FIEライブラリの終了処理
    fnFIE_teardown();

    return 0;
}

INT FVALGAPI fnFIE_polar_trans_map_inv ( FHANDLE  hmap,
DPNT_T  origin_in,
DOUBLE  radius,
DOUBLE  start_angle,
DOUBLE  range_angle,
DPNT_T  origin_out,
DOUBLE  width,
DOUBLE  height,
enum f_coord_mode  coord_mode 
)

逆極座標変換マップの作成

逆極座標変換マップを作成します。極座標変換マップは、 fnFIE_geotrans_warpping で利用されます。

全般

  • 画素タイプが F_IMG_DOUBLE または F_IMG_FLOAT 、チャネル数が2の画像オブジェクトを指定します。 マップ画像の各画素値は結果画像の変換前の座標値として使用されますので、 結果画像の変換前の x 座標を hmap のチャネル0、 y 座標はチャネル1に入力します。
  • fnFIE_geotrans_warpping 実行時において、 hmap に入力されている座標値が処理対象画像の外側を示す場合は、無効画素として処理されます。 また、処理対象画像のチャネル数が複数である場合には、 すべてのチャネルに同じ座標変換マップを使用します。
  • 本関数内で、出力画像のメモリ確保は行いません。 ユーザーが必要なメモリを確保した画像オブジェクトを用意する必要があります。
origin_in
  • 原点 $O\left(0,0\right)$ からの回転中心座標を指定します。
radius
  • 扇形の半径を指定します。
  • radius ≧ 0 の範囲で指定します。
start_angle
  • 回転開始角度をラジアン単位で指定します。
  • 0 ≦ start_angle$2\pi$ の範囲で指定します。
range_angle
  • 回転開始角度 start_angle からの処理範囲をラジアン単位で指定します。範囲の大きさに指定はありませんが、以下のように処理されます。
    1. range_angle が正ならば時計回り、負ならば反時計回りとして処理をします。
    2. range_angle$2\pi$ の範囲で指定した場合、$2\pi$ を超えた分の範囲が繰り返し出力されます。 range_angle$-2\pi$ の場合も同様に、$-2\pi$ を下回った分の範囲が繰り返し出力されます。
origin_out
  • coord_mode で指定されたパラメータに基づいて、 出力画像での処理対象領域(四角形)の基準座標を指定します。
  • 指定する座標は、出力画像外でも構いません。
width
  • origin_out で指定された座標からの処理対象領域の幅を指定します。
  • width ≧ 0 の範囲で指定します。
  • width$\theta$ 軸と対応している場合、 y = ( origin_in.y + height ) 軸上での width は、 出力画像での扇形の円弧の長さと対応します。円弧の長さは、 width と | radius * range_angle | の比によって決定します。
  • width が r 軸と対応している場合、 r の長さは、 widthradius の比によって決定します。
height
  • origin_out で指定された座標からの処理対象領域の高さを指定します。
  • height ≧ 0 の範囲で指定します。
  • height$\theta$ 軸と対応している場合、 x = ( origin_in.x + width ) 軸上での height は、 出力画像での円弧の長さと対応します。円弧の長さは、 height と | radius * range_angle | の比によって決定します。
  • height が r 軸と対応している場合、 r の長さは、 heightradius の比によって決定します。
coord_mode
  • 出力側の回転軸の位置を指定します。
    • F_PT_UPPER 上辺が回転軸
    • F_PT_LOWER 下辺が回転軸
    • F_PT_LEFT 左辺が回転軸
    • F_PT_RIGHT 右辺が回転軸

引数:
[out] hmap 変換マップ( type : double, float / channel : 2 )
[in] origin_in 入力側での処理対象領域の開始座標
[in] radius 入力側での円板の半径
[in] start_angle 入力側での処理開始角度
[in] range_angle 入力側での角度の処理範囲
[in] origin_out 出力側での円板の回転中心
[in] width 出力側での処理対象領域の幅
[in] height 出力側での処理対象領域の高さ
[in] coord_mode 出力側での回転中心位置
  • F_PT_UPPER 処理対象領域の右上座標
  • F_PT_LOWER 処理対象領域の左下座標
  • F_PT_LEFT 処理対象領域の左上座標
  • F_PT_RIGHT 処理対象領域の右下座標
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM 不正なパラメータが渡された
F_ERR_INVALID_IMAGE 不正な画像オブジェクトが渡された
F_ERR_NOMEMORY メモリ不足
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
極座標変換ライブラリの使用例
Fig1に、 coord_mode の指定例を示します。 本例は、右図から左図への変換です。
  • 左図のオレンジの線で囲まれている領域が、 coord_mode 毎の処理対象領域です。
  • 左図の緑色のx印は、基準座標の位置です。 coord_mode 毎に指定する位置が異なります。
  • 右図の赤線が start_angle で指定された角度です。本図では、 0.0 が指定されています。
  • range_angle は、 $2\pi$ が指定されています。
polar_transform_ref.png

Fig1. 極座標変換ライブラリの使用例

// エラー処理は省略しているので注意して下さい。
#include "fie.h"

// 右図から左図への変換
VOID polar_transform_map_inv()
{
    FHANDLE hsrc = NULL, hdst = NULL, hmap = NULL;
    DPNT_T  origin_in, origin_out;
    DOUBLE  width, height, radius, start_angle, range_angle;

    // 入力画像の読み込み
    // width = 128.0, height = 128.0
    fnFIE_load_tiff( "fie_poloar_transform_inv.tif", &hsrc, F_COLOR_IMG_TYPE_UC8 );

    // 座標マップと出力画像のメモリ確保
    // チャネル数は同じ必要がある
    hdst = fnFIE_img_root_alloc( F_IMG_UC8, 1, 256, 256 );
    hmap = fnFIE_img_root_alloc( F_IMG_DOUBLE, 2, 256, 256 );

    origin_in.x = 64.0;
    origin_in.y = 64.0;

    radius = 64.0;

    start_angle = 0.0;
    range_angle = 2.0 * PI;

    // F_PT_UPPER
    // 出力側の対象領域の右上の座標を指定する
    origin_out.x = 178.0;
    origin_out.y = 6.0;

    width = 64.0;
    height = 172.0;

    fnFIE_polar_trans_map_inv( hmap, origin_in, radius, start_angle, range_angle,
                               origin_out, width, height, F_PT_UPPER );

    // 幾何変換ライブラリの fnFIE_geotrans_warpping() を使用して画像にする
    fnFIE_geotrans_warpping( hsrc, hmap, hdst, NULL, FALSE, F_SAMPLING_CUBIC );

    fnFIE_save_tiff( "fie_poloar_transform_inv_upper.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 );

    // F_PT_LOWER
    // 出力側の対象領域の左下の座標を指定する
    origin_out.x = 78.0;
    origin_out.y = 250.0;

    width = 64.0;
    height = 172.0;

    fnFIE_polar_trans_map_inv( hmap, origin_in, radius, start_angle, range_angle,
                               origin_out, width, height, F_PT_LOWER );

    // 幾何変換ライブラリの fnFIE_geotrans_warpping() を使用して画像にする
    fnFIE_geotrans_warpping( hsrc, hmap, hdst, NULL, FALSE, F_SAMPLING_CUBIC );

    fnFIE_save_tiff( "fie_poloar_transform_inv_lower.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 );

    // F_PT_LEFT
    // 出力側の対象領域の左上の座標を指定する
    origin_out.x = 6.0;
    origin_out.y = 78.0;

    width = 172.0;
    height = 64.0;

    fnFIE_polar_trans_map_inv( hmap, origin_in, radius, start_angle, range_angle,
                               origin_out, width, height, F_PT_LEFT );

    // 幾何変換ライブラリの fnFIE_geotrans_warpping() を使用して画像にする
    fnFIE_geotrans_warpping( hsrc, hmap, hdst, NULL, FALSE, F_SAMPLING_CUBIC );

    fnFIE_save_tiff( "fie_poloar_transform_inv_left.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 );

    // F_PT_RIGHT
    // 出力側の対象領域の右下の座標を指定する
    origin_out.x = 250.0;
    origin_out.y = 178.0;

    width = 172.0;
    height = 64.0;

    fnFIE_polar_trans_map_inv( hmap, origin_in, radius, start_angle, range_angle,
                               origin_out, width, height, F_PT_RIGHT );

    // 幾何変換ライブラリの fnFIE_geotrans_warpping() を使用して画像にする
    fnFIE_geotrans_warpping( hsrc, hmap, hdst, NULL, FALSE, F_SAMPLING_CUBIC );

    fnFIE_save_tiff( "fie_poloar_transform_inv_right.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 );

    fnFIE_free_object( hsrc );
    fnFIE_free_object( hdst );
    fnFIE_free_object( hmap );
}

INT main()
{
    // FIEライブラリの初期化処理
    fnFIE_setup();

    polar_transform_map_inv();

    // FIEライブラリの終了処理
    fnFIE_teardown();

    return 0;
}

INT FVALGAPI fnFIE_polar_trans_pnt ( const DPNT_T psrc,
DPNT_T pdst,
INT  num_pnt,
DPNT_T  origin_in,
DOUBLE  width,
DOUBLE  height,
DPNT_T  origin_out,
DOUBLE  radius,
DOUBLE  start_angle,
DOUBLE  range_angle,
enum f_coord_mode  coord_mode 
)

点群間の極座標変換

点群間の極座標変換をします。

全般

  • 与えられた点群の極座標変換をします。
  • origin_inorigin_out により、変換時の位置情報が決定されます。
  • width, heightradius, start_angle, range_angle により変換時のスケールが決定されます。
  • 本関数内で、出力用の配列のメモリ確保は行いません。 ユーザーが必要なメモリを確保した配列を用意する必要があります。
  • 出力座標群配列は、入力座標群配列と同じか大きい配列を用意する必要があります。 小さい場合の動作は不定です。
  • num_pnt は、入力座標群配列の要素数です。 実際の要素数より大きい値を指定した場合の動作は不定です。
origin_in
  • coord_mode で指定されたパラメータに基づいて、 原点 $O\left(0,0\right)$ からの基準座標を指定します。
width
  • origin_in で指定された座標からの処理対象領域の幅を指定します。
  • width ≧ 0 の範囲で指定します。
  • width$\theta$ 軸と対応している場合、 y = ( origin_in.y + height ) 軸上での width は、 扇形の円弧の長さと対応します。円弧の長さは、 width と | radius * range_angle | の比によって決定します。
  • width が r 軸と対応している場合、 r の長さは、 widthradius の比によって決定します。
height
  • origin_in で指定された座標からの処理対象領域の高さを指定します。
  • height ≧ 0 の範囲で指定します。
  • height$\theta$ 軸と対応している場合、 x = ( origin_in.x + width ) 軸上での height は、 円弧の長さと対応します。円弧の長さは、 height と | radius * range_angle | の比によって決定します。
  • height が r 軸と対応している場合、 r の長さは、 heightradius の比によって決定します。
origin_out
  • 原点 $O\left(0,0\right)$ からの回転中心座標を指定します。
radius
  • 扇形の半径を指定します。
  • radius ≧ 0 の範囲で指定します。
start_angle
  • 回転開始角度をラジアン単位で指定します。
  • 0 ≦ start_angle$2\pi$ の範囲で指定します。
range_angle
  • 回転開始角度 start_angle からの処理範囲をラジアン単位で指定します。範囲に指定はありません。
  • range_angle が正ならば時計回り、負ならば反時計回りとして処理をします。
  • range_angle$2\pi$ または range_angle$-2\pi$ の範囲で指定する事が可能です。 fnFIE_polar_trans_img()では $2\pi$ を超えて表示ができませんが、 この関数は点群を変換の対象としているため $2\pi$ を超えても極座標変換できます。また、異なる入力座標が同じ出力座標になることがあります。 $-2\pi$ も同様に下回っても極座標変換できます。
coord_mode
  • 入力側の回転軸の位置を指定します。
    • F_PT_UPPER 上辺が回転軸
    • F_PT_LOWER 下辺が回転軸
    • F_PT_LEFT 左辺が回転軸
    • F_PT_RIGHT 右辺が回転軸

引数:
[in] psrc 入力座標群配列の先頭ポインタ
[out] pdst 出力座標群配列の先頭ポインタ
[in] num_pnt 座標数
[in] origin_in 入力側での処理対象領域の開始座標
[in] width 入力側での処理対象領域の幅
[in] height 入力側での処理対象領域の高さ
[in] origin_out 出力側での円板の回転中心
[in] radius 出力側での円板の半径
[in] start_angle 出力側での処理開始角度
[in] range_angle 出力側での角度の処理範囲
[in] coord_mode 入力側での回転中心位置
  • F_PT_UPPER 処理対象領域の右上座標
  • F_PT_LOWER 処理対象領域の左下座標
  • F_PT_LEFT 処理対象領域の左上座標
  • F_PT_RIGHT 処理対象領域の右下座標
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM 不正なパラメータが渡された
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
極座標変換ライブラリの使用例
Fig1に、 coord_mode の指定例を示します。 本例は、左図から右図への変換です。
  • 左図のオレンジの線で囲まれている領域が、 coord_mode 毎の処理対象領域です。
  • 左図の緑色のx印は、基準座標の位置です。 coord_mode 毎に指定する位置が異なります。
  • 右図の赤線が start_angle で指定された角度です。本図では、 0.0 が指定されています。
  • range_angle は、 $2\pi$ が指定されています。
polar_transform_ref.png

Fig1. 極座標変換ライブラリの使用例

// エラー処理は省略しているので注意して下さい。
#include "oal_aloc.h"
#include "fie.h"

// 左図から右図への変換
VOID polar_transform_pnt()
{
    DPNT_T *psrc = NULL, *pdst = NULL;
    DPNT_T  origin_in, origin_out;
    DOUBLE  width, height, radius, start_angle, range_angle;
    F_RANDDESC r;
    INT i;

    // メモリの確保
    psrc = (DPNT_T*) fnOAL_malloc( sizeof( DPNT_T ) * 100 );
    pdst = (DPNT_T*) fnOAL_malloc( sizeof( DPNT_T ) * 100 );

    fnFIE_mtrand_init( 234796, &r );

    // 入力点群に適当な値を代入する
    for( i = 0; i < 100; i ++ ){
        psrc[i].x = fnFIE_mtrand_real1(&r) * 1024.0;
        psrc[i].y = fnFIE_mtrand_real1(&r) * 1024.0;
    }

    origin_out.x = 64.0;
    origin_out.y = 64.0;

    radius = 64.0;

    start_angle = 0.0;
    range_angle = 2.0 * PI;

    // F_PT_UPPER
    // 入力側の対象領域の右上の座標を指定する
    origin_in.x = 178.0;
    origin_in.y = 6.0;

    width = 64.0;
    height = 172.0;

    fnFIE_polar_trans_pnt( psrc, pdst, 100, origin_in, width, height,
                           origin_out, radius, start_angle, range_angle, F_PT_UPPER );

    // F_PT_LOWER
    // 入力側の対象領域の左下の座標を指定する
    origin_in.x = 78.0;
    origin_in.y = 250.0;

    width = 64.0;
    height = 172.0;

    fnFIE_polar_trans_pnt( psrc, pdst, 100, origin_in, width, height,
                           origin_out, radius, start_angle, range_angle, F_PT_LOWER );

    // F_PT_LEFT
    // 入力側の対象領域の左上の座標を指定する
    origin_in.x = 6.0;
    origin_in.y = 78.0;

    width = 172.0;
    height = 64.0;

    fnFIE_polar_trans_pnt( psrc, pdst, 100, origin_in, width, height,
                           origin_out, radius, start_angle, range_angle, F_PT_LEFT );

    // F_PT_RIGHT
    // 入力側の対象領域の右下の座標を指定する
    origin_in.x = 250.0;
    origin_in.y = 178.0;

    width = 172.0;
    height = 64.0;

    fnFIE_polar_trans_pnt( psrc, pdst, 100, origin_in, width, height,
                           origin_out, radius, start_angle, range_angle, F_PT_RIGHT );

    fnOAL_free( psrc );
    fnOAL_free( pdst );
}

INT main()
{
    // FIEライブラリの初期化処理
    fnFIE_setup();

    polar_transform_pnt();

    // FIEライブラリの終了処理
    fnFIE_teardown();

    return 0;
}

INT FVALGAPI fnFIE_polar_trans_pnt_inv ( const DPNT_T psrc,
DPNT_T pdst,
INT  num_pnt,
DPNT_T  origin_in,
DOUBLE  radius,
DOUBLE  start_angle,
DOUBLE  range_angle,
DPNT_T  origin_out,
DOUBLE  width,
DOUBLE  height,
enum f_coord_mode  coord_mode 
)

点群間の逆極座標変換

点群間の逆極座標変換をします。

  • 与えられた点群の逆極座標変換をします。
  • origin_inorigin_out により、変換時の位置情報が決定されます。
  • width, heightradius, start_angle, range_angle により変換時のスケールが決定されます。
  • 本関数内で、出力用の配列のメモリ確保は行いません。 ユーザーが必要なメモリを確保した配列を用意する必要があります。
  • 出力座標群配列は、入力座標群配列と同じか大きい配列を用意する必要があります。 小さい場合の動作は不定です。
  • num_pnt は、入力座標群配列の要素数です。 実際の要素数より大きい値を指定した場合の動作は不定です。
origin_in
  • 原点 $O\left(0,0\right)$ からの回転中心座標を指定します。
radius
  • 扇形の半径を指定します。
  • radius ≧ 0 の範囲で指定します。
start_angle
  • 回転開始角度をラジアン単位で指定します。
  • 0 ≦ start_angle < $2\pi$ の範囲で指定します。
range_angle
  • 回転開始角度 start_angle からの処理範囲をラジアン単位で指定します。範囲に指定はありません。
  • range_angle が正ならば時計回り、負ならば反時計回りとして処理をします。
  • range_angle$2\pi$ または range_angle$-2\pi$ の範囲で指定する事が可能です。 fnFIE_polar_trans_img_inv()では $2\pi$ を超えるまたは $-2\pi$ を下回った場合は繰り返し表示されますが、 この関数では点群を変換の対象としているため、対応座標が1対1の関係になり、1つの入力座標が2つ以上の出力座標と対応することはありません。
origin_out
  • coord_mode で指定されたパラメータに基づいて、 原点 $O\left(0,0\right)$ からの基準座標を指定します。
width
  • origin_out で指定された座標からの処理対象領域の幅を指定します。
  • width ≧ 0 の範囲で指定します。
  • width$\theta$ 軸と対応している場合、 y = ( origin_in.y + height ) 軸上での width は、 扇形の円弧の長さと対応します。円弧の長さは、 width と | radius * range_angle | の比によって決定します。
  • width が r 軸と対応している場合、 r の長さは、 widthradius の比によって決定します。
height
  • origin_out で指定された座標からの処理対象領域の高さを指定します。
  • height ≧ 0 の範囲で指定します。
  • height$\theta$ 軸と対応している場合、 x = ( origin_in.x + width ) 軸上での height は、 円弧の長さと対応します。円弧の長さは、 height と | radius * range_angle | の比によって決定します。
  • height が r 軸と対応している場合、 r の長さは、 heightradius の比によって決定します。
coord_mode
  • 出力側の回転軸の位置を指定します。
    • F_PT_UPPER 上辺が回転軸
    • F_PT_LOWER 下辺が回転軸
    • F_PT_LEFT 左辺が回転軸
    • F_PT_RIGHT 右辺が回転軸

引数:
[in] psrc 入力座標群配列の先頭ポインタ
[out] pdst 出力座標群配列の先頭ポインタ
[in] num_pnt 座標数
[in] origin_in 入力側での処理対象領域の開始座標
[in] radius 入力側での円板の半径
[in] start_angle 入力側での処理開始角度
[in] range_angle 入力側での角度の処理範囲
[in] origin_out 出力側での円板の回転中心
[in] width 出力側での処理対象領域の幅
[in] height 出力側での処理対象領域の高さ
[in] coord_mode 出力側での回転中心位置
  • F_PT_UPPER 処理対象領域の右上座標
  • F_PT_LOWER 処理対象領域の左下座標
  • F_PT_LEFT 処理対象領域の左上座標
  • F_PT_RIGHT 処理対象領域の右下座標
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM 不正なパラメータが渡された
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
極座標変換ライブラリの使用例
Fig1に、 coord_mode の指定例を示します。 本例は、右図から左図への変換です。
  • 左図のオレンジの線で囲まれている領域が、 coord_mode 毎の処理対象領域です。
  • 左図の緑色のx印は、基準座標の位置です。 coord_mode 毎に指定する位置が異なります。
  • 右図の赤線が start_angle で指定された角度です。本図では、 0.0 が指定されています。
  • range_angle は、 $2\pi$ が指定されています。
polar_transform_ref.png

Fig1. 極座標変換ライブラリの使用例

// エラー処理は省略しているので注意して下さい。
#include "oal_aloc.h"
#include "fie.h"

// 右図から左図への変換
VOID polar_transform_pnt_inv()
{
    DPNT_T *psrc = NULL, *pdst = NULL;
    DPNT_T  origin_in, origin_out;
    DOUBLE  width, height, radius, start_angle, range_angle;
    F_RANDDESC r;
    INT i;

    // メモリの確保
    psrc = (DPNT_T*) fnOAL_malloc( sizeof( DPNT_T ) * 100 );
    pdst = (DPNT_T*) fnOAL_malloc( sizeof( DPNT_T ) * 100 );

    fnFIE_mtrand_init( 234796, &r );

    // 入力点群に適当な値を代入する
    for( i = 0; i < 100; i ++ ){
        psrc[i].x = fnFIE_mtrand_real1(&r) * 1024.0;
        psrc[i].y = fnFIE_mtrand_real1(&r) * 1024.0;
    }

    origin_in.x = 64.0;
    origin_in.y = 64.0;

    radius = 64.0;

    start_angle = 0.0;
    range_angle = 2.0 * PI;

    // F_PT_UPPER
    // 出力側の対象領域の右上の座標を指定する
    origin_out.x = 178.0;
    origin_out.y = 6.0;

    width = 64.0;
    height = 172.0;

    fnFIE_polar_trans_pnt_inv( psrc, pdst, 100, origin_in, radius, start_angle, range_angle,
                               origin_out, width, height, F_PT_UPPER );

    // F_PT_LOWER
    // 出力側の対象領域の左下の座標を指定する
    origin_out.x = 78.0;
    origin_out.y = 250.0;

    width = 64.0;
    height = 172.0;

    fnFIE_polar_trans_pnt_inv( psrc, pdst, 100, origin_in, radius, start_angle, range_angle,
                               origin_out, width, height, F_PT_LOWER );

    // F_PT_LEFT
    // 出力側の対象領域の左上の座標を指定する
    origin_out.x = 6.0;
    origin_out.y = 78.0;

    width = 172.0;
    height = 64.0;

    fnFIE_polar_trans_pnt_inv( psrc, pdst, 100, origin_in, radius, start_angle, range_angle,
                               origin_out, width, height, F_PT_LEFT );

    // F_PT_RIGHT
    // 出力側の対象領域の右下の座標を指定する
    origin_out.x = 250.0;
    origin_out.y = 178.0;

    width = 172.0;
    height = 64.0;

    fnFIE_polar_trans_pnt_inv( psrc, pdst, 100, origin_in, radius, start_angle, range_angle,
                               origin_out, width, height, F_PT_RIGHT );

    fnOAL_free( psrc );
    fnOAL_free( pdst );
}

INT main()
{
    // FIEライブラリの初期化処理
    fnFIE_setup();

    polar_transform_pnt_inv();

    // FIEライブラリの終了処理
    fnFIE_teardown();

    return 0;
}


Documentation copyright © 2009-2024 FAST Corporation.
Generated on Fri Aug 9 16:38:46 2024 for FIEライブラリ by doxygen 1.5.6-FASTSP-p2