幾何変換
[基本画像操作]


説明

画像の幾何変換を行うライブラリです。 同次変換行列の計算および幾何図形の変換に関しては 幾何変換ページ を、 リージョンの幾何変換に関しては リージョンの幾何変換ページ を、 それぞれご参照ください。

有効画素マスク画像

FIEの幾何変換関数(射影変換、アフィン変換、平行移動、warpping)では、出力画像での無効領域を 判定するためのマスク画像を作成することが出来ます。マスク画像は、有効画素が1、無効画素が0 となる2値画像で出力されます。

fie_geotrans_mask.png

有効画素マスク画像の例(アフィン変換での例)

濃度補間方法

FIEの幾何変換関数(射影変換、アフィン変換、平行移動、warpping)には濃度補間方法が6種類有ります。 幾何変換関数によって、利用できる補間手法に制限があり、利用可能な組合せは下表の通りです。

 アフィン変換射影変換平行移動warpping
F_SAMPLING_NN
F_SAMPLING_BILINEAR
F_SAMPLING_CUBIC
F_SAMPLING_LANCZOS×××
F_SAMPLING_SUPER×××
F_SAMPLING_ADAPT×××

但し、処理対象の画像が2値画像(F_IMG_BIN)の場合は、F_SAMPLING_NNのみ利用可能です。

これら6手法のうち、NN, BILINEAR, CUBIC の3手法は、1≦拡大率 の場合に適した手法です。 1>拡大率 になる変換、つまり縮小をするときには、これらの手法はエイリアシング(aliasing)現像 を起こします。このエイリアシング(aliasing)現像を抑制するため、LANCZOS, SUPER, ADAPT の3種類のアンチエイリアシング(antialiasing)手法を用意しています。 これらの手法は処理時間がかかりますが、美しい結果画像を得ることが出来ます。

fie_geotrans_aliasing.png

各補間法によるエイリアシングの違い(1/3に縮小した例)

但し、LANCZOS, SUPER, ADAPTの3手法では、計算時間の爆発を避けるため、適応できる 最大の縦横方向縮小比率を5分の1に設定しています。それ以上に縮小した場合には、 エイリアジングが出てきます。なお、これらのアンチエイリアシング手法(LANCZOS,SUPER,ADAPT) を拡大処理の場合に使用しても問題は有りませんが、処理時間が長くなるため NN,BILINEAR,CUBIC を使用することをおすすめします。

F_SAMPLING_NN : 最近傍法
最近傍法は、各補間法の中で最も高速ですが、最も精度が低い方法です。 濃度値は(x,y)を単純に丸めた座標( (INT)(x+0.5), (INT)(y+0.5) ) の濃度値が使用されます。
F_SAMPLING_BILINEAR : 共一次線形補間法
共一次線形補間法は、最近傍法よりは低速で、精度の良い方法です。 一方、三次畳み込み法よりは高速で、精度は低くなります。 この方法では、(x,y) の周囲4点の濃度値D(u,v), D(u+1,v), D(u,v+1), D(u+1,v+1)を使用して、 次の式で濃度値を決定します。

\[ D(x,y) = \left[ (v+1)-y, y-v \right] \left[\begin{array}{cc} D(u,v) & D(u+1,v) \\ D(u,v+1) & D(u+1,v+1) \end{array}\right] \left[\begin{array}{c} (u+1) - x \\ x - u \end{array}\right] \]

fie_geotrans_interpolation-biliner.png

F_SAMPLING_CUBIC : 三次畳み込み法
三次畳み込み法は共一次線形補間法より低速で、精度の良い方法です。 この方法では、(x,y) の周囲16点の濃度値を使用して、次の式で濃度値を決定します。

\[ D(x,y) = \left[\begin{array}{c} f((v-1)-y) \\ f(v-y) \\ f((v+1)-y) \\ f((v+2)-y) \end{array}\right]^T \left[\begin{array}{cccc} D(u-1,v-1) & D(u,v-1) & D(u+1,v-1) & D(u+2,v-1) \\ D(u-1,v) & D(u,v) & D(u+1,v) & D(u+2,v) \\ D(u-1,v+1) & D(u,v-1) & D(u+1,v+1) & D(u+2,v+1) \\ D(u-1,v+2) & D(u,v-1) & D(u+1,v+2) & D(u+2,v+2) \end{array}\right] \left[\begin{array}{c} f((u-1)-x) \\ f(u-x) \\ f((u+1)-x) \\ f((u+2)-x) \end{array}\right] \]

