関数 | |
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_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 | ライセンスエラー、または未初期化エラー |
#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; }
![]() (a) | ![]() (b) | ![]() (c) |
//エラー処理は省略していますので、注意してください #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; }
![]() (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 の内容がコピーされます。 pRuns が hReg に関連づけられるわけではありません。 また、画素が重複したランが有ったり、ソートされていなかったりした場合でも 正しく処理可能です。
[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 | ライセンスエラー、または未初期化エラー |