ツール
[リージョン処理]


関数

INT FVALGAPI fnFIE_calc_nearest_pixel_region_excludes (FHANDLE hreg, FHANDLE hmap, INT mode)
 最も近いリージョン外のピクセル位置を格納した座標変換マップを作成
INT FVALGAPI fnFIE_region_fill (FHANDLE hSrcReg, FHANDLE *hDstReg)
 リージョンの穴を塗りつぶす処理
INT FVALGAPI fnFIE_region_includes_xy (FHANDLE hSrcReg, DOUBLE x, DOUBLE y, INT *result)
 リージョンが指定点を含むかの判定
INT FVALGAPI fnFIE_region_is_overlaped (FHANDLE hReg1, FHANDLE hReg2, INT *result)
 リージョン同士が重なりを持つかの判定
const F_RUNLENGTH *FVALGAPI fnFIE_region_get_runlength (FHANDLE hReg, UINT *uipNum)
 リージョンのラン配列のポインタを取得
INT FVALGAPI fnFIE_region_set_runlength (FHANDLE hReg, const F_RUNLENGTH *pRuns, UINT uiRunNum)
 リージョンオブジェクトのランレングスを設定する

関数

INT FVALGAPI fnFIE_calc_nearest_pixel_region_excludes ( FHANDLE  hreg,
FHANDLE  hmap,
INT  mode 
)

最も近いリージョン外のピクセル位置を格納した座標変換マップを作成

リージョン内の注目するピクセル位置から、リージョンに属さない最も近いピクセル位置を計算し、 マップ画像 hmap に出力します。マップ画像は、 fnFIE_geotrans_warpping() で利用されます。 リージョン外部では、自身のピクセル位置を出力します。

本関数を利用すると、リージョンの境界部分でもリージョン内の輝度値に影響されずにフィルタ処理を行う といったことが可能となります。詳細は、下記使用例を参照してください。

hmap には、画素タイプが F_IMG_DOUBLE または F_IMG_FLOAT 、チャネル数が2の画像オブジェクトを指定し ます。 hmap のチャネル0には、 x 座標、チャネル1には、 y 座標が出力されます。

距離定義は mode で指定します。距離定義の詳細は、 fnFIE_distance_transform() を参照してください。

引数:
[in] hreg 入力REGIONハンドル
[out] hmap マップ画像(type:float, double, channels:2)
[in] mode モード f_distance_transform_mode
  • F_DT_CITY_BLOCK 4近傍距離
  • F_DT_CHESS_BOARD 8近傍距離
  • F_DT_EUCLIDEAN_EXACT ユークリッド距離
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT 不正なオブジェクトハンドルが渡された
F_ERR_INVALID_IMAGE 不正な画像オブジェクトハンドルが渡された
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_CALC_IMPOSSIBLE 計算不可
  • マップ全体がリージョンに含まれる場合
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参考文献:
  • G. Borgefors, "Distance Transformations in Digital Images," Computer Vision, Graphics, and Image Processing, vol. 34, pp. 344-371, 1986.
  • C. R. Maurer, Rensheng Qi and V. Raghavan, "A linear time algorithm for computing exact Euclidean distance transforms of binary images in arbitrary dimensions," in IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 25, no. 2, pp. 265-270, Feb. 2003.

              

動作説明:
#include "fie.h"
/*
 本サンプルコードはfnFIE_calc_nearest_pixel_region_excludesの動作を説明する物です。

 まず正方形の画像を田の字のように4つの輝度で塗ります。その後中央に4つの輝度の場所をまたがるようなリージョンを生成します。
 このリージョンを構成する画素それぞれから最も近いリージョン外画素を計算し、座標変換マップを作成します。
 このマップをもとにリージョン内の画素を最も近いリージョン外画素の輝度で塗ります。

 出力はリージョンを書き込んだ入力画像とリージョンを塗った処理後画像です。
*/
VOID paint_region_with_outer_dens()
{
    INT     width = 200, height = 200;
    FHANDLE hsrc = NULL;
    FHANDLE hreg = NULL;
    FHANDLE hmap = NULL;
    FHANDLE hdst = NULL;
    PNT_T   offset = { 0, 0 };
    DOUBLE  val;
    DPNT_T  start;

    //画像の確保
    hsrc = fnFIE_img_root_alloc(F_IMG_UC8, 1, width, height);
    hmap = fnFIE_img_root_alloc(F_IMG_DOUBLE, 2, width, height);
    hdst = fnFIE_img_root_alloc(F_IMG_UC8, 1, width, height);

    //輝度の違う100x100のタイル4枚を繋げた正方形の画像を生成
    //濃度値と左上の座標を設定
    val = 0;
    start.x = 0;
    start.y = 0; 
    fnFIE_draw_rect(hsrc, &val, F_DRAW_FILL_IN, start, 100, 100, start, 0.0);

    //濃度値と左上の座標を設定
    val = 70;
    start.x = width / 2 + 1;
    start.y = height / 2 + 1;  
    fnFIE_draw_rect(hsrc, &val, F_DRAW_FILL_IN, start, 100, 100, start, 0.0);
    
    //濃度値と左上の座標を設定
    val = 140;
    start.x = width / 2 + 1;
    start.y = 0;               
    fnFIE_draw_rect(hsrc, &val, F_DRAW_FILL_IN, start, 100, 100, start, 0.0);
    
    //濃度値と左上の座標を設定
    val = 210;
    start.x = 0;
    start.y = height / 2 + 1; 
    fnFIE_draw_rect(hsrc, &val, F_DRAW_FILL_IN, start, 100, 100, start, 0.0);

    //画像の中心に±40画素の白いリージョンを書き込む
    start.x = width / 2 - 40;
    start.y = height / 2 - 40;
    hreg = fnFIE_create_region_rect(start.x, start.y, 80, 80);
    fnFIE_region_decode(hreg, hsrc, offset, 255);

    //リージョン外の最も近い画素を計算
    fnFIE_calc_nearest_pixel_region_excludes(hreg, hmap, F_DT_CITY_BLOCK);

    //最も近い画素の輝度値で、リージョン内の画素を塗り替える
    fnFIE_geotrans_warpping(hsrc, hmap, hdst, NULL, TRUE, F_SAMPLING_NN);

    //画像の保存
    fnFIE_save_png("src.png", hsrc, -1);
    fnFIE_save_png("dst.png", hdst, -1);

    // オブジェクトの解放
    fnFIE_free_object(hsrc);
    fnFIE_free_object(hmap);
    fnFIE_free_object(hreg);
    fnFIE_free_object(hdst);
}

INT main(VOID)
{
    // ライブラリのセットアップ
    fnFIE_setup();

    // 処理本体
    paint_region_with_outer_dens();

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

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

(a)

fie_calc_nearest_pix_reg_excludes_smp2_dst.png

(b)

fie_calc_nearest_pix_reg_excludes_smp2_exm.png

(c)

(a)入力画像。白の部分はリージョンとなっている。
(b)出力画像。リージョン部分が最も近いリージョン外画素の輝度値で塗られた状態になっている。
(c)参考画像。右側の赤線のように各画素が最も近い画素を参照して輝度値を獲得する。
  結果として左側に示すようにA⇒1,B⇒2,C⇒3,D⇒4のように輝度値を参照し、(b)に示す画像になる。

   

使用例:
//エラー処理は省略していますので、注意してください
#include "fie.h"

/*
リージョン内が高輝度な入力画像に対し、
fnFIE_calc_nearest_pixel_region_excludes,
fnFIE_geotrans_warpping
を行った後に、
平均化フィルタをかけ、元画像のリージョン部分を転送します。
このような処理により、リージョンの境界部分でも
高輝度部分の影響を受けずに平滑化処理を行うことができます。
*/
VOID average_filter_outside_region()
{
    INT width = 200, height = 200;
    FHANDLE hsrc = NULL;
    FHANDLE hmap = NULL;
    FHANDLE hdst = NULL;
    FHANDLE hcomp = NULL;
    FHANDLE hwork = NULL;
    FHANDLE hreg = NULL;
    FHANDLE hmask = NULL;
    DPNT_T center = { 100, 100 };
    PNT_T offset = { 0, 0 };

    // 画像の領域を確保
    hsrc = fnFIE_img_root_alloc(F_IMG_UC8, 1, width, height);
    hmap = fnFIE_img_root_alloc(F_IMG_DOUBLE, 2, width, height);
    hdst = fnFIE_img_root_alloc(F_IMG_UC8, 1, width, height);
    hcomp = fnFIE_img_root_alloc(F_IMG_UC8, 1, width, height);
    hmask = fnFIE_img_root_alloc(F_IMG_BIN, 1, width, height);
    hwork = fnFIE_img_root_alloc(F_IMG_UC8, 1, width, height);

    // 中心(100,100), 半径50の円形リージョンを作成
    hreg = fnFIE_create_region_circle(center, 50);

    // 入力画像の作成
    // ここでは、輝度100の一様な灰色の面に上記リージョンを輝度200で書き込み、ノイズを付加した画像を作成する
    fnFIE_img_clear(hwork, 100);
    fnFIE_region_decode(hreg, hwork, offset, 200);
    fnFIE_add_noise_uniform(hwork, hsrc, -40, 40, 0);
    
    // 最も近いリージョン外のピクセルを計算
    fnFIE_calc_nearest_pixel_region_excludes(hreg, hmap, F_DT_CITY_BLOCK);

    // 最も近いリージョン外のピクセルの輝度値を出力
    // リージョン外はそのまま
    fnFIE_geotrans_warpping(hsrc, hmap, hwork, NULL, TRUE, F_SAMPLING_NN);
    
    // 平均化フィルタ(15x15)をかける
    // 比較のため、元画像にそのままかけた画像も作成
    fnFIE_averageMxN(hwork, hdst, 15, 15, F_BORDER_CONTINUOUS, 0);
    fnFIE_averageMxN(hsrc, hcomp, 15, 15, F_BORDER_CONTINUOUS, 0);
    
    // リージョンをマスク画像に変換し、元画像をマスク転送
    fnFIE_img_clear(hmask, 0);
    fnFIE_region_decode(hreg, hmask, offset, 1);
    fnFIE_img_mask2(hsrc, hmask, hdst);
    fnFIE_img_mask2(hsrc, hmask, hcomp);
    
    // 作成した画像を保存
    fnFIE_save_png("src_img.png", hsrc, -1);
    fnFIE_save_png("dst_img.png", hdst, -1); 
    fnFIE_save_png("comp_img.png", hcomp, -1); 

    // オブジェクトの解放
    fnFIE_free_object(hsrc);
    fnFIE_free_object(hmap);
    fnFIE_free_object(hdst);
    fnFIE_free_object(hcomp);
    fnFIE_free_object(hwork);
    fnFIE_free_object(hreg);
    fnFIE_free_object(hmask);
}

INT main(VOID)
{
    // ライブラリのセットアップ
    fnFIE_setup();

    // 処理本体
    average_filter_outside_region();
    
    // ライブラリの終了処理
    fnFIE_teardown();
    
    return 0;
}
処理結果例:
fie_calc_nearest_pix_reg_excludes_smp_src.png

(a)

fie_calc_nearest_pix_reg_excludes_smp_dst.png

(b)

fie_calc_nearest_pix_reg_excludes_smp_comp.png

(c)

リージョン部分が高輝度な画像に対し、 fnFIE_calc_nearest_pixel_region_excludes()fnFIE_geotrans_warpping() を行った後に平均化フィルタをかけ、 元画像のリージョン部分を転送した結果。
(a)入力画像。円形のリージョン部分が高輝度。
(b)出力画像。リージョン周辺でも高輝度部分の影響を受けていない。
(c)比較画像。単に平均化フィルタをかけ、元画像のリージョン部分を転送することによって作成。 リージョン内の高輝度部分の影響で、その周辺の輝度値が上昇している。

INT FVALGAPI fnFIE_region_fill ( FHANDLE  hSrcReg,
FHANDLE *  hDstReg 
)

リージョンの穴を塗りつぶす処理

本関数は入力リージョン中の穴を塗りつぶす処理を行います。 処理結果リージョンは出力リージョン hDstReg として渡します。

入力リージョンのラン数がゼロの場合は出力リージョンのランもゼロとなり、エラーになりません。 出力リージョンのハンドルはNULLなら新たにリージョン対象のハンドルを作ります。 入力と出力リージョンは同じハンドルでも処理を可能です。

引数:
[in] hSrcReg 入力リージョン
[out] hDstReg 出力リージョン
戻り値:
F_ERR_NONE 正常終了
F_ERR_NOMEMORY メモリ不足で異常終了した
F_ERR_INVALID_PARAM 不正なハンドルが渡された、またリージョンの横サイズは65535以上にあるため、異常終了した
F_ERR_INVALID_OBJECT 入力ハンドルはリージョン対象のハンドルではない
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_region_includes_xy ( FHANDLE  hSrcReg,
DOUBLE  x,
DOUBLE  y,
INT *  result 
)

リージョンが指定点を含むかの判定

指定した座標点が、指定したリージョンの内部に含まれるかを判定します。 座標点が含まれるか、含まれないかの結果が result に設定されます。

指定した座標点がリージョンの接点となっている場合、つまりリージョンの境界点を 示していた場合は、リージョンに含まれると判定します。

エラー発生時には、 result の値は変更されません。

引数:
[in] hSrcReg 入力リージョン
[in] x 判定をしたい点のx座標
[in] y 判定をしたい点のy座標
[out] result 判定結果 座標点は含まれている==1, 座標点は含まれていない==0
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM 入力に渡されたパラメータが無効、または不正なため異常終了
F_ERR_INVALID_OBJECT 渡された入力ハンドルが不正なため、異常終了
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_region_is_overlaped ( FHANDLE  hReg1,
FHANDLE  hReg2,
INT *  result 
)

リージョン同士が重なりを持つかの判定

指定したリージョンが、もう一方のリージョンと重なりを持つかを判定します。 重なりを持つか、持たないかの結果が result に設定されます。

指定した二つのリージョンが接している場合は、重なりを持っていないと判定します。

エラー発生時には、 result の値は変更されません。

引数:
[in] hReg1 判定するリージョン1
[in] hReg2 判定するリージョン2
[out] result 判定結果 重なりを持つ==1, 重なりを持たない==0
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM 入力に渡されたパラメータが無効、または不正なため異常終了
F_ERR_INVALID_OBJECT 渡された入力ハンドルが不正なため、異常終了
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

const F_RUNLENGTH* FVALGAPI fnFIE_region_get_runlength ( FHANDLE  hReg,
UINT *  uipNum 
)

リージョンのラン配列のポインタを取得

リージョンオブジェクトが保持しているのラン配列を取得します。 ラン配列の先頭ポインタが返値に、配列要素数が uipNum にて返されます。 取得されるラン配列はリージョンオブジェクトがメモリ管理を行っているため、 変更することはできません。

引数:
[in] hReg 入力リージョン
[out] uipNum リージョンのラン配列中のランの数
戻り値:
ラン配列のポインタ 正常終了
NULL 異常終了
  • 不正なハンドルが渡された
  • リージョンのラン配列自身が空配列
  • ライセンスエラー
  • 未初期化エラー

INT FVALGAPI fnFIE_region_set_runlength ( FHANDLE  hReg,
const F_RUNLENGTH pRuns,
UINT  uiRunNum 
)

リージョンオブジェクトのランレングスを設定する

既存のリージョンオブジェクト hReg のランレングスを設定します。 hReg には入力ラン pRuns の内容がコピーされます。 pRunshReg に関連づけられるわけではありません。 また、画素が重複したランが有ったり、ソートされていなかったりした場合でも 正しく処理可能です。

引数:
[in,out] hReg 入力/出力リージョン
[in] pRuns ラン配列のポインタ
[in] uiRunNum 配列中のランの数
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM 不正なハンドルが渡されたため、異常終了した
F_ERR_INVALID_OBJECT 入力ハンドルがリージョン対象のハンドルではないため、異常終了した
F_ERR_NOMEMORY メモリー不足
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー


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