\[ f(t) = \left\{ \begin{array}{ll} \dfrac{3|t|^3-5|t|^2+2}{2} & (0 \le t<1) \vspace{.5em} \\ \dfrac{-|t|^3+5|t|^2-8|t|+4}{2} & (1 \le t<2) \vspace{.5em} \\ 0 & (2 \le t) \vspace{.5em} \\ \end{array} \right. \]

fie_geotrans_interpolation-cubic.png

なお、3次畳み込み法の重み関数は次の文献に従っています。 Lehmann T. M., Gonner C. and Spitzer Klaus, "Survey: Interpolation Methods in Medical Image Processing", IEEE on Medical Imaging, 1999, Vol. 18, No.11, pp. 1063 with N = 4, a = -0.5
F_SAMPLING_LANCZOS : Lanczos-windowed Sinc functionを使用した濃度補間法
Lanczos法はLanczos-windowed Sinc函数を使って、補間係数を計算します。 畳み込みを行うウインドウサイズは縮小比率より自動的に決定されます。

\[ f(t) = \left\{ \begin{array}{ll} \dfrac{\sin(\pi t)}{\pi t}\dfrac{\sin(\pi \dfrac{t}{2})}{\pi \dfrac{t}{2} } & (|t| < 2) \vspace{.5em} \\ 0 & (2 \le |t|) \vspace{.5em} \\ \end{array} \right. \]

F_SAMPLING_SUPER : Super-sampling法
Super-sampling法は変換する時に各ピクセルをさらに細かいサブピクセルに分解して、それぞれ のサブピクセルの明るさの平均値をピクセル値として適用する方法です。 平均値を取るサブピクセル数は縮小比率によって内部で自動的に決定します。
F_SAMPLING_ADAPT : Adaptive Super-sampling法
Adaptive Super-sampling法はSuper-sampling法とほぼ同じですが、Super-sampling法が 縮小率を画像全体で一意に決定するのに対して、Adaptive Super-sampling法は各画素ごとに 縮小率を計算し、サンプル数を適応的に決定する点が異なります。 但し、対象画素の縮小率が1.5以下となる場合には、共一次線形補間法をその画素に対して使用します。
注意:
F_SAMPLING_NN以外の各補間手法では近傍画素をウィンドウをはって取得するため、 入力画像での有効領域が画像のサイズよりも小さくなります。 そのため画像の周囲部分が欠けますので、周囲部分が欠けると問題がある場合は、 あらかじめ fnFIE_copy_border() 等を使用して入力画像を拡張しておいて下さい。


関数

INT FVALGAPI fnFIE_geotrans_get_offset_matrix (const FMATRIX *vpTransMat, FMATRIX *vpOffsetMat, DOUBLE dSrcOffX, DOUBLE dSrcOffY, DOUBLE dDstOffX, DOUBLE dDstOffY)
 同次変換行列に入力座標系/出力座標系のオフセットを加える
INT FVALGAPI fnFIE_geotrans_affine (FHANDLE hSrc, FHANDLE hDst, FHANDLE hMask, const FMATRIX *vpMat, INT bIsClearBack, INT iSamplingMode)
 画像のアフィン変換
INT FVALGAPI fnFIE_geotrans_perspective (FHANDLE hSrc, FHANDLE hDst, FHANDLE hMask, const FMATRIX *vpMat, INT bIsClearBack, INT iSamplingMode)
 画像の射影変換
INT FVALGAPI fnFIE_geotrans_warpping (FHANDLE hSrc, FHANDLE hMap, FHANDLE hDst, FHANDLE hMask, INT bIsClearBack, INT iSamplingMode)
 座標変換マップに従って座標を変換する
INT FVALGAPI fnFIE_geotrans_shift (FHANDLE hSrc, FHANDLE hDst, FHANDLE hMask, DOUBLE dX, DOUBLE dY, INT bIsClearBack, INT iSamplingMode)
 画像の平行移動
INT FVALGAPI fnFIE_img_mirror (FHANDLE hsrc, FHANDLE hdst, INT direc)
 画像ミラー反転
INT FVALGAPI fnFIE_img_resize (FHANDLE hsrc, FHANDLE hdst)
 画像のリサイズ
INT FVALGAPI fnFIE_img_transpose (FHANDLE hsrc, FHANDLE hdst)
 画像転置
INT FVALGAPI fnFIE_img_rotate_clockwise90 (FHANDLE hsrc, FHANDLE hdst, INT n)
 画像の回転(90度の倍数)

関数

INT FVALGAPI fnFIE_geotrans_get_offset_matrix ( const FMATRIX vpTransMat,
FMATRIX vpOffsetMat,
DOUBLE  dSrcOffX,
DOUBLE  dSrcOffY,
DOUBLE  dDstOffX,
DOUBLE  dDstOffY 
)

同次変換行列に入力座標系/出力座標系のオフセットを加える

入力された同次変換行列Mに対して、入力側座標系の原点のオフセット( $\delta u, \delta v$ )と 出力側座標系の原点オフセット( $\delta x, \delta y$ ) を加えた新たな同次変換行列 $M'$ を計算します。本関数はチャイルド画像を処理する場合などで、画像の左上画素の座標が(0,0)に なっていない場合にその原点位置を指定するために使います。

fie_geotrans_offsets_matrix.png

新たな幾何変換行列 $M'$ は下記のように算出します。 $M$ の(i,j)成分を $m_{ij}$$M'$ の(i,j)成分を $m'_{ij}$ と書くとすると、

\begin{eqnarray*} dS & = & m_{20} \delta u + m_{21} \delta v + m_{22} \\ M' & = & M + \left(\begin{array}{ccc} -m_{20}\delta x & -m_{21}\delta x & m_{00} \delta u + m_{01} \delta v - dS \delta x \\ -m_{20}\delta y & -m_{21}\delta y & m_{00} \delta u + m_{11} \delta v - dS \delta y \\ 0 & 0 & m_{20} \delta u + m_{21} \delta v \end{array}\right) \end{eqnarray*}

各成分ごとに書くと、下記のようになります。

	dS = M[2][2] + M[2][0] * dSrcOffX + M[2][1] * dSrcOffY

	M'[0][0] = M[0][0] - M[2][0] * dDstOffX
	M'[0][1] = M[0][1] - M[2][1] * dDstOffX
	M'[0][2] = M[0][2] + M[0][0] * dSrcOffX + M[0][1] * dSrcOffY - dS * dDstOffX

	M'[1][0] = M[1][0] - M[2][0] * dDstOffY
	M'[1][1] = M[1][1] - M[2][1] * dDstOffY
	M'[1][2] = M[1][2] + M[1][0] * dSrcOffX + M[1][1] * dSrcOffY - dS * dDstOffY

	M'[2][0] = M[2][0]
	M'[2][1] = M[2][1]
	M'[2][2] = S

画像の左上点の偏移量の定義は上記の図を参考にして下さい。

入力同次変換行列 vpTransMat (図中の変換行列 $M$ )と出力同次変換行列 vpOffsetMat (図中の変換行列 $M'$ )は 3x3の正方行列です。

引数:
[in] vpTransMat 画像幾何変換の同次変換行列
[out] vpOffsetMat 偏移量を含めたの幾何変換の同次変換行列
[in] dSrcOffX 元画像の横方向の偏移量
[in] dSrcOffY 元画像の縦方向の偏移量
[in] dDstOffX 結果画像の横方向の偏移量
[in] dDstOffY 結果画像の縦方向の偏移量
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM 入力行列或いは出力行列は3x3の正方行列ではない
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_geotrans_affine ( FHANDLE  hSrc,
FHANDLE  hDst,
FHANDLE  hMask,
const FMATRIX vpMat,
INT  bIsClearBack,
INT  iSamplingMode 
)

画像のアフィン変換

処理対象画像を、幾何変換の同次変換行列 vpMat に従ってアフィン変換します。 処理対象画像と結果画像のサイズは異なっていても構いません。 但し、処理対象画像と結果画像の型とチャネル数は同じでなければいけません。

本関数は vpMat に従って下記の座標変換を行い、結果画像を作成します。

	dst.x = src.x * vpMat->m[0][0] + src.y * vpMat->m[0][1] + vpMat->m[0][2]
	dst.y = src.x * vpMat->m[1][0] + src.y * vpMat->m[1][1] + vpMat->m[1][2]
	

vpMat は座標変換に使用する同次変換行列で、3x3の正方行列を指定します。 vpMat は下記の条件を満たしていなければいけません。

  • vpMat の逆行列が計算できること。
  • vpMat->m[2][0] == 0
  • vpMat->m[2][1] == 0
  • vpMat->m[2][2] == 1
vpMat の意味や作成法については 同次変換行列 を併せてご参照ください。

hMask に処理結果画像と同じサイズの2値画像を指定すると、出力画像中の有効画素を示す マスク画像を作成します。(マスク画像については 有効画素マスク画像 を参照して下さい) マスク画像 hMask の型はF_IMG_BINではなければいけません。 また、マスク画像の縦横サイズは結果画像と同じで、チャネル数は1でなければなりません。 これらの条件が満たされない場合は、F_ERR_INVALID_IMAGEを返します。 マスク画像が必要ない場合は hMask にNULLを指定して下さい。

bIsClear は結果画像中の領域外になる画素(入力座標系での座標が処理対象画像の外側になる画素) の処理方法の指定です。領域外の画素の濃度値を0クリアする場合は bIsClear にTRUE を指定します。 結果画像の元の濃度値を維持する場合は、 FALSE を指定します。

iSamplingMode は濃度補間方法の指定です。以下の5種類から選択できます。

  • F_SAMPLING_NN 最近傍法により濃度補間を行う
  • F_SAMPLING_BILINEAR 共一次線形補間により濃度補間を行う
  • F_SAMPLING_CUBIC 三次畳み込み法により濃度補間を行う
  • F_SAMPLING_LANCZOS Lanczos-windowed Sinc function法により濃度補間を行う
  • F_SAMPLING_SUPER super-sampling 法により濃度補間を行う
但し、処理対象画像の型が 2値(F_IMG_BIN) の場合は、F_SAMPLING_NN のみ使用可能です。 各濃度補間方法の違いについては、濃度補間方法 を参照して下さい。

引数:
[in] hSrc 処理対象画像( type: bin, uc8, us16, double, rgbq, rgbtri, s16, float )
[out] hDst 処理結果画像( type: bin, uc8, us16, double, rgbq, rgbtri, s16, float )
[out] hMask 処理結果画像の有効画素マスク画像( type: bin )
画像サイズは hDst と同じ、チャネル数1であること。
マスク画像が不要な場合はNULLを指定する。
[in] vpMat アフィン変換の同次変換行列
[in] bIsClearBack 処理対象画像の領域外になる画素の処理方法
  • TRUE 領域外になる画素は0クリア
  • FALSE 領域外になる画素は処理しない
[in] iSamplingMode 濃度補間方法
  • F_SAMPLING_NN 最近傍法により濃度補間を行う
  • F_SAMPLING_BILINEAR 共一次線形補間により濃度補間を行う
  • F_SAMPLING_CUBIC 三次畳み込み法により濃度補間を行う
  • F_SAMPLING_LANCZOS Lanczos-windowed Sinc function法により濃度補間を行う
  • F_SAMPLING_SUPER super-sampling 法により濃度補間を行う
戻り値:
F_ERR_NONE 正常終了
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_INVALID_IMAGE 不正な画像オブジェクトが入力された
F_ERR_CALC_IMPOSSIBLE 変換行列の逆行列が計算不可能
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_geotrans_affine_point() , fnFIE_geotrans_affine_npoints() , fnFIE_geotrans_affine_line() , fnFIE_geotrans_affine_lineseg()
使用例:
// エラー処理は省略しているので注意して下さい。
#include "fie.h"
#include "oal_aloc.h"   //メモリ管理

VOID geotrans_affine()
{
    FHANDLE hsrc = NULL;    //入力画像
    FHANDLE hdst = NULL;    //出力画像
    INT width,height;       //幅、高さ

    FMATRIX* pmat;          //アフィン変換行列
    DPNT_T from[10],to[10]; //対応点

    //入力画像の読み込み
    fnFIE_load_png("fvc06.png", &hsrc, F_COLOR_IMG_TYPE_UC8);

    //幅と高さの取得
    width  = fnFIE_img_get_width(hsrc);
    height = fnFIE_img_get_height(hsrc);

    //出力画像の領域を確保
    hdst = fnFIE_img_root_alloc(F_IMG_UC8, 1, width, height);

    // 3×3の行列を設定します。
    pmat = fnFIE_mat_aalloc( 3, 3 );

    // アフィン変換は同一直線上にない3組以上の座標列を設定します。
    // 変換前の座標を設定します。
    from[0].x = 0;     from[0].y = 0;
    from[1].x = 10;    from[1].y = 20;
    from[2].x = 50;    from[2].y = 50;
    from[3].x = 130;   from[3].y = 100;
    from[4].x = 150;   from[4].y = 130;
    from[5].x = 180;   from[5].y = 140;
    from[6].x = 200;   from[6].y = 150;
    from[7].x = 230;   from[7].y = 170;
    from[8].x = 240;   from[8].y = 180;
    from[9].x = 256;   from[9].y = 192;

    // 変換後の座標を設定します。
    to[0].x = 20;   to[0].y = 30;
    to[1].x = 40;   to[1].y = 60;
    to[2].x = 80;   to[2].y = 80;
    to[3].x = 100;  to[3].y = 90;
    to[4].x = 110;  to[4].y = 100;
    to[5].x = 130;  to[5].y = 110;
    to[6].x = 150;  to[6].y = 120;
    to[7].x = 170;  to[7].y = 130;
    to[8].x = 140;  to[8].y = 130;
    to[9].x = 150;  to[9].y = 150;

    // アフィン変換行列を求めます。
    fnFIE_geotrans_estimate_affine_matrix( pmat, from, to, 10 );

    // 求めたアフィン変換行列より、画像のアフィン変換を行います。
    // 三次畳み込み法により濃度補間で、結果画像を生成します。
    // マスク画像は生成しません。
    // 領域外になる画素は0でクリアします。
    fnFIE_geotrans_affine( hsrc, hdst, NULL, pmat, TRUE, F_SAMPLING_CUBIC );

    // 結果画像をPNG形式のファイルとして保存します。
    fnFIE_save_png( "result.png", hdst, -1 );

    //確保した領域の解放
    fnFIE_mat_afree(pmat);
    fnFIE_free_object(hsrc);
    fnFIE_free_object(hdst);
}

INT main(VOID)
{
    // FIEライブラリの使用前に必ずコールする必要があります。
    fnFIE_setup();

    geotrans_affine();

    // 終了処理
    fnFIE_teardown();

    return 0;
}
処理結果例:
fvc06.png

入力画像

fie_img_geotrans_affine.png

処理結果画像

INT FVALGAPI fnFIE_geotrans_perspective ( FHANDLE  hSrc,
FHANDLE  hDst,
FHANDLE  hMask,
const FMATRIX vpMat,
INT  bIsClearBack,
INT  iSamplingMode 
)

画像の射影変換

処理対象画像を、幾何変換の同次変換行列 vpMat に従って射影変換を行います。 処理対象画像と結果画像のサイズは異なっていても構いません。 但し、処理対象画像と結果画像の型とチャネル数は同じでなければいけません。

本関数は vpMat に従って下記の座標変換を行い、結果画像を作成します。

		sum   = src.x * vpMat->m[2][0] + src.y * vpMat->m[2][1] + vpMat->m[2][2]
		dst.x = ( src.x * vpMat->m[0][0] + src.y * vpMat->m[0][1] + vpMat->m[0][2] ) / sum
		dst.y = ( src.x * vpMat->m[1][0] + src.y * vpMat->m[1][1] + vpMat->m[1][2] ) / sum
	

vpMat は座標変換に使用する同次変換行列で、3x3の正方行列を指定します。 vpMat は下記の条件を満たしていなければいけません。

  • vpMat の逆行列が計算できること。
vpMat の意味や作成法については 同次変換行列 を併せてご参照ください。

hMask に処理結果画像と同じサイズの2値画像を指定すると、出力画像中の有効画素を示す マスク画像を作成します。(マスク画像については 有効画素マスク画像 を参照して下さい) マスク画像 hMask の型はF_IMG_BINではなければいけません。 また、マスク画像の縦横サイズは結果画像と同じで、チャネル数は1でなければなりません。 これらの条件が満たされない場合は、F_ERR_INVALID_IMAGEを返します。 マスク画像が必要ない場合は hMask にNULLを指定して下さい。

bIsClear は結果画像中の領域外になる画素(入力座標系での座標が処理対象画像の外側になる画素) の処理方法の指定です。領域外の画素の濃度値を0クリアする場合は bIsClear にTRUE を指定します。 結果画像の元の濃度値を維持する場合は、 FALSE を指定します。

iSamplingMode は濃度補間方法の指定です。以下の4種類から選択できます。

  • F_SAMPLING_NN 最近傍法により濃度補間を行う
  • F_SAMPLING_BILINEAR 共一次線形補間により濃度補間を行う
  • F_SAMPLING_CUBIC 三次畳み込み法により濃度補間を行う
  • F_SAMPLING_ADAPT Adaptive Supersampling法により濃度補間を行う
但し、処理対象画像の型が 2値(F_IMG_BIN) の場合は、 F_SAMPLING_NN のみ使用可能です。 各濃度補間方法の違いについては 濃度補間方法 を参照して下さい。

引数:
[in] hSrc 処理対象画像( type: bin, uc8, us16, double )
[out] hDst 処理結果画像( type: bin, uc8, us16, double )
[out] hMask 処理結果画像の有効画素マスク画像( type: bin )
画像サイズは hDst と同じ、チャネル数1であること。
マスク画像が不要な場合はNULLを指定する。
[in] vpMat 射影変換の同次変換行列
[in] bIsClearBack 処理対象画像の領域外になる画素の処理方法
  • TRUE 領域外になる画素は0クリア
  • FALSE 領域外になる画素は処理しない
[in] iSamplingMode 濃度補間方法
  • F_SAMPLING_NN 最近傍法により濃度補間を行う
  • F_SAMPLING_BILINEAR 共一次線形補間により濃度補間を行う
  • F_SAMPLING_CUBIC 三次畳み込み法により濃度補間を行う
  • F_SAMPLING_ADAPT Adaptive Super-sampling法により濃度補間を行う
戻り値:
F_ERR_NONE 正常終了
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_INVALID_IMAGE 不正な画像オブジェクトが入力された
F_ERR_CALC_IMPOSSIBLE 変換行列の逆行列が計算不可能
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_geotrans_perspective_point() , fnFIE_geotrans_perspective_npoints() , fnFIE_geotrans_perspective_line() , fnFIE_geotrans_perspective_lineseg()
使用例:
// エラー処理は省略しているので注意して下さい。
#include "fie.h"
#include "oal_aloc.h"   //メモリ管理

VOID geotrans_perspective()
{
    FHANDLE hsrc = NULL;    //入力画像
    FHANDLE hdst = NULL;    //出力画像
    INT width,height;       //幅、高さ

    FMATRIX* pmat;          //射影変換行列
    DPNT_T from[10],to[10]; //対応点

    //入力画像の読み込み
    fnFIE_load_png("fvc06.png", &hsrc, F_COLOR_IMG_TYPE_UC8);

    //幅と高さの取得
    width  = fnFIE_img_get_width(hsrc);
    height = fnFIE_img_get_height(hsrc);

    //出力画像の領域を確保
    hdst = fnFIE_img_root_alloc(F_IMG_UC8, 1, width, height);

    // 3×3の行列を設定します。
    pmat = fnFIE_mat_aalloc( 3, 3 );

    // 射影変換は同一直線上にない4組以上の座標列を設定します。
    // 変換前の座標を設定します。
    from[0].x = 0;     from[0].y = 0;
    from[1].x = 256;   from[1].y = 0;
    from[2].x = 256;   from[2].y = 192;
    from[3].x = 0;     from[3].y = 192;
    from[4].x = 50;    from[4].y = 50;
    from[5].x = 100;   from[5].y = 50;
    from[6].x = 100;   from[6].y = 100;
    from[7].x = 50;    from[7].y = 100;
    from[8].x = 128;   from[8].y = 96;
    from[9].x = 130;   from[9].y = 100;

    // 変換後の座標を設定します。
    to[0].x = 200;   to[0].y = 10;
    to[1].x = 220;   to[1].y = 180;
    to[2].x = 30;    to[2].y = 160;
    to[3].x = 60;    to[3].y = 10;
    to[4].x = 150;   to[4].y = 60;
    to[5].x = 190;   to[5].y = 130;
    to[6].x = 60;    to[6].y = 60;
    to[7].x = 110;   to[7].y = 60;
    to[8].x = 128;   to[8].y = 96;
    to[9].x = 130;   to[9].y = 100;

    // 射影変換行列を求めます。
    fnFIE_geotrans_estimate_perspective_matrix( pmat, from, to, 10 );

    // 求めた射影変換行列より、画像の射影変換を行います。
    // 三次畳み込み法により濃度補間で、結果画像を生成します。
    // マスク画像は生成しません。
    // 領域外になる画素は0でクリアします。
    fnFIE_geotrans_perspective( hsrc, hdst, NULL, pmat, TRUE, F_SAMPLING_CUBIC );

    // 結果画像をPNG形式のファイルとして保存します。
    fnFIE_save_png( "result.png", hdst, -1 );

    //確保した領域の解放
    fnFIE_mat_afree(pmat);
    fnFIE_free_object(hsrc);
    fnFIE_free_object(hdst);
}

INT main(VOID)
{
    // FIEライブラリの使用前に必ずコールする必要があります。
    fnFIE_setup();

    geotrans_perspective();

    // 終了処理
    fnFIE_teardown();

    return 0;
}
処理結果例:
fvc06.png

入力画像

fie_img_geotrans_perspective.png

処理結果画像

INT FVALGAPI fnFIE_geotrans_warpping ( FHANDLE  hSrc,
FHANDLE  hMap,
FHANDLE  hDst,
FHANDLE  hMask,
INT  bIsClearBack,
INT  iSamplingMode 
)

座標変換マップに従って座標を変換する

処理対象画像を、予め作っておいた座標変換マップ hMap に従って座標を変換します。 処理対象画像と結果画像のサイズは異なっていても構いません。 但し、処理対象画像と結果画像の型とチャネル数は同じでなければなりません。

画像 hImg の座標(x,y)の濃度値を hImg(x,y) 、 hMap のi番目のチャネルを hMap[i] と表すと、 出力画像の濃度値は下式のように定義されます。

	hDst(x,y) = hSrc( hMap[0](x,y), hMap[1](x,y) )
	

hMap は座標変換のマップ画像で、縦横サイズは hDst と同じ、 画像型F_IMG_DOUBLEまたはF_IMG_FLOAT、チャネル数2の画像を入力します。 マップ画像の各画素値は結果画像の変換前の座標値として使用されますので、 結果画像の変換前のX座標を hMap のチャネル0、Y座標はチャネル1に入力します。

hMap に入力されている座標値が処理対象画像 hSrc の外側を示す場合は、 無効画素として処理されます。また、処理対象画像のチャネル数が複数である場合には、 すべてのチャネルに同じ座標変換マップを使用します。

hMask に処理結果画像と同じサイズの2値画像を指定すると、出力画像中の有効画素を示す マスク画像を作成します。(マスク画像については 有効画素マスク画像 を参照して下さい) マスク画像 hMask の型はF_IMG_BINではなければいけません。 また、マスク画像の縦横サイズは結果画像と同じで、チャネル数は1でなければなりません。 これらの条件が満たされない場合は、F_ERR_INVALID_IMAGEを返します。 マスク画像が必要ない場合は hMask にNULLを指定して下さい。

bIsClear は結果画像中の領域外になる画素(入力座標系での座標が処理対象画像の外側になる画素) の処理方法の指定です。領域外の画素の濃度値を0クリアする場合は bIsClear にTRUE を指定します。 結果画像の元の濃度値を維持する場合は、 FALSE を指定します。

iSamplingMode は濃度補間方法の指定です。以下の3種類から選択できます。

  • F_SAMPLING_NN 最近傍法により濃度補間を行う
  • F_SAMPLING_BILINEAR 共一次線形補間により濃度補間を行う
  • F_SAMPLING_CUBIC 三次畳み込み法により濃度補間を行う
但し、処理対象画像の型が 2値(F_IMG_BIN) の場合は、F_SAMPLING_NN のみ使用可能です。 各濃度補間方法の違いについては、濃度補間方法 を参照して下さい。

引数:
[in] hSrc 処理対象画像( type: bin, uc8, us16, double )
[in] hMap 座標変換マップ画像( type: double, float )
[out] hDst 処理結果画像( type: bin, uc8, us16, double )
[out] hMask 処理結果画像の有効画素マスク画像( type: bin )
画像サイズはhDstと同じ、チャネル数1であること。
マスク画像が不要な場合はNULLを指定する。
[in] bIsClearBack 処理対象画像の領域外になる画素の処理方法
  • TRUE 領域外になる画素は0クリア
  • FALSE 領域外になる画素は処理しない
[in] iSamplingMode 濃度補間方法
  • F_SAMPLING_NN 最近傍法により濃度補間を行う
  • F_SAMPLING_BILINEAR 共一次線形補間により濃度補間を行う
  • F_SAMPLING_CUBIC 三次畳み込み法により濃度補間を行う
戻り値:
F_ERR_NONE 正常終了
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_INVALID_IMAGE 不正な画像オブジェクトが入力された
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_geotrans_shift ( FHANDLE  hSrc,
FHANDLE  hDst,
FHANDLE  hMask,
DOUBLE  dX,
DOUBLE  dY,
INT  bIsClearBack,
INT  iSamplingMode 
)

画像の平行移動

処理対象画像を、パラメーター dX , dY で表される量だけ、平行移動します。 処理対象画像と結果画像のサイズは異なっていても構いません。 但し、処理対象画像と結果画像の型とチャネル数は同じでなければいけません。

入力座標と出力座標の関係は下式にて定義されます。

	dst.x = src.x + dX
	dst.y = src.y + dY
	

hMask に処理結果画像と同じサイズの2値画像を指定すると、出力画像中の有効画素を示す マスク画像を作成します。(マスク画像については 有効画素マスク画像 を参照してください) マスク画像 hMask の型はF_IMG_BINではなければいけません。 また、マスク画像の縦横サイズは結果画像同じで、チャネル数は1でなければなりません。 これらの条件が満たされない場合は、F_ERR_INVALID_IMAGEを返します。 マスク画像が必要ない場合は hMask にNULLを指定して下さい。

bIsClear は結果画像中の領域外になる画素(入力座標系での座標が処理対象画像の外側になる画素) の処理方法の指定です。領域外の画素の濃度値を0クリアする場合は bIsClear にTRUE を指定します。 結果画像の元の濃度値を維持する場合は、 FALSE を指定します。

iSamplingMode は濃度補間方法の指定です。以下の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 )
[out] hMask 処理結果画像の有効画素マスク画像( type: bin )
画像サイズはhDstと同じ、チャネル数1であること。
マスク画像が不要な場合はNULLを指定する。
[in] dX x軸方向移動量
[in] dY y軸方向移動量
[in] bIsClearBack 処理対象画像の領域外になる画素の処理方法
  • TRUE 領域外になる画素は0クリア
  • FALSE 領域外になる画素は処理しない
[in] iSamplingMode 濃度補間方法
  • F_SAMPLING_NN 最近傍法により濃度補間を行う
  • F_SAMPLING_BILINEAR 共一次線形補間により濃度補間を行う
  • F_SAMPLING_CUBIC 三次畳み込み法により濃度補間を行う
戻り値:
F_ERR_NONE 正常終了
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_INVALID_IMAGE 不正な画像オブジェクトが入力された
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
fvc06.png

入力画像

fie_img_geotrans_shift.png

処理結果画像

INT FVALGAPI fnFIE_img_mirror ( FHANDLE  hsrc,
FHANDLE  hdst,
INT  direc 
)

画像ミラー反転

画像のミラー反転を行います。

入力画像と出力画像は下記の条件を全て満たしていなければいけません。

  • 入力画像と出力画像の型、及びチャネル数が等しい事
  • 入力画像の幅と高さが出力画像と等しい事
引数:
[in] hsrc 入力画像ハンドル( type: bin, uc8, s16, us16, i32, ui32, i64, float, double, rgbq, rgbtri )
[out] hdst 出力画像ハンドル( type: bin, uc8, s16, us16, i32, ui32, i64, float, double, rgbq, rgbtri )
[in] direc 反転方向
  • 0 X軸方向(横方向)反転
  • 1 Y軸方向(縦方向)反転
  • 2 XY両方向反転
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像ハンドルが渡されたため、異常終了
F_ERR_INVALID_PARAM パラメータエラーにより異常終了
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
fvc06.png

入力画像

fie_img_geotrans_mirror.png

処理結果画像

INT FVALGAPI fnFIE_img_resize ( FHANDLE  hsrc,
FHANDLE  hdst 
)

画像のリサイズ

入力画像を出力画像のサイズに一致するようにリサイズします。 スケール変化率と濃度補間方法は画像サイズに応じて自動的に決定されます。

入力画像と出力画像の型、およびチャネル数は等しくなければなりません。

引数:
[in] hsrc 入力画像 (type: bin, uc8, s16, us16, double, rgbq)
[out] hdst 出力画像 (type: bin, uc8, s16, us16, double, rgbq)
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像が渡された
F_ERR_NOMEMORY メモリ不足により異常終了
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_img_transpose ( FHANDLE  hsrc,
FHANDLE  hdst 
)

画像転置

画像の転置を行います。 入力画像の濃度値をs, 出力画像の濃度値をdとすると、

d(x,y) = s(y,x)

となります。

2値画像の場合について
画像の型がF_IMG_BINだった場合、入力・出力双方の画像共に左上画素が32bit境界に有ると ( fnFIE_img_get_ch_binadrs() でアドレスを取得したときに bpos が0 ) 処理速度が速くなります。
入力画像と出力画像は下記の条件を全て満たしている必要があります。
  • 入力画像と出力画像の型、及びチャネル数が等しいこと
  • 出力画像の幅は入力画像の高さと等しい事
  • 出力画像の高さは入力画像の幅と等しい事
引数:
[in] hsrc 入力画像ハンドル( type: bin, uc8, s16, us16, double, rgbq )
[out] hdst 出力画像ハンドル( type: bin, uc8, s16, us16, double, rgbq )
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像ハンドルが渡されたため、異常終了
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
fvc06.png

入力画像

fie_img_geotrans_transpose.png

処理結果画像

INT FVALGAPI fnFIE_img_rotate_clockwise90 ( FHANDLE  hsrc,
FHANDLE  hdst,
INT  n 
)

画像の回転(90度の倍数)

処理対象画像 hsrc を、パラメーター n で示された回数に 90度時計回り方向で回転し、結果画像を hdst に出力します。 処理対象画像と結果画像のタイプ、及びチャネル数は同じでなければいけません。

結果画像のサイズは以下の条件を満たさなければなりません:

  • n が 2 の倍数の場合: 縦と横サイズが hsrc と同じ
  • n が 2 の倍数でない場合: 縦サイズは hsrc の横サイズ、そして横サイズが hsrc の縦サイズと同じ
引数:
[in] hsrc 処理対象画像( type: bin, uc8, s16, us16, i32, ui32, i64, double, float, rgbq, rgbtri )
[out] hdst 処理結果画像( type: bin, uc8, s16, us16, i32, ui32, i64, double, float, rgbq, rgbtri )
[in] n 何回90度回転するかを示す係数。負の値も指定可能です。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像オブジェクトが入力された
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
fie_img_rotate_clockwise90_0.png

入力画像

fie_img_rotate_clockwise90_2.png

処理結果画像 (n=2)

fie_img_rotate_clockwise90_1.png

処理結果画像 (n=1)

fie_img_rotate_clockwise90_3.png

処理結果画像 (n=3)


